有没有办法确定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缓冲区是不是已经发送到服务器?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法确定电子邮件是不是到达目的地?

有没有办法确定浏览器是不是可以处理电话链接[重复]

sqlplus 常用命令

丢弃用于 TCP 连接的 winsock 内部缓冲区中的排队数据

在开始时控制 Chromecast 缓冲

通过命名管道发送数据包?单字节缓冲区还是预先确定大小的?