ORACLE 9i DBMS_OUTPUT
from Beginning Oracle Programming | 정보문화사
1.
DBMS_OUTPUT
PL/SQL 루틴에서
클라이언트로 텍스트 메시지를 보낼 때 사용됨
라인당 255개까지의 문자를 사용할 수 있다.
버퍼크기는 2,000 에서
1,000,000 까지 사용할 수 있으며 기본값은 20,000 이다.
2.
DBMS_OUTPUT 의 메소드
A.
DISABLE 캐시의 내용을 비운다.(삭제)
B.
ENABLE
C.
NEW_LINE PUT 과 NEW_LINE 을 사용하면 PUT_LINE 과 동일하다. NEWLINE을 사용하지 않고 PUT 만을 사용하면 메시지가 출력되지않는다. (CACHED 상태임)
D.
PUT
E.
PUT_LINE PUT 과 달리 메시지 끝에 새로운 라인문자를 추가
F.
GET_LINE
G.
GET_LINES
3.
DBMS_OUTPUT TEST
A.
라인당 255개의 문자
다음과 같은 쿼리를 수행하면 한줄 출력값에 대한 에러가
난다. 이 에러는
set serveroutput
off 인 경우 확인되지 않는다.
SQL> !cat tmp1.sql
set serveroutput off
declare
l_char1 char(255) := 'a';
l_char2 char(255) := 'A';
begin
dbms_output.put_line(l_char1);
dbms_output.put_line(l_char2);
end;
/
SQL> @tmp1
PL/SQL procedure successfully
completed.
set serveroutput 을 on 으로
변경 후 재실행
SQL> @tmp1
a
A
PL/SQL procedure successfully
completed.
l_char2 의 char 길이값을 256으로 변경한 후 실행
SQL> @tmp1
a
declare
*
ERROR at line 1:
ORA-20000: ORU-10028: line length
overflow, limit of 255 chars per line
ORA-06512: at
"SYS.DBMS_OUTPUT", line 35
ORA-06512: at
"SYS.DBMS_OUTPUT", line 133
ORA-06512: at line 7
B.
(DEFAULT) 버퍼크기 확인
SQL> !cat tmp1.sql
set serveroutput on
declare
l_char1 char(200) := 'a';
begin
dbms_output.disable;
dbms_output.enable;
for i in 1..100 loop
dbms_output.put_line(l_char1);
end loop;
end;
/
SQL> @tmp1
a
a
(중략)
a
a
declare
*
ERROR at line 1:
ORA-20000:
ORU-10027: buffer overflow, limit of 20000 bytes
ORA-06512: at
"SYS.DBMS_OUTPUT", line 35
ORA-06512: at
"SYS.DBMS_OUTPUT", line 198
ORA-06512: at
"SYS.DBMS_OUTPUT", line 139
ORA-06512: at line 7
위에서 PUT 대신 PUT_LINE 을 사용한 이유는 PUT을 이용하면 한 라인에서 계속
수행이 되기 때문에 전체 버퍼사이즈를 확인하기 전에 라인사이즈
리미트에서
에러가 난다.
dbms_output.enable 부분을 dbms_output.enable(200000) 바꿔
실행하면 에러없이
실행된다. 괄호안의
수는 버퍼의 크기를 지정하는 부분으로 2,000 에서 1,000,000
사이의 값을 사용하면 된다.
C.
BUFFER 공간 사용에
대한 관찰
set serveroutput on
declare
l_char1 char(200) := 'a';
begin
dbms_output.disable;
dbms_output.enable;
for i in 1..90 loop
dbms_output.put_line(l_char1);
end loop;
end;
/
위의 LOOP 값을
보면 90 으로 지정했다. 위 값은 100에서 나오는 에러를 없애기 위해
하나씩 줄여나간 값이다.
20,000 이 버퍼 기본 크기이니 200 바이트를 가지는 값이 100개는 들어가야 할 것 같지만 실제로 그렇게 딱 맞아 떨어지진 않는다. 이
값들 말고도 다른 데이터가 같이 들어가는 듯 하다.