SQL*Plus 禁用或跳过 ACCEPT PROMPT
Posted
技术标签:
【中文标题】SQL*Plus 禁用或跳过 ACCEPT PROMPT【英文标题】:SQL*Plus disable or skip ACCEPT PROMPT 【发布时间】:2012-05-21 10:28:29 【问题描述】:问题
我们有一个 DBA 提供的包装脚本,用于执行构成给定软件版本的许多底层 sql 脚本。
包装脚本输出一些关于将要执行的调试信息,然后询问用户是否希望继续,使用以下 sqlplus 命令
ACCEPT DB_OK PROMPT "Do you wish to Continue Y/[N]? : " DEFAULT N
我们正在尝试使用 maven 在构建中自动创建数据库...构建挂起等待用户输入:-(
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>pre-integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>sqlplus</executable>
<arguments>
<argument>$db.user/$db.password@$db.service.name</argument>
<argument>@$project.build.directory/test-resources/create-db.sql</argument>
</arguments>
<workingDirectory>$project.build.directory/test-resources</workingDirectory>
</configuration>
</execution>
</executions>
</plugin>
尝试的解决方案
我试图将 ACCEPT 调用包装在 plsql IF/ELSE 块中,但这会导致有关“ACCEPT”的错误和不正确的语法,我猜这是因为我混合使用了 plsql 和 sqlplus 命令。
问题
那么,有谁知道如何在 sqlplus 中禁用 ACCEPT 提示,类似于传统替换变量的 SET DEFINE OFF?
我可以对包装脚本进行少量修改,但如果我要进行批量重构,DBA 可能会抱怨。
谢谢。
【问题讨论】:
你能发布你用来执行这些脚本之一的 Maven 代码吗? 我已经编辑了问题以包括 maven sqlplus 执行 【参考方案1】:SQL*Plus 使用位置符号来传递参数。所以这会将42
作为some_script.sql
期望的第一个(也是唯一一个)参数传递
$ sqlplus scott/tiger@orcl @@$HOME/scripts/some_script.sql 42
这会使任何 ACCEPT 调用短路。
所以,如果我正确理解了您的 Maven 插件的工作原理,我认为您可以实现同样的效果:
<executable>sqlplus</executable>
<arguments>
<argument>$db.user/$db.password@$db.service.name</argument>
<argument>@$project.build.directory/test-resources/create-db.sql</argument>
<argument>Y</argument>
</arguments>
也就是说,将 Y
作为 sqlplus 命令字符串中的下一个参数传递(假设 DB_OK
是第一个预期参数 - 你会比我更了解你的脚本)。
【讨论】:
我尝试了类似的方法,但未能让它发挥作用,因为你已经建议了我会再试一次(我之前的尝试有点快速破解)【参考方案2】:您可以使用PRODUCT_USER_PROFILE 为正在运行脚本的用户禁用ACCEPT
命令
【讨论】:
关闭,但我只想在某些情况下禁用提示,当有人从命令行执行时,脚本应该提示,但是当作为构建的一部分执行时,提示应该被禁用。跨度> 那么为什么不在这些场景中使用特定用户呢? 我喜欢这个建议,但我怀疑我们的 DBA 会接受它,因为这意味着我们的开发环境不同于生产环境(有额外的用户)。环境定义相当严格。以上是关于SQL*Plus 禁用或跳过 ACCEPT PROMPT的主要内容,如果未能解决你的问题,请参考以下文章