【问题标题】:How to get the dbms_output.put_line within the store procedure result by unix korn shell如何通过 unix korn shell 在存储过程结果中获取 dbms_output.put_line
【发布时间】:2018-12-12 17:33:43
【问题描述】:

请参考我的示例, 在 oracle DB 中,这些低于 SP

CREATE OR REPLACE PROCEDURE SP_TEST_PUTLINE AS 
BEGIN
DBMS_OUTPUT.ENABLE;
  dbms_output.put_line('Hello world!');
END SP_TEST_PUTLINE;

我使用unix shell调用SP从SP获取dbms_output.put_line('Hello world!'),我该怎么做。 我使用sqlplus命令登录数据库,似乎无法得到我想要的结果。

   output=$(IFS='';echo connect ${DBUSER}/${DBPASS}@${ORACLE_SID} execute SP_TEST_PUTLINE|sqlplus -s /nolog )

谁能帮帮我? 提前谢谢...

------------------------------------分割线20180705 -------- -----------------------------

感谢 Alex 和 Kaushik Nayak 的帮助,非常有帮助。

以下是 Kaushik Nayak 的一些发现,请参考。

你好 Kaushik,它可以工作,但一开始它失败了,出现以下错误

unknown command beginning "-e connect..." - rest of line ignored. SP2-0734: 

所以我将 echo -e 选项更改为 echo,然后它就可以工作了。 所以这里有问题 1)为什么我使用不带-e选项的echo会得到以下结果,是IFS引起的吗?

echo "abc\n def \nghi" 
abc
 def 
ghi

2)根据Alex的cmets,这两个选项需要写成两行吗?但你没有在它们之间使用 \n

 set serveroutput on
set feedback off

当我在它们之间添加 \n 时,如下所示。它遇到了如下错误,但是'hellow world!'有输出,

SP2-0734: unknown command beginning "feedback o..." - rest of line ignored. Hello world! PL/SQL procedure successfully completed. 

这里有个问题,为什么你在设置服务器输出和设置反馈关闭之间没有使用\n,这个数据库命令(设置反馈关闭)是否运行成功?

期待您的回复。 提前致谢!

【问题讨论】:

  • 请不要编辑您的问题以提出其他问题;您可以在 cmets 中要求对答案进行澄清,但这有点超出了这一点 - 通常它应该是一个新问题(或两个)。但因为这些都是小问题。它们可能可以通过 cmets 解决。
  • 好的,Alex,我需要回过头来提出另一个问题吗?
  • 仅当我添加到 Kaushik 答案的评论不足以解释它时。但请注意未来 *8-)
  • 好的,明白了.....

标签: oracle ksh dbms-output


【解决方案1】:

您正在使用的命令甚至无法连接,因为您需要在 connectexecute 之间换行。

但您还需要set serveroutput on,并且您可能也需要set feedback off(也许还有其他选项。

我会使用a heredoc 使其更易于阅读和维护:

output=$(
sqlplus -s /nolog <<!EOF
connect ${DBUSER}/${DBPASS}@${ORACLE_SID}
set serveroutput on
set feedback off
execute SP_TEST_PUTLINE
!EOF
)

# then do whatever you want with the output
echo ${output}

您可能还想进行一些错误检查...

【讨论】:

    【解决方案2】:

    如果您使用单行回显传递给 sqlplus,则应使用 echo-e 选项放置换行符

    output=$(IFS='';echo -e "connect  ${DBUSER}/${DBPASS}@${ORACLE_SID}\nset serveroutput on feedback off\n execute SP_TEST_PUTLINE" |sqlplus -s /nolog )
    

    您还必须指定 set serveroutput onfeedback off 才能仅查看输出。

    因此,更好的选择是使用 Alex 指出的 here 文档。

    【讨论】:

    • 嗨 Kaushik,在我删除 '-e' 后,它运行良好,顺便说一句,我有一些问题并在 ------split line 20180705----- 下更新了它们,请从问题中找到他们,谢谢
    • @Tom - .regarding -e 我相信这表明您使用的是不同版本的 ksh 和/或不同的操作系统;关于 SP2-0734,我的版本有两个单独的 set 命令,而 Kaushik 将它们组合成一个 set。如果添加\n,则需要在feedback 之前添加另一个set
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多