有没有办法确定sqlplus缓冲区是否已发送到服务器?

时间:2017-07-18 21:49:12

标签: oracle sqlplus

我正在处理使用SqlPlus运行sql脚本的代码。大多数脚本都有DDL,需要/(正斜杠)来运行缓冲区。有些脚本缺少斜杠。我试过像@ script.sql那样运行脚本然后是/,但它有时会尝试创建两次。我想在最后运行show errors命令,如果缺少/有时会给我带来麻烦。

所以,我改为@script。 (期间)显示错误。这在/存在于文件中时有效,但现在如果文件中缺少/,则会因为没有创建对象而混乱。

我们尝试使用一些逻辑来检查文件中的/结尾,但在我看来这是一个混乱的选项。我有误报,这不是一个完美的解决方案。

我考虑过尝试使用其他工具,但是因为我工作的公司已经发布了这个,并且客户希望它能够运行sqlplus,并且可能包含仅适用于sqlplus的命令;那些不符合JDBC的,我认为这不是一个合适的解决方案。

我现在在想,如果我能检查/是否已经在当前缓冲区运行并且只在没有的情况下运行,那么这将是一个很好的解决方案,也许是完美的,但我找不到任何文档这样的命令存在。有没有其他方法可以解决这个问题?这样的命令存在吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

SQLPlus非常有限。即使您确定缓冲区是否已被发送,也没有控制机制来执行IF / THEN。

您可以做的一件事是,在运行脚本之前,您可以调用

exec begin raise login_denied; end;

在脚本之后,调用

#show sqlcode

如果仍然显示1017(login_denied的错误代码),那么您可以非常确定该脚本没有执行任何SQL语句。如果您愿意,可以使用用户定义的错误代码,例如raise_application_error(-20123,'dummy');

请注意,我在show语句中包含了#前缀。这会运行命令而不会影响缓冲区的内容,所以如果你发现没有执行任何操作,你可以尝试用斜杠运行缓冲区内容。

如果你有一个包含多个DDL的脚本(例如一个表加上索引/格式/约束......),那么如果它没有斜杠,你仍然有可能没有运行最终命令。