달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'DataBase이야기'에 해당되는 글 24

  1. 2010.04.01 '10.02.04 story
2010. 4. 1. 13:26

'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
:
Posted by НooпeУ


Code Start Code End