将shell变量传递给plsql过程

时间:2015-09-30 11:41:17

标签: oracle shell plsql

我正在尝试从shell脚本运行我的过程。问题是程序无法读取参数

#! /bin/bash

circle="GENX"
Date="2015/09/29"
version="V2"

/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/admin@TESTDB <<"EOF"
begin
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version');
commit;
end;
/
"EOF"

2 个答案:

答案 0 :(得分:1)

它不像引用的heredoc限制字符串;我可以重现并删除引号修复它:

/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/admin@TESTDB <<EOF
begin
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version');
commit;
end;
/
EOF

这与Oracle无关,它与shell和heredoc的工作方式有关;这样:

cat <<"EOF"
$circle
"EOF"

...也打印$circle而不是GENX

This is known behaviour

  

引用或转义&#34;限制字符串&#34;在here文档的头部禁用其体内的参数替换。这样做的原因是引用/转义限制字符串有效地转义$,`和\ special字符,并使它们按字面解释。

答案 1 :(得分:0)

您需要使用不带引号的EOF进行参数扩展。由于bash reference重定向:

  

这种类型的重定向指示shell从当前源读取输入,直到看到只包含单词(没有尾随空白)的行。然后,读取到该点的所有行都将用作命令的标准输入。

     

here-documents的格式为:

<<[-]word
    here-document
  delimiter
  

不对字执行参数和变量扩展,命令替换,算术扩展或文件名扩展。如果引用单词中的任何字符,则分隔符是单词上的引号删除的结果,并且不会展开here-document中的行。如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展,字符序列\ newline将被忽略,'\'必须用于引用字符'\','$ '和'''。

所以,你必须在bash脚本中单词(EOF在你的情况下)不加引号,以使它工作:

#! /bin/bash

circle="GENX"
Date="2015/09/29"
version="V2"

/usr/ORACLE/u01/app/product/11.2.0/client_1/bin/sqlplus admin/admin@TESTDB <<EOF
begin
GEN_AUTOMATION.Delete_Invalid_Data('$circle','$Date','$version');
commit;
end;
/
EOF