'10.02.04 story DataBase이야기2010. 4. 1. 13:26
성능측면에서, 모든 문장이 한번만 파싱되어 수행한다면 EXECUTE IMMEDIATE는 DBMS_SQL보다 우수할 것이다.
왜냐하면 DBMS_SQL은 이런한 측면에서 비용이 더 많이 들기 때문이다.
EXECUTE IMMEDIATE는 한 프로시저로 이루어지지만 DBMS_SQL은 한 작업을 위해서 약 5개의 프로시저를 호출해야 하기 떄문....
그러나 파싱된 문장을 계속해서 실행할 경우 DBMS_SQL이 더 우수한 성능을 발휘한다.
EXECUTE_IMMEDIATE는 파싱될 문장을 재사용할 방법이 없다.
항상 파싱이 필요하고, 반복된 파싱에 의한 비용이 DBMS_SQL과 비교하여 적은 프로시저 호출로 인한 이득을 능가하게 된다. 이는 다중 사용자 환경과 연관된다.(다중 사용자 환경은 절대로 한번 파싱에 한번 실행은 없다) 마지막으로 EXECUTE IMMEDIATE나 OPEN은 DBMS_SQL처럼 쉽게 배열 처리를 사용할 수 없으며, 이는 DBMS_SQL에게는 강력한 이점이 된다
동적으로 질의를 처리하는 의사코드
1) 커서를 열어라 -- l_cursor integer default DBMS_SQL.OPEN_CURSOR;
2) 파싱하라 -- dbms_sql.parse(l_cursor, l_query, DBMS_SQL.NATIVE );
3) 묘사하라 -- DBMS_SQL.DESCRIBE_COLUMNS(L_CURSOR, L_COLcnt,l_descTBL);
4) 쿼리문에 있었던 바인드 변수/값을 채워 넣어라 -- DBMS_sql.bind_variable(l_cursor, ':bv1', p_value1);
5) I번째 열을 정의하라 오라클에게 어떤 유형의 변수로 인출할 것인지를 말하라
이 경우에는 모든 데이터가 하나의 varchar2(4000) 변수로 인출된다.
-- for I in 1.. l_COLCNT loop
dbms_sql.define_column(l_cursor, I, l_columnValue, 4000);
end loop;
6) 질의문을 수행하라. DML문의 경우에 영향받은 행의 수 저장 -- l_status := DBMS_sql.execute(l_cursor);
7) 모든 행들을 인출하라. -- while(DBMS_SQL.FETCH_ROWS(l_cursor) > 0) loop
8) 열의 데이터들을 가져와서 처리하라 --
for I in 1 .. l_COLCNT LOOP
DBMS_Sql.column_value(l_cursor, I , l_columnValue);
end loop
DBMS_OUTPUT.PUT_LINE(l_columnValue);
9) 커서를 닫는다. -- dbms_sql.close_cursor(l_cursor);10) 예외를 선언한다 -- Exception when others then DBMS_SQL.Close_cursor(l_Cursor);
'DataBase이야기' 카테고리의 다른 글
'03.03.05 story (0) | 2010.04.01 |
---|---|
'10.03.03 story (0) | 2010.04.01 |
'10.03.02 story (0) | 2010.04.01 |
'10.02.06 story (0) | 2010.04.01 |
'10.02.05 story (0) | 2010.04.01 |