我们有一个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可能会抱怨。
感谢。
答案 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
命令