我有一个shell脚本,它调用一些类似SQL的
sqlplus system/$password@$instance @./oracle/mysqlfile.sql $var1 $var2 $var3
然后在mysqlfile.sql中,我定义如下属性:
DEFINE var1=&1
DEFINE var2=&3
DEFINE var3=&3
在文件的后面,我调用另一个SQL脚本:
// i wish to wrap this in a if statement - pseudo-code
if(var3="true") do the following
@./oracle/myOthersqlfile.sql &&varA &&varB
我不知道如何实现这一点,但任何建议都感谢
您可以(ab(使用替换变量:
set termout off
column var3_path new_value var3_path
select case
when '&var3' = 'true' then './oracle/myOthersqlfile.sql &&varA &&varB'
else '/dev/null'
end as var3_path
from dual;
set termout on
@&var3_path
set termout
命令之间的查询(只隐藏查询的输出(使用大小写表达式来选择真实文件路径或伪文件;我使用了/dev/null,但如果更清楚的话,你可以有一个自己的"无操作"文件,它什么都不做。该查询为该查询的结果提供了别名var3_path
。将其转换为替换变量之前的new_value
行。@
然后展开该变量。
因此,如果var3
为"true",则运行:
@./oracle/myOthersqlfile.sql &&varA &&varB
(或者,实际上,varA
和varB
变量已经被其实际值替换(,如果为false,则运行:
@/dev/null
它什么也不做,悄无声息。
您可以围绕该代码set verify on
来查看替换何时何地发生。
您不能在sqlplus中实现过程逻辑。您有以下选项:
- 在运行sqlplus的shell脚本中实现IF-THEN-ELSE逻辑
- 使用PL/SQL,但是应该将SQL脚本作为匿名块内的进程来调用,而不是像外部脚本那样
在您的情况下,最简单的方法是更改shell脚本。
#/bin/bash
#
# load environment Oracle variables
sqlplus system/$password@$instance @./oracle/mysqlfile.sql $var1 $var2 $var3
# if then
if [ $var3 == "true" ]
then
sqlplus system/$password@$instance @./oracle/myOthersqlfile.sql
fi
您应该意识到sqlplus只是一个CLI(命令行接口(。所以你不能把程序逻辑应用于它
我不知道你在那些sql脚本中做什么(运行DML、创建文件等(,但最好的方法是将它们转换为PL/sql,然后你可以应用你需要的任何逻辑。