2016-08-24 1 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. Я не могу передать вывод в файл только для чтения!

Есть ли команда/настройки для СУБД, которые я могу использовать для того, чтобы просмотреть обработанное% и печатают линию для обрабатываться в каждой итерации, а не в конце, как целая куча линий, сохраняющиеся в буфере (Распечатка строки должна показывать каждое точное время в PL/SQL, когда «dbms_output.put_line» вызывается не как 500 строк в конце выполнения)?

+0

Нет. Там нет такой опции. Выход будет отображаться только после завершения процедуры. –

+3

Возможный дубликат [Есть ли способ сбросить вывод из PL/SQL в Oracle?] (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-line-when-called-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

Thats ok ,, Я ожидал, что вы добавите «Pipelined» ..so теперь его хорошо. Также убедитесь, что вы протестировали его, прежде чем отправлять его в качестве ответа. – XING