2017-07-18 51 views
0

我正在使用SqlPlus运行sql脚本的代码。大多数脚本中都有DDL,它需要一个/(正斜杠)来运行缓冲区。有些脚本缺少斜杠。我曾尝试运行脚本(如@ script.sql和/),但它有时会尝试创建两次。我还想在最后运行show errors命令,有时如果/缺失,会给我造成麻烦。有没有办法确定sqlplus缓冲区是否已经发送到服务器?

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

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

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

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

回答

1

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

一两件事你可以做的是,在运行脚本之前,你叫

exec begin raise login_denied; end; 

脚本后,调用

#show sqlcode 

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

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

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

+0

这是一个很好的答案,谢谢。我没有想过如果/那么缺乏。这真的是一个限制。我感谢你的时间和答复。 –

相关问题