Как мне спулировать вывод, не достигнув предела буфера, когда настройка TERMOUT OFF не работает - PullRequest
0 голосов
/ 05 октября 2018

Я использую SQL-разработчик и пытаюсь выманить изрядное количество данных.Сценарий останавливается на полпути, так как переполнение буфера превышено.

Я понимаю, что это потому, что вывод скрипта не может обработать такой объем данных, но решение этого SET TERMOUT OFF не работает.

Я привел приведенный ниже пример, чтобы проиллюстрировать, что эта команда не работает

SET TERMOUT OFF
/

DECLARE

   CURSOR C1 IS

   select distinct '1' NUMBERR from dual;

BEGIN


    for c1_rec in c1 loop

    DBMS_OUTPUT.PUT_LINE(C1_REC.NUMBERR);

   END LOOP;

end; 

Вывод:

1


PL/SQL procedure successfully completed.

Как вы можете видеть, '1' все еще выводится в вывод скриптауказывает на то, что SET TERMOUT не работает

1 Ответ

0 голосов
/ 05 октября 2018

Из документации * SQL * Plus , которая в значительной степени относится и к SQL Developer:

TERMOUT OFF не влияет на вывод команд, вводимых вами в интерактивном режиме

Если у вас есть set termout off в файле сценария и вы запускаете его с @<script>, то это подавит вывод;но он все равно будет пытаться записать те же данные, если вы буферизируете.

Если вы видите ORU-10027: buffer overflow, то вы все равно пытаетесь решить не ту проблему;даже при спулинге вы столкнетесь с той же ошибкой - она ​​появится в файле, а не в окне вывода скрипта.

Буфер относится к самому dbms_output:

set serveroutput on size 2000

begin
  dbms_output.put_line(dbms_random.string('a', 2001));
end;
/

ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
...

Чтобы избежать этой ошибки, установите буфер достаточно высоким для ожидаемого объема вывода или на максимум для версии Oracle и клиента:

set serveroutput on size unlimited

, но, как вы видели, это все равно ограничивает 1000000 байт.в SQL Developer, до версии 18.2 в любом случае.

Даже при отключенном терминале и буферизации в файл вы все равно получите в файле

ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes

.

Если вам нужно больше выходных данных, то вы можете записать выходные данные во временную таблицу и затем запросить ее после вашего блока PL / SQL, возможно.Или вы можете использовать utl_file для записи в файл (который должен быть на сервере, а не на клиенте, что является недостатком) вместо буферизации.Или вы можете использовать SQL * Plus, который не налагает это ограничение.

...