我创建了两个批处理文件,在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过程成功执行,但我没有得到一条线来说明插入了多少条记录,而我正试图找到一种方法来实现它。
有没有人知道可能的伎俩?
谢谢!
答案 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