如何通过 unix korn shell 获取存储过程结果中的 dbms_output.put_line
How to get the dbms_output.put_line within the store procedure result by unix korn shell
请参考我的示例,
在 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;
我用unixshell调用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的评论,这两个选项需要写成两行吗?但你没有在它们之间使用 \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.
问题来了,为什么不在 set serveroutput on 和 set feedback off 之间使用 \n,这个 DB 命令(set feedback off)运行 成功了吗?
期待您的回复。
提前致谢!
您正在使用的命令甚至无法连接,因为您需要在 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}
您可能还想做一些错误检查...
如果您使用单行回显传递给 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 on
和 feedback off
以仅查看输出。
因此,更好的选择是使用 Alex 指出的此处文档。
请参考我的示例, 在 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;
我用unixshell调用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的评论,这两个选项需要写成两行吗?但你没有在它们之间使用 \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.
问题来了,为什么不在 set serveroutput on 和 set feedback off 之间使用 \n,这个 DB 命令(set feedback off)运行 成功了吗?
期待您的回复。 提前致谢!
您正在使用的命令甚至无法连接,因为您需要在 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}
您可能还想做一些错误检查...
如果您使用单行回显传递给 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 on
和 feedback off
以仅查看输出。
因此,更好的选择是使用 Alex 指出的此处文档。