有没有办法确定sqlplus缓冲区是不是已经发送到服务器?
Posted
技术标签:
【中文标题】有没有办法确定sqlplus缓冲区是不是已经发送到服务器?【英文标题】:Is there a way to determine if the sqlplus buffer has been sent to the server?有没有办法确定sqlplus缓冲区是否已经发送到服务器? 【发布时间】:2017-07-18 21:49:11 【问题描述】:我正在编写使用 SqlPlus 运行 sql 脚本的代码。大多数脚本中都有 DDL,这需要 /(正斜杠)来运行缓冲区。一些脚本缺少斜线。我曾尝试运行像@script.sql 这样的脚本,然后是 /,但它有时会尝试创建两次。我也想在最后运行 show errors 命令,如果 / 丢失,有时会给我带来麻烦。
所以,我改为 @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(例如,一个表加上索引/授权/约束...)的单个脚本,那么如果最终命令没有斜杠,您仍然会面临不运行最终命令的风险。
【讨论】:
这是一个很好的答案,谢谢。我没有想过缺少 if/then。这确实是一个很大的限制。感谢您的宝贵时间和回答。以上是关于有没有办法确定sqlplus缓冲区是不是已经发送到服务器?的主要内容,如果未能解决你的问题,请参考以下文章