ORACLE DBMS_SQL #1
from Beginning Oracle Programming | 정보문화사
1.
ORACLE DBMS_SQL
8i 이전엔 동적 SQL을 만드는 유일한 방법이었다고 함. 현재는 EXECUTE IMMEDIATE 를 사용해 동적인 SQL을 실행하는게
가능해졌다.
2.
DBMS_SQL 의
실행흐름
A.
OPEN
CURSOR
B.
EVALUATE
SYNTAX, SEMANTICS
C.
BINDING
(OPTIONAL)
D.
EXECUTE
E.
RETURN
RESULTS
F.
CLOSE
CURSOR
RESULT는 수행되는 SQL문이 QUERY인가 아닌가에 따라 내용이 다르다.
QUERY가 아닌
경우 리턴된 값을 로컬 변수에 연결하며
(UPDATE 경우를
생각하면 몇 개의 행이 UPDATE 되었다 란 내용)
QUERY인 경우
결과 값을 로컬 저장공간에 저장한다.
SQL 의 수행을 PARSE (BIND) EXECUTE FETCH 로 생각했을 때 위의 흐름 역시
SQL 수행 흐름과
동일하게 볼 수 있다.
3.
BIND_VARIABLE() 과 BIND_ARRAY()
두 메소드의 차이는 BIND를 한번에 하느냐 마느냐란 차이다.
<<BIND_VARIABLE() 의 경우>>
declare
l_cursor number :=
dbms_sql.open_cursor;
l_ignore number;
begin
dbms_sql.parse(l_cursor,'select /*+ ###
*/ :a,:b from dual',dbms_sql.native);
--start
binding1
dbms_sql.bind_variable(l_cursor,':A',1);
dbms_sql.bind_variable(l_cursor,':B','Hello');
--end
binding1
l_ignore := dbms_sql.execute(l_cursor);
--start
binding2
dbms_sql.bind_variable(l_cursor,':A',2);
dbms_sql.bind_variable(l_cursor,':B','Hi');
--end
binding2
l_ignore := dbms_sql.execute(l_cursor);
dbms_sql.close_cursor(l_cursor);
end;
/
<<BIND_ARRAY() 의 경우>>
declare
l_cursor number := dbms_sql.open_cursor;
l_ignore number;
--bind_variable()
l_num
dbms_sql.number_table;
l_var
dbms_sql.varchar2_table;
begin
dbms_sql.parse(l_cursor,'select /*+ ### */ :a,:b from
dual',dbms_sql.native);
--start
integrated binding
l_num(1) := 1;
l_num(2) := 2;
l_var(1) := 'Hello';
l_var(2) := 'Hi';
dbms_sql.bind_array(l_cursor, ':A',l_num);
dbms_sql.bind_array(l_cursor, ':B',l_var);
--end
integrated binding
l_ignore := dbms_sql.execute(l_cursor);
dbms_sql.close_cursor(l_cursor);
end;
/
4.
DBMS_SQL 의 METHOD 설명
뒤늦게 설명을 하게 되었지만 실질적인 예(위의…)를 가지고 이야기 하는게 쉽다.
위의 (익명)프로시저는
에러없이 정상적인 수행이 가능했고 이가 의미하는 바는
최소한의 필수적인 내용이 다 들어가 있다는 것과 동일하다.
/*+ 필수적인 내용이
무엇인지 확인… */
A.
OPEN_CURSOR
작업영역을 지정.
B.
PARSE(
CURSOR, SQL_QUERY, LANGUAGE_FLAG)
LANGUAGE_FLAG 는 ORACLE 이 SQL 구문을 다룰 방법을 지정하는
것
-
DBMS_SQL.V6
-
DBMS_SQL.V7
-
DBMS_SQL.NATIVE
로 지정 가능 /*+ 차이에 대해 내용추가 */
C.
BIND_VARIABLE(
CURSOR, BIND_NAME, REAL_VALUE ) (optional)
BIND_NAME 은 대문자로 대응된다.
D.
BIND_ARRAY(
CURSOR, BIND_NAME, VALUE_TABLE ) (optional)
DECLARE 부분을
보면 NUMBER_TABLE 과 VARCHAR2_TABLE 을
사용한 것을
볼 수 있다. 이 밖에도 데이터 타입별로 TABLE 이 구비되어있고 BIND_ARRAY에
DECLARE 절에
정의했던 테이블 변수를 입력값으로 사용하게 된다.
E.
EXECUTE(
CURSOR )
커서를 실행한다. INSERT, UPDATE, DELETE 의
경우 결과값 몇 개의 행이 ???
되었다란 결과를 출력하고 QUERY의 경우 0이 반환된다.
F.
CLOSE_CURSOR(
CURSOR)
CURSOR를 CLOSE