2012-10-22 3 views
0

.sql 파일 내에 두 개의 코드 블록이 있습니다. 한 블록은 함수이고 다른 블록은 프로 시저입니다. 첫 번째 블록에서 쿼리를 실행하고 화면에 출력합니다 (각 행에 대해 DBMS_OUTPUT.PUT_LINE()을 사용하고 있습니다). 그런 다음 프로 시저에는 동일한 라인에 인쇄해야하는 다른 쿼리가 있습니다 (저는 DBMS_OUTPUT.PUT()을 사용하고 있습니다). 두 번째 블록에 DBMS_OUTPUT.PUT()을 사용하면 어떤 이유로 첫 번째 블록이 망가지며 첫 번째 블록은 결코 인쇄되지 않습니다. http://pastebin.com/z29emmBJ가 (코드의 관련 부분은 라인 주위 : 97-103) 나는 DBMS_OUTPUT.PUT_LINE() 프로 시저의 내부에 사용하고있을 때PL/SQL을 올바르게 출력하는 방법

이 모든 것이 제대로 표시 여기

코드에 대한 링크입니다 ,하지만 프로 시저 안에 DBMS_OUTPUT.PUT()있을 때 함수를 결코 호출 된 것처럼 보입니다. 여기 http://i.imgur.com/AnCv9.png 출력이 단지) (PUT과 같은 모습입니다 : 여기

출력이) PUT_LINE (로 보이는 무엇 http://i.imgur.com/Jv3SV.png

을 나는 그것이 버퍼 크기 함께 할 수있는 뭔가가 있다고 생각하지만, 난 확실하지 않은 무엇/왜.

도움이 될 것입니다.

+0

루프 뒤에 DBMS_OUTPUT.NEW_LINE();을 추가하려고 했습니까? 나는'DBMS_OUTPUT.PUT()'명령을 모두 마친 후에야합니까? –

답변

3

필요에 따라 VARCHAR2 변수에 결과를 추가 한 다음 행이 완료되면 그 문자열을 put_line에 넣지 않는 이유는 무엇입니까? 이렇게하면 서식을 제어 할 수 있습니다. 세컨드 저장 프로 시저의 코드

+0

좋은 생각입니다. 처음에는 그렇게 생각하지 않기 때문에 어리 석다. 감사!할당은 기본적으로 삼각형을 구축하기 위해 우리를 원하기 때문에 가 내가 밖에서 그것을 넣어 수 없습니다, 그래서 그것은과 같습니다 : 1 행 (\ n)도 2 행, 행 응답의 첫 번째 부분에 대한 –

1

발췌문 :

FOR player IN rows LOOP 
    currentCount := maxCount; 
    DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' '); 
    --DBMS_OUTPUT.NEW_LINE(); 
END LOOP; 

당신이 결과 출력하면 (루프 후) 루프 외부 DBMS_OUTPUT.NEW_LINE() 이동해야 한 라인으로 등장합니다.

FOR player IN rows LOOP 
    currentCount := maxCount; 
    DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');   
END LOOP; 
DBMS_OUTPUT.NEW_LINE(); 

방금 ​​DBMS_OUTPUT.PUT_LINE 절차를 모방 DBMS_OUTPUT.PUT 후 루프 내에서 DBMS_OUTPUT.NEW_LINE(); 유지 : 같은 코드가 보일 것이다. 코드에서

SQL> create or replace procedure output1 
    2 is 
    3 l_str varchar2(100); 
    4 l_status number; 
    5 begin 
    6 for i in 1..7 
    7 loop 
    8  dbms_output.put('Text_' || To_char(i)); 
    9  dbms_output.new_line; 
10 end loop; 
11 end; 
12/

Procedure created 

SQL> 
SQL> create or replace procedure output2 
    2 is 
    3 l_str varchar2(100); 
    4 l_status number; 
    5 begin 
    6 for i in 1..7 
    7 loop 
    8  dbms_output.put('Text_' || To_char(i)); 
    9  end loop; 
10  dbms_output.new_line; 
11 end; 
12/

Procedure created 

SQL> exec output1; 

Text_1 
Text_2 
Text_3 
Text_4 
Text_5 
Text_6 
Text_7 

PL/SQL procedure successfully completed 

SQL> exec output2; 

Text_1Text_2Text_3Text_4Text_5Text_6Text_7 

PL/SQL procedure successfully completed 

: serveroutput 옵션을 사용

SET serveroutput ON size 32000; 

REM Change output file name TO proj3-NetID.OUT! 
SPOOL proj3-hgeorge3.OUT; 
exec DBMS_OUTPUT.enable('100000000'); 

경우 (ON으로 설정)는 다음 DBMS_OUTPUT.enable 프로 시저를 호출의 필요가 없습니다. DBMS_OUTPUT.enable을 호출하면 숫자 데이터 형식의 값을 문자열이 아닌 매개 변수로 전달해야합니다. 그렇습니다. 암시 적으로 데이터 형식을 변환하지만 피하는 것이 좋습니다. 버퍼의 최대 크기는 1 백만입니다.

+0

3 (\ n)도 4 행, 5 행, 6 행 (\ n)도 열 7 행 8 9 행, 10 행 (\ n)도 행 11, 13 행, 12 행, 14 행 (\ n) 등 –

관련 문제