게시일: Dec 28, 2011 11:32:41 PM
- NATIVE 동적 쿼리 (EXECUTE IMMEDIATE을 사용한 동적 쿼리)
: PL/SQL 형태로 사용
: EXECUTE IMMEDIATE 문장을 사용하여 실행
declare
sCreateSqlText varchar2(1000);
sColValue varchar2(100);
sInsertSqlText varchar2(1000);
begin
-- temp_table1 생성
EXECUTE IMMEDIATE 'create table temp_table1 ( p_name varchar2(100) )';
-- temp_table2 생성
sCreateSqlText := 'create table temp_table2 ( p_name varchar2(100) )';
EXECUTE IMMEDIATE sCreateSqlText;
-- temp_table1에 데이터 입력
EXECUTE IMMEDIATE 'insert into temp_table1 values ('||'''이도'''||')';
-- temp_table2에 데이터 입력 (바인드 변수 사용)
sColValue := '무휼';
sInsertSqlText := 'insert into temp_table2 values (:1)';
EXECUTE IMMEDIATE sInsertSqlText USING sColValue;
commit;
end;
- DBMS_SQL 패키지를 사용한 동적 쿼리
declare
sReturnValue integer;
sColValue varchar2(100);
sInsertSqlText varchar2(1000);
begin
-- temp_table2에 데이터 입력
sColValue := '장길산';
sInsertSqlText := 'insert into temp_table2 values (:1)';
-- 커서 오픈
cur1 := DBMS_SQL.OPEN_CURSOR;
-- 파싱
DBMS_SQL.PARSE( cur1, sInsertSqlText, DBMS_SQL.NATIVE );
-- 바인드변수와 실제 값을 연결
DBMS_SQL.BIND_VARIABLE( cur1, ':1', sColValue );
--DBMS_SQL.BIND_VARIABLE( cur1, ':2', sColValue2 ); -- 만약 아래와 같이 2개의 컬럼이 있는 테이블에 insert를 한다면...
-- sInsertSqlText := 'insert into temp_table2 values (:1, :2)';
-- 쿼리 실행
sReturnValue := DBMS_SQL.EXECUTE( cur1 );
-- 커서 닫기
DBMS_SQL.CLOSE_CURSOR( cur1 );
commit;
end;
- NATIVE 동적 쿼리와 DBMS_SQL 패키지를 사용한 동적 쿼리의 비교
NATIVE 동적 쿼리
동적 쿼리의 문자열 크기가 32KB를 넘을 수 없다.
DBMS_SQL 패키지보다 1.5 ~ 3배 빠르다.
사용자 정의 데이터 타입을 사용할 수 있다.
커서를 정의하여 레코드(RECORD) 타입 변수에 쿼리 결과를 할당할 수 있다.
동일한 쿼리 문장을 여러 번 실행할 때마다 파싱 작업이 수행된다.
DBMS_SQL 패키지를 사용한 동적쿼리
동적 쿼리의 문자열 크기가 32KB 이상인 경우에 사용할 수 있다.
클라이언트-사이드 프로그램에서 RPC(Remote Procedure Call)를 사용하여 동적 쿼리 사용 가능하다.
SQL에서 DESCRIBE(DESC) 명령어와 같은 기능을 수행하는 DESCRIBE_COLUMNS 프로시저를 사용하여, 파싱되고 오픈된 커서에 대한 컬럼 정보를 참조할 수 있다.
동일한 쿼리 문장을 여러 번 실행할 경우 단 한 번만 파싱한다.
==> 쿼리 문장 길이가 길거나, 동일한 문장을 여러 번 실행해야 할 경우에는 DBMS_SQL 패키지를 사용하고,
그 외에는 NATIVE 동적 쿼리를 사용하면 될 것 같다.