SQL문을 보다가 갑자기 dbms_sql.open_cursor라는 놈이 튀어나와서 뭔지 몰라 찾아보니 동적 SQL패키지 란다.
말하자면 진행중인 프로세스 안에서 쿼리를 실행하고... execute할 수 있는 기능이다.
예를 들면 PL/SQL에서
result integer;
cur integer;
dml varchar2(20000);
이렇게 변수선언을 하고
dml에는 sql문을 넣어준 다음에
cur := dbms_sql.open_cursor; 이렇게 커서 선언을 하고
dbms_sql.parse(cur, dml, dbms_sql.native); 이렇게 parssing을 하고
result := dbms_sql.execute(cur); 이렇게 execute 결과를 반환해주고
dbms_sql.close_cursor(cur); 사용후에는 닫아준다.
패키지의 자세한 구조는 다음과 같다.
단계 1 - 커서를 오픈한다. (OPEN_CURSOR)
단계 2 - 문장을 파스한다. (PARSE)
단계 3 - 입력변수를 연결한다. (BIND_VARIABLE)
단계 4 - 출력변수를 정의한다. (DEFINE_COLUMN)
단계 5 - 쿼리를 실행한다. (EXECUTE)
단계 6 - 행을 인출한다. (FETCH_ROWS)
단계 7 - 결과를 PL/SQL 변수에 반환한다. (COLUMN_VALUE)
단계 8 - 커서를 닫는다. (CLOSE_CURSOR)
패키지 구조를 더 자세히 알아보면
- FUNCTION OPEN_CURSOR : SQL문의 실행에 필요한 새로운 CURSOR를 열고 CURSOR ID number를 반환 한다.
- FUNCTION IS_OPEN : 주어진 CURSOR가 현재 open되어 있으면 TRUE를, 아니면 FALSE를 반환 한다.
- PROCEDURE PARSE : statement를 check하고 CURSOR와 결합시킨다.
- PROCEDURE DEFINE_COLUMN : CURSOR로부터 SELECT된 COLUMN의 값을 받는 변수를 지정한다.
- FUNCTION EXECUTE : SQL문을 실행하고 처리된 ROW의 수를 반환 한다. (INSERT, UPDATE, DELETE인 경우에만 해당)
- FUNCTION FETCH_ROWS : CURSOR로부터 ROW를 FETCH하고 실제로 FETCH된 ROW의 수를 반환 한다. 이 ROW들은 BUFFER에 들어가며, column_value를 호출하여 읽어 들여야 한다.
- FUNCTION EXECUTE_AND_FETCH : EXECUTE와 FETCH ROW를 동시에 수행하고 실제로 FETCH된 ROW의 수를 반환 한다.
- PROCEDURE VARIABLE_VALUE : 주어진 변수의 값을 반환 한다.
- PROCEDURE COLUMN_VALUE : FETCH_ROWs에 의해 FETCH된 data의 값을 반환 한다.
- PROCEDURE CLOSE_CURSOR : CURSOR를 닫는다.
참고 사이트:
http://www.gurubee.net/lecture/1146
http://blog.naver.com/xxsaintxx/20150740027