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

6qftjkof  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(649)

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

我不知道如何实施这个虽然,任何建议表示感谢

ut6juiuv

ut6juiuv1#

您可以(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 命令-只隐藏查询的输出-使用case表达式来选择实际文件路径或虚拟文件;我已经使用了/dev/null,但是您可以有一个自己的“no op”文件,如果更清楚的话,它什么也不做。查询会给出别名的结果 var3_path . 这个 new_value 行,然后将其转换为替换变量。这个 @ 然后展开这个变量。
所以如果 var3 如果是“真的”,那么:

@./oracle/myOthersqlfile.sql &&varA &&varB

(或者,实际上,用 varA 以及 varB 变量已替换为其实际值),如果为false,则运行:

@/dev/null

什么也不做,默默地。
你可以 set verify on 在代码周围查看何时何地发生替换。

kqlmhetl

kqlmhetl2#

不能将过程逻辑实现到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,然后您可以应用您需要的任何逻辑。

相关问题