将 oracle refcursor 转换为 unix 脚本中的文本

convert oracle refcursor to text in unix script

这是下面 post 的延续。我能够 return 从 oracle 存储过程到 unix 脚本的数据。 Fetch data from Oracle SP Out Param SYS_REFCURSOR in Unix Korn Shell Script

但是在遍历记录时我没有得到预期的结果。下面是代码。在打印变量 table 之前我收到一个错误 "cannot open"

weeknum=
    #read ref cursor from proc
    cur=`sqlplus -s $connection <<EOF
        SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
        var return_val refcursor
        exec WEEKLYLOAD($weeknum, :return_val);
        print return_val
        EXIT
        EOF`
    print "done"

    table=""
    while read -r line
    do
    $table=$$table"\n"$line
    done < $cur

您正在尝试从您的 cur 变量直接输入,但您使用的表单正在查找具有 $cur 中第一个单词名称的文件 - 而不是全部内容该变量的。您看到的错误将是您的过程打开的引用游标第一行第一列中的第一个单词。

因此,如果您的引用游标是为查询打开的,比方说,生成了值为 A、B 和 C 的三行输出,它将尝试从名为 A 的文件中读取输入,并报告 cannot open (除非当前工作目录中恰好存在名为该文件的文件)。

您可以回显变量并改为通过管道传递它:

echo "$cur" | while read -r line
do
  table=$table"\n"$line
done

我已经从作业中删除了额外的 $ 符号。但这看起来不是特别有用;使用与上面相同的三行结果,$table 将最终为:

\nA\nB\nC

如果您只想将 $cur 的内容打印到控制台,您可以使用其中之一(或其他):

echo "$cur"
printf "%s\n" "$cur"

两者都产生

A
B
C