2016-08-24 4 views
0

일부 레코드를 처리하는 동안 프로그램이 진행될 때 출력을보고 싶습니다. 라인을 읽는 것은 도움이되지 않습니다. 단지 버퍼에서 가져온 것이므로 다른 것은 없습니다. 예를 들면 :매 반복마다 호출 될 때마다 내용을 한 줄씩 출력하도록 dbms_output.put_line()을 찾는 방법은 무엇입니까?

DECLARE 
    CURSOR cEmploee IS SELECT * FROM g_emploees; 
    iTotal INTEGER := 0; 
    iCount INTEGER := 0; 
BEGIN 
    SELECT COUNT(*) FROM g_emploees INTO iTotal; 
    FOR rLine IN cEmploee loop 
    dbms_output.put_line('Porcessed['||rLine.id||']: '|| ((iCount/iTotal)*100) || '%') 
    iCount := iCount + 1; 
    END LOOP; 
END; 
  1. 내가 dbms_output.get_line()를 사용, 그래서 대답 표시 멈출 수 없다!
  2. 읽기 전용으로 출력을 파일로 파이프 할 수 없습니다!

처리 된 %를보고 모든 ITERATION에서 처리 된 행을 인쇄하기 위해 사용할 수있는 DBMS 용 명령/설정이 있습니까? "dbms_output.put_line"이 호출이 끝날 때 500 라인과 달리 호출 될 때 인쇄 된 라인은 PL/SQL의 모든 정확한 시간을 표시해야합니다.) ?? 명령 창 ON 문 아래

+0

호는 그런 옵션이 없습니다. 프로 시저가 완료 될 때만 출력이 표시됩니다. –

+3

[Oracle의 PL/SQL에서 출력을 플러시 할 수있는 방법이 있습니까?] (http://stackoverflow.com/questions/1472587/is-there-any-way-to-flush-output-from-pl) -sql-in-oracle) – user272735

+0

[각 반복에서 dbms_output.put_line을 호출 할 때 줄 단위로 인쇄하는 방법] (http://stackoverflow.com/questions/39099366/how-to-make- dbms-output-put-line-to-print-line-by-every-it-in-every-it이라고도 함)은 첫 번째 사본이 복제본으로 닫혀 있기 때문에 작성되었습니다. –

답변

2
CREATE OR REPLACE FUNCTION test_pipe 
    RETURN sys.DBMS_DEBUG_VC2COLL 
    pipelined 
    as 
    CURSOR cEmploee IS 
    SELECT * FROM g_emploees; 
    iTotal INTEGER := 0; 
    iCount INTEGER := 0; 
    BEGIN 
    SELECT COUNT(*) 
    INTO iTotal 
    FROM g_emploees ; 
    FOR rLine IN cEmploee loop 
    PIPE row('Porcessed['||rLine.id||']: '|| ((iCount/iTotal)*100) || '%'); 
    iCount := iCount + 1; 
    END LOOP; 
    END; 
/

--execute :

SQL >set arraysize 1 

SQL > SELECT * FROM TABLE(test_pipe); 
+1

이것이 작동하지 않습니다. 이것이 시스템에서 작동하는지 다시 확인하십시오. "파이프되지 않은 함수에서 PIPE 문을 사용할 수 없습니다"라는 컴파일 오류가 발생합니다. 내 오라클 버전 - 11gr2 – XING

+0

지금 확인하십시오. 내 보스에 글쓰기 :-( 현재 시스템에 연결할 수 없습니다. –

+0

그게 전부입니다. "Pipelined"를 추가하려고합니다. ..so 지금 그것의 확인. 또한 답변으로 게시하기 전에 그것을 테스트하십시오. – XING