如何编写运行PL / SQL块的批处理文件,告诉我插入/删除了许多记录/等。在日志文件中?

时间:2014-10-27 14:51:16

标签: oracle batch-file plsql ddl dml

我创建了两个批处理文件,在Windows任务计划程序中运行两个单独的.sql文件。两者的批处理文件如下所示:

sqlplus userid/password@database @C:\XXX.sql>>C:\output.log
echo commit; | userid/password@database

第一个.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过程成功执行,但我没有得到一条线来说明插入了多少条记录,而我正试图找到一种方法来实现它。

有没有人知道可能的伎俩?

谢谢!

2 个答案:

答案 0 :(得分:1)

修订答案

正如@Alex Poole所指出的那样,您可以在SQL * Plus的PL / SQL块中使用@命名法,因为这会将第二个文件的命令加载到您所需的块中。 39;从中调用它。

您没有获得任何输出的原因是,就SQL * Plus而言,它是所有一个命令:SQLPlus块。为了将这些命令输出到您的日志,您需要使用DBMS_OUTPUT自己创建它。在每个命令之后,您需要包含如下所示的行。

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

但是,您应该注意,如果从PL / SQL块外部调用脚本,则执行此操作将导致脚本抛出错误。我的原始解决方案可以避免此限制,因为它无需使用DBMS_OUTPUT


原始答案

我发现很难相信第一个文件中的PL / SQL正在成功执行。这是因为您将SQL * Plus命令与PL / SQL代码混合在一起。它们是独立的系统 - 就像尝试在编程语言中本地使用shell命令一样。您应该从第一个文件中获取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

答案 1 :(得分: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