2014-10-27 1 views
0

Я создал два командных файла для запуска двух отдельных файлов .sql в Планировщике задач Windows. Пакетный файл для обоих выглядит следующим образом:Как написать командный файл, который запускает блок PL/SQL, чтобы сообщить мне, что многие записи вставлены/удалены/и т. Д. в файле журнала?

sqlplus userid/[email protected] @C:\XXX.sql>>C:\output.log 
echo commit; | userid/[email protected] 

Файл первый .sql (SQL1) является PL/SQL блок, как это:

SET SERVEROUT ON 
DECLARE 
.... 
BEGIN 
IF ... 
.... 
ELSE 
@D:\DM_FIX.sql; 
END IF 
END 

Файл DM_FIX.sql, чтобы вставить кучу записей в таблицу, и начинается с команды INSERT.

Файл second.sql не является файлом блока. Это делает кучу DDL/DML комманды. файл выглядит, как показано ниже:

Truncate Table YYY 
Reuse Storage; 
Commit; 

Insert into Table YYY 
Select ... from 
Commit; 

Delete from Table YYY 
where ... 
Commit; 

При запуске второго файла .sql, я получаю выход, который указывает на «Стол был усечен, #### записи вставлены, #### записи удаляются ... "

Но когда я запускаю первый, хотя процедура PL/SQL выполнена успешно, я не получаю строку, в которой указано, сколько записей вставлено, и я пытаюсь выяснить способ сделай это.

Кто-нибудь знает, что может быть трюком?

Спасибо!

ответ

1

Пересмотренный Ответ

Как @Alex Poole услужливо указал, вы можете использовать @ номенклатуры в/SQL блок PL из SQL * Plus, так как это будет загружать команды второго файла в блок, который вам это называется.

Причина, по которой вы не получаете какой-либо вывод, заключается в том, что, насколько это касается SQL * Plus, все это одна команда: блок SQLPlus. Чтобы получить выход в ваш журнал для этих команд, вам нужно создать его самостоятельно, используя DBMS_OUTPUT. После каждой команды вам нужно будет включить строку, подобную приведенной ниже.

DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT || ' rows inserted'); 

Однако, следует отметить, что делать это заставит ваш сценарий бросать ошибки, если он когда-либо вызвана вне а/SQL блока PL. Мое первоначальное решение позволит избежать этого ограничения, так как оно устраняет необходимость использования DBMS_OUTPUT.


Оригинал ответа

мне трудно поверить, что PL/SQL в первом файле успешно выполняется. Это связано с тем, что вы смешиваете команды SQL * Plus с кодом PL/SQL. Это отдельные системы - это похоже на попытку использования команд оболочки изначально на языке программирования. Вы должны получать PLS-00103: Encountered the symbol "@" when expecting... из первого файла.

SQL * Plus не имеет условных обозначений, поэтому, чтобы отдельные команды PL/SQL и SQLPlus отличались друг от друга, вам нужно подделать его несколько.Я хотел бы предложить положить имя файла в переменную подстановки, а затем с помощью, чтобы запустить файл:

VARIABLE v_my_file_bind varchar2(100) 
DECLARE 
... 
BEGIN 
IF ... 
... 
    :v_my_file_bind := 'D:\EMPTY_FILE.sql'; 
ELSE 
    :v_my_file_bind := 'D:\DM_FIX.sql'; 
END IF; 
END; 
/
COLUMN v_my_file_column new_value my_file_substitution noprint 
SELECT :v_my_file_bind v_my_file_column from dual; 
@&&my_file_substitution 
+0

SQL * Plus позволяет то, что делает OP; '@' заставляет содержимое файла DM_FIX.sql быть включенным в сценарий PL/SQL перед его анализом и исполнением. Не сказать, что это отличная идея, но она действительна. (Я только что подтвердил это для своего собственного здравомыслия, но получается [я показал это раньше] (http://stackoverflow.com/a/21112230/266304)). –

+0

@Alex Poole: Huh. Я не знал этого. Хотя даже в этом случае должна была произойти ошибка, так как второй блок содержит DDL. – Allan

+0

Правда, он не понимает 'truncate', но OP работает только с первым файлом (' DM_FIX.sql') и имеет только DML ... Я думаю ... это немного запутанно. –

0

Чтобы показать количество измененных строк в PL/SQL, используйте SQL%ROWCOUNT:

begin 
    insert into my_table ... 
    select ... 
    from ...; 

    dbms_output.put_line('Rows inserted: ' || SQL%ROWCOUNT); 
    commit; 
end; 
/

Запомнить , что переменная SQL%ROWCOUNT сбрасывается до 0 после фиксации. Документация: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/sql_cursor.htm

Смежные вопросы