2

问题

我们有一个由 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 可能会抱怨。

谢谢。

4

2 回答 2

3

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是第一个预期参数 - 你会比我更了解你的脚本)。

于 2012-05-21T13:29:12.220 回答
2

您可以使用PRODUCT_USER_PROFILEACCEPT为正在运行脚本的用户禁用命令

于 2012-05-21T11:18:41.300 回答