[펌] PL/SQL 04

프로그래밍/DB 2007. 11. 27. 14:11 Posted by galad
출처 블로그 > 행운의 별자리님의 블로그
원본 http://blog.naver.com/kwakjt/26877522

1. PL/SQL에서 SQL문장
  - SQL에 있는 DML, 트랜잭션 제어 명령 지원.
  - SELECT 명령어를 사용하여 database에서 한 행의 데이터를 추출.
  - 값은 단일 집합만 리턴될 수 있고 Into절을 이용하여 변수에 값을 할당.
  - DML 명령어를 사용하여 database의 다중 행에 대한 변경 가능.
  - COMMIT, ROLLBACK 명령어로 transaction을 제어함.
  - 암시적인 커서속성으로 DML 결과를 결정함.
    (SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND, SQL%ISOPEN)
  - PL/SQL은 DDL(CREATE, ALTER, DROP TABLE), DCL(GRANT, REVOKE)을 지원하지 않음.

 

2. PL/SQL에서 SELECT문장
  - Database에서 SELECT로 단일행의 data를 읽어들임.

  - SELECT  select_list
     INTO    {variable_name [, variable_name] | record_name}
    FROM    table
    WHERE   condition;

  - SQL의 SELECT 문장에 대한 모든 구문형식을 이용가능.
  - 호스트(바인드) 변수는 콜론으로 접두어를 붙여야 함.
    :v_variable_name

  - INTO절은 필수, SELECT절에서 SQL이 리턴하는 값을 저장하기 위한 변수의 이름을 지정.
  - SELECT절에서 선택된 각 항목당 하나의 변수를 INTO절에 지정해야 하며 순서도 일치.

  - 질의는 하나의 행만 리턴해야 하며 둘 또는 그 이상의 행 또는 행이 없이 리턴되면 에러 발생.
  - PL/SQL은 NO_DATA_FOUND 와 TOO_MANY_ROWS 예외로 블록의 예외 section에서 추적할 수 있는 표준 예외를 조성하여 이 에러를 처리할 수 있음.

 

  - TOO_MANY_ROWS 발생 예 :
  SQL> variable dept number
  SQL> variable salary number
  SQL> ed two_rows


  declare
     v_sum_sal  emp.sal%Type;
     v_deptno    emp.deptno%Type;
  Begin
     select deptno, sum(sal)
     into   v_deptno, v_sum_sal
     from   emp
     group by deptno;
     :salary := v_sum_sal;
     :dept   := v_deptno;
  End;
  /


  SQL>  @two_rows
  1행에 오류:
  ORA-01422: 실제 인출은 요구된 것보다 많은 수의 행을 추출합니다
  ORA-06512: 줄 5에서

 

3. PL/SQL에서 데이터 검색위한 지침
  - Semicolon(;) 으로 개별 SQL 문장을 종료하기.
  - SELECT 문장이 PL/SQL 안에 내장될 때
    INTO절 사용.
    WHERE 절은 선택적.
  - SELECT 절에서의 column과 INTO절에서 출력변수의 수를 동일하게 선언해야 하고 위치상으로 대응되며, datatype은 일치해야 함.
  - 동적으로 %TYPE, %ROWTYPE 사용.
  - SUM같은 그룹함수는 SQL문장에서는 사용가능하지만 PL/SQL 구문에 사용 못함

 

4. PL/SQL에서 INSERT


  DECLARE
    v_empno emp.empno%TYPE;
  BEGIN
     SELECT  empno_sequence.NEXTVAL
     INTO v_empno
     FROM dual;

     INSERT INTO emp(empno, ename, job, depno)
     VALUES (v_empno, 'HARDING', 'CLERK', 10 );
  END ;
  /

 

5. PL/SQL에서 UPDATE


  DECLARE
     v_sal_increase emp.sal%TYPE  :=  2000 ;
  BEGIN
     UPDATE  emp
 SET  sal = sal  + v_sal_increase
       WHERE  job = 'ANALYST';
  END ;
  /

 

6. PL/SQL에서 DELETE


  DECLARE
     v_deptno  emp.deptno%TYPE  :=  10 ;
  BEGIN
     DELETE     FROM  emp
     WHERE              deptno = v_deptno ;
  END ;
  /

 

7. 암시적 커서
  - 암시적 커서의 속성을 이용하여, SQL 문장의 결과를 테스트할 수 있음. 
  - 암시적 커서 4가지 속성
     SQL%ROWCOUNT : 가장 최근의 SQL문장에 의해 영향을 받은 행의 수(정수값)
     SQL%FOUND    : 가장 최근의 SQL문장이 하나 또는 그 이상의 행에 영향을 미친 다면 BOOLEAN 속성은TRUE로 평가됨
     SQL%NOTFOUND : 가장 최근의 SQL문장이 어떤 행에도 영향을 미치지 않는다면 BOOLEAN속성은TRUE로 평가됨
     SQL%ISOPEN   : PL/SQL이 실행된 후에 즉시 암시적으로 커서를 닫으므로 항상 FALSE로 평가됨

  - 암시적 커서 사용 예 :
   SQL>VARIABLE  rows_deleted  Varchar2(100)


   DECLARE
     v_ordid  NUMBER := 605 ;
   BEGIN
     DELETE    FROM    item
     WHERE    ordid = v_ordid  ;

     :rows_deleted := SQL%ROWCOUNT ||' rows deleted.');
   END ;
   /

'프로그래밍 > DB' 카테고리의 다른 글

07 PL/SQL  (0) 2007.11.27
[펌] PL/SQL 05  (0) 2007.11.27
[펌] PL/SQL 03  (0) 2007.11.27
[펌] PL/SQL 02  (0) 2007.11.27
[Oracle/펌] PL/SQL 01  (0) 2007.11.27