SQL * Plus禁用或跳过ACCEPT PROMPT

时间:2012-05-21 10:28:30

标签: oracle maven plsql maven-plugin sqlplus

问题

我们有一个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>

尝试解决方案

我试图在一个plsql IF / ELSE块中包装ACCEPT调用,但这导致了一个关于'ACCEPT'和错误语法的错误,我猜这是因为我正在混合plsql和sqlplus命令。

问题

那么,有没有人知道如何在sqlplus中禁用类似于SET DEFINE OFF的传统替换变量的ACCEPT提示?

我可以对包装器脚本进行少量修改,但如果我要进行批量重构,DBA可能会抱怨。

感谢。

2 个答案:

答案 0 :(得分: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是第一个预期参数 - 您将比我更了解您的脚本。)

答案 1 :(得分:2)

您可以使用PRODUCT_USER_PROFILE为运行脚本的用户禁用ACCEPT命令