请参考我的示例, 在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外壳程序调用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)根据亚历克斯的评论,有两个选项需要将它们写到两行吗?但您没有在它们之间使用\ n
set serveroutput on
set feedback off
当我在它们之间添加\ n时,如下所示。它提示了如下错误,但“地狱世界”!有输出,
SP2-0734: unknown command beginning "feedback o..." - rest of line ignored. Hello world! PL/SQL procedure successfully completed.
这是一个问题,为什么您没有在打开服务器输出和关闭反馈之间使用\ n,这个DB命令(关闭反馈)是否已成功运行?
期待您的回复。 预先感谢!
答案 0 :(得分:2)
您正在使用的命令甚至无法连接,因为您需要在connect
和execute
之间换行。
但是您还需要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}
您可能还想进行一些错误检查...
答案 1 :(得分:2)
如果您使用单行回显传递给sqlplus,则应使用-e
的{{1}}选项放置换行符
echo
您还必须指定output=$(IFS='';echo -e "connect ${DBUSER}/${DBPASS}@${ORACLE_SID}\nset serveroutput on feedback off\n execute SP_TEST_PUTLINE" |sqlplus -s /nolog )
和set serveroutput on
才能仅查看输出。
因此,更好的选择是使用Alex所指的此处文档。