본문 바로가기

카테고리 없음

ORACLE 9i DBMS_OUTPUT v1.0

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개는 들어가야 할 것 같지만 실제로 그렇게 딱 맞아 떨어지진 않는다. 이 값들 말고도 다른 데이터가 같이 들어가는 듯 하다.