oracle 在连接上运行多个PLSQL查询并将每个查询的输出存储在不同变量中的Unix脚本

carvr3hs  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(304)

我写了一个unix脚本PLSQL查询,我分别为每个查询建立连接,并将查询结果存储在变量中。我想通过只建立一次连接并将每个查询的结果存储在不同的变量中来提高代码效率。下面是我的工作代码

var1=`sqlplus -s $user/$password <<EOF @$query1 $value exit EOF`
var2=`sqlplus -s $user/$password <<EOF @$query2 $value exit EOF`
var3=`sqlplus -s $user/$password <<EOF @$query3 $value exit EOF`

我期待的解决方案是

sqlplus EOF
    var1=query1
    var2=query2
    var3=query3
    EOF

请帮助我正确的语法

bbuxkriu

bbuxkriu1#

当然,你可以在每个连接中获取多个变量,但不是通过简单的反引号stdout重定向。你需要以某种方式标记值,以便以后可以将它们分开。有很多方法可以做到这一点。
一种方法是将它们假脱机到不同的文件中。只需在每个sql文件的顶部添加“spool a”,“spool b”,“spool c”或任何您想要命名的名称。运行脚本,然后返回shell,将三个“a.lst”“b.lst”“c.lst”文件读入三个变量。
另一种方法是在每个SQL文件中添加一个标识查询的哑列:

SELECT 'query_a' dummy,actualvalue FROM ...

你可以spool它或者捕获stdout:

res=`sqlplus /nolog 2>&1 <<END
  @$query1 $value  
  @$query2 $value
  @$query3 $value
  exit
END
`
val1=`echo "$res" | grep query_a | awk '{print $2}'`
val2=`echo "$res" | grep query_b | awk '{print $2}'`
val3=`echo "$res" | grep query_c | awk '{print $2}'`

另一种方法是在PL/SQL块中运行查询,并将输出(带有标记)分配给可以打印的SQL*Plus绑定变量:

res=`sqlplus /nolog 2>&1 <<END
  var value_1 varchar2(20)
  var value_2 varchar2(20)
  var value_3 varchar2(20)
  BEGIN
    SELECT 'value_a='||myvalue INTO :value_1 FROM ...;  
    SELECT 'value_b='||myvalue INTO :value_2 FROM ...;
    SELECT 'value_c='||myvalue INTO :value_3 FROM ...;
  END;
  /
  set heading off
  print value_1
  print value_2
  print value_3
  exit
END
`

val1=`echo "$res" | grep value_a | cut -d'=' -f2`
val2=`echo "$res" | grep value_b | cut -d'=' -f2`
val3=`echo "$res" | grep value_c | cut -d'=' -f2`

这只是几种方法,我相信其他人可以想出更多的方法。

相关问题