【问题标题】:convert oracle refcursor to text in unix script将 oracle refcursor 转换为 unix 脚本中的文本
【发布时间】:2017-04-18 11:43:48
【问题描述】:

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

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

weeknum=$1
    #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

【问题讨论】:

    标签: oracle unix ksh


    【解决方案1】:

    您正试图从您的cur 变量直接输入,但您使用的表单正在寻找一个文件,该文件的名称与$cur 中的第一个单词相同,而不是该变量的全部内容。您看到的错误将是您的程序打开的引用光标的第一行的第一列中的第一个单词。

    因此,如果您的 ref 游标是针对一个查询打开的,例如,产生三行输出值 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
    

    【讨论】:

    • 谢谢!!有效。我需要将这些数据作为邮件正文发送。所以这是一个很好的解决方案。
    • 想知道如何迭代 $cur 中一行中的每一列。希望它断章取义:)
    猜你喜欢
    • 2016-12-25
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2015-03-19
    相关资源
    最近更新 更多