使用 cx_Oracle 从存储过程捕获 stdout 输出
cx_Oracle 有没有办法从 oracle 存储过程捕获 stdout 输出?这些在使用 Oracle 的 SQL Developer 或 SQL Plus 时出现,但似乎没有办法使用数据库驱动程序获取它。
Is there a way in cx_Oracle to capture the stdout output from an oracle stored procedure? These show up when using Oracle's SQL Developer or SQL Plus, but there does not seem to be a way to fetch it using the database drivers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用
DBMS_OUTPUT.GET_LINE(buffer, status)
检索dbms_output。成功时状态为 0,没有更多数据时状态为 1。您还可以使用
get_lines(lines, numlines)
。numlines
是输入输出。您将其设置为最大行数,并将其设置为输出的实际行数。您可以在循环中调用此函数,并在返回的 numlines 小于您的输入时退出。lines
是一个输出数组。You can retrieve dbms_output with
DBMS_OUTPUT.GET_LINE(buffer, status)
. Status is 0 on success and 1 when there's no more data.You can also use
get_lines(lines, numlines)
.numlines
is input-output. You set it to the max number of lines and it is set to the actual number on output. You can call this in a loop and exit when the returnednumlines
is less than your input.lines
is an output array.Herby 基于 redcayuga 的第一个答案的代码示例:
然后在调用存储过程后运行它:
Herby a code example based on redcayuga's first answer:
Then run it after calling your stored procedure with:
无论您使用
put_line
放置什么,您都可以使用get_line
;我相信这就是所有这些工具的工作原理,可能包括 SQL*Plus。请注意,您需要调用
get_line
足够多次才能耗尽缓冲区。如果不这样做,未读部分将被下一个put_line
覆盖。Whatever you put using
put_line
, you read usingget_line
; I believe this is how all these tools work, probably including the very SQL*Plus.Note that you need to call
get_line
enough times to exhaust the buffer. If you don't, the unread part will be overwritten by the nextput_line
.不要忘记
在调用实际过程之前调用,否则缓冲区将为空。
因此,在此处的其他两个答案的基础上,一个示例是(proc_name 是您的过程 - schema.package.procedure):
Do not forget to call
before calling your actual procedure, otherwise the buffer will be empty.
So building on the other two answers here, an example would be (proc_name is your procedure - schema.package.procedure):
你试过这个吗?
第一个参数是要调用的过程,第二个参数是参数序列或绑定变量的字典。
参见:
http://cx-oracle.sourceforge.net/html/cursor.html
Did you tried this?
The first argument is the procedure to call and the second a sequence of arguments or a dict for bindvars.
see also:
http://cx-oracle.sourceforge.net/html/cursor.html