개발자/Database

DBMS_SQL 패키지 - 동적 SQL

SaintPark 2015. 8. 4. 11:30

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