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 ; /
|