我有一个设置变量的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。有什么建议吗?
答案 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
命令来修剪输出中的噪音。
也不确定你是否需要或想要截断表列(影响索引使用,开始),所以避免这种情况并调整右侧以获得所需的数据。