Запись в Oracle одновременных выходных данных/журнала запроса из программы SQLPlus

У меня есть параллельный запрос Oracle, который вызывает программу SQLPlus. Сама программа работает корректно, но хотелось бы добавить некоторую информацию логирования в вывод/лог параллельного запроса в EBS.

Я пробовал несколько вариантов:

set heading off
--set pagesize 0 embedded on
set pagesize 50000
set linesize 32767
set feedback off
set verify off
set term off
set echo off
set newpage none
set serveroutput on

dbms_output.enable(1000000);

--prepare data
EXECUTE program (&1,&2,&3,&4,&5);

--extract data
@"path/file.SQL";

fnd_file.put_line(FND_FILE.LOG,'do some logging here');
fnd_file.put_line(FND_FILE.OUTPUT,'do some logging here');

/

Но все, что я пробовал до сих пор, приводит либо к

  • не добавлено ведение журнала для запроса вывода или журнала
  • никакого вывода запроса
  • ошибки типа: SP2-0734: unknown command beginning "dbms_outpu..." - rest of line ignored. и PLS-00103: Encountered the symbol "ENABLE" when expecting one of the following: := . ( @ % ;

Можно ли записать в вывод запроса или журнал из сценария SQLPlus, который вызывается из параллельного менеджера?


person alexherm    schedule 28.01.2020    source источник
comment
Что вы подразумеваете под одновременным запросом? Если вы хотите буферизовать файл журнала из sqlplus, вам нужно добавить команду spool.   -  person OldProgrammer    schedule 28.01.2020
comment
@OldProgrammer это вопрос Oracle e-Business Suite. Я обновил теги, хотя часто задавался вопросом, подходят ли они для SO.   -  person Matthew McPeak    schedule 28.01.2020


Ответы (3)


Во-первых, ваш скрипт SQL*Plus даже не запустится без ваших попыток ведения журнала.

  1. dbms_output enable(...) отсутствует точка ('.').
  2. В вашем анонимном блоке PL/SQL нет инструкции end;
  3. @"path/file.SQL` — это команда SQL*Plus, ее нельзя встроить в анонимный блок PL/SQL.

Помимо этих основных проблем, FND_FILE.PUT_LINE предназначен только для параллельных программ PL/SQL. То есть параллельные программы, исполняемый файл которых указывает на процедуру пакета PL/SQL, а не на файл .sql в $APPL_TOP.

Для параллельных программ SQL*Plus, т. е. для запуска файла .sql под $APPL_TOP, FND_FILE.PUT_LINE не работает. Вместо этого ваши выходные данные SQL*Plus автоматически записываются в выходные данные запроса. Стандартного способа записи в журнал запросов нет.

Если вам действительно нужно записать в журнал запросов, вы можете вызвать FND_FILE.PUT_NAMES, чтобы заставить FND_FILE.PUT_LINE писать во временные файлы, которые вы называете. Затем, зная идентификатор параллельного запроса и логику, которую Oracle EBS использует для локальных выходных файлов и файлов журнала, выполните команду FND_FILE.CLOSE и host, чтобы переместить файлы с пользовательскими именами, указанные вами, в фактические местоположения. Это может сработать.

Было бы намного лучше переделать вашу параллельную программу как пакет PL/SQL. Тогда FND_FILE работает нормально. Если вы знаете, как вызывать Java из базы данных, вы мало что сможете сделать в сценарии .sql, чего не сможете сделать в пакете PL/SQL.

Я не писал параллельной программы .sql уже много лет, и я постоянно пишу параллельные программы.

person Matthew McPeak    schedule 28.01.2020
comment
Это работает. Если удалить команды BEGIN, dbms_output и fnd_file, программа будет делать именно то, что я хочу. Вы правы насчет отсутствия END - я тестировал с BEGIN и END и без них. Да, мне не хватает этой точки — я повторю тесты с ней. Обычно я бы делал все это внутри процедуры или пакета, но есть некоторые смягчающие обстоятельства, связанные с этой программой, которые привели меня в этом направлении. Это верная точка зрения - теперь, когда она работает, возможно, мне следует пересмотреть, возможно ли перемещение частей SQLPlus обратно в процедуру. Спасибо. - person alexherm; 29.01.2020
comment
После удаления BEGIN и добавления '.' программа завершается нормально с ожидаемым результатом - буферным выводом CSV. В выводе параллельного запроса отображается ошибка - SP2-0734: unknown command beginning "dbms_outpu..." - rest of line ignored. Я должен думать, что если он может поместить эту ошибку туда, то должен быть способ добавить пользовательские сообщения в то же место. - person alexherm; 29.01.2020
comment
Потому что dbms_output — это пакет PL/SQL. В SQL*Plus это должно быть EXECUTE dbms_output... или BEGIN dbms_output... END;. То же самое с вызовами FND_FILE, хотя, как я уже писал, они все равно не будут делать то, что вы от них хотите, из параллельной программы SQL*Plus. - person Matthew McPeak; 29.01.2020

Я решил эту проблему. Решение невероятно простое — и теперь я сломлен, потому что это заняло так много времени, чтобы понять.

Шаг 1 — SET ECHO ON

Шаг 2 — PROMPT whatever you want written to concurrent request output

Следующий пример записывает 'Output is written to this folder' в выходные данные параллельного запроса.

set heading off
--set pagesize 0 embedded on
set pagesize 50000
set linesize 32767
set feedback off
set verify off
set term off
set echo on
set newpage none
set serveroutput on

prompt Output is written to this folder

--prepare data
EXECUTE program (&1,&2,&3,&4,&5);

--extract data
@"path/file.SQL";

/

Это именно то, что я искал. Может быть, это будет полезно кому-то в другой галактике.

person alexherm    schedule 30.01.2020

Как упомянул Мэтью, регистрация в исполняемых файлах SQL*Plus не работает должным образом. Если по какой-то причине вы не можете переместить свой код в хранимую процедуру PL/SQL, вместо этого вам может подойти хост-скрипт. Оттуда вы можете выполнить SQL, например. sqlplus -s $FCP_LOGIN ... и запишите требуемую информацию журнала. Если вам просто нужно подготовить данные с помощью PLSQL, а затем спулировать их в CSV через SQL, вы можете вместо этого использовать Blitz Report нашей компании, который делает это более удобным и бесплатным для такого использования. Он также использует исполняемый файл типа Host и оттуда вызывает sqlplus.

person Andy Haack    schedule 30.01.2020