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的主要内容,如果未能解决你的问题,请参考以下文章

SQL Plus 无法使用 Accept 将参数传递给我的存储过程

如何删除或跳过字符串中的多个新行?

忽略或跳过 Git 上的某些提交 [重复]

合并或跳过核心数据模型的版本

调试或跳过顺序 pytorch 模型的最佳方法

Android:intentservice,如何中止或跳过handleintent队列中的任务