基于通过.sh脚本传入的参数的Oracle SQL if语句



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

(或者,实际上,varAvarB变量已经被其实际值替换(,如果为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,然后你可以应用你需要的任何逻辑。

最新更新