从shell传递模式名称和dblink作为参数调用oracle存储过程

时间:2017-06-28 20:59:36

标签: oracle shell stored-procedures

我有一个设置变量的shell文件。它看起来像这样。

CREATE OR REPLACE procedure MIG.dblink(schema1 in varchar, link1 in varchar, count1 out number)
IS

BEGIN

SELECT COUNT(1) INTO COUNT1 FROM schema1.table@link1 where trunc(csactivated) > trunc(sysdate-1);

END;
/

现在我从shell文件中调用它,如下所示。

source dataenv.sh #sets up the following variables.

    echo "SCHEMA_NAME IS $SCHEMA_NAME"
    echo "LINKNAME IS $LINKNAME"
    echo "ORACLEHOME IS $ORACLEHOME"
    echo "DBUSER IS $DBUSER"
    echo "DBPASSWORD IS $DBPASSWORD"
    echo "HOSTNAME IS $HOST_NAME"

    output1=0

    output=$(
      $ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD <<EOF
       exec dblink('$SCHEMA_NAME', '$LINKNAME', $output1);
    EOF
    )

    echo "output is $output"

现在我的问题是我无法编译程序,因为oracle无法找到schema1架构和link1 dblink。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你不需要一个程序 - 实际上它会比你想象的更难,因为你必须使用动态SQL。只需使用shell变量中的普通SQL uilt:

output=$(
  $ORACLEHOME/bin/sqlplus -s $DBUSER/$DBPASSWORD <<EOF
   set pages 0 feedback off
   select count(*) from ${SCHEMA_NAME}.table@${LINKNAME}
   where trunc(csactivated) > trunc(sysdate-1);
EOF
)

我添加了几个set命令来修剪输出中的噪音。

也不确定你是否需要或想要截断表列(影响索引使用,开始),所以避免这种情况并调整右侧以获得所需的数据。