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

Oracle 有没有办法确定sqlplus缓冲区是否已发送到服务器?,oracle,sqlplus,Oracle,Sqlplus,我正在编写使用SqlPlus运行sql脚本的代码。大多数脚本中都有DDL,这需要/(正斜杠)来运行缓冲区。有些脚本缺少斜杠。我试过运行@script.sql和/这样的脚本,但有时它会尝试创建两次。我也想在最后运行showrerrors命令,如果/丢失,有时会给我带来麻烦 所以,我改为@script。(句号)显示错误。当/出现在文件中时,此操作有效,但现在如果文件中缺少/,则会由于不创建对象而出错 我们试图用一些逻辑来检查文件中是否有/结尾,但我认为这是一个混乱的选项。我有误报,这不是一个完美的解

我正在编写使用SqlPlus运行sql脚本的代码。大多数脚本中都有DDL,这需要/(正斜杠)来运行缓冲区。有些脚本缺少斜杠。我试过运行@script.sql和/这样的脚本,但有时它会尝试创建两次。我也想在最后运行showrerrors命令,如果/丢失,有时会给我带来麻烦

所以,我改为@script。(句号)显示错误。当/出现在文件中时,此操作有效,但现在如果文件中缺少/,则会由于不创建对象而出错

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

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

我现在在想,如果我可以检查/是否在当前缓冲区上运行,并且只在没有运行的情况下执行/仅在没有运行的情况下执行,这将是一个很好的解决方案,也许很完美,但我找不到任何文档证明存在这样的命令。还有别的办法解决这个问题吗?有这样的命令吗?
谢谢

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

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

exec begin raise login_denied; end;
在脚本之后,调用

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

注意,我在show语句中包含了一个#前缀。这将在不影响缓冲区内容的情况下运行该命令,因此如果发现没有执行任何内容,可以尝试使用斜杠运行缓冲区内容


如果您有一个包含多个DDL的脚本(例如一个表加上索引/授权/约束…),那么如果没有斜杠,您仍然有不运行最终命令的风险。

这是一个很好的答案,谢谢。我没有想到缺少if/then。这确实是一个很大的限制。谢谢你的时间和回答。