如何在cx_Oracle和Sql * Plus上创建相同的结果?

时间:2012-08-08 09:38:01

标签: python cx-oracle

它 - 对于sqlplus - 命令:

SQL> set serveroutput on
SQL> exec where.my_package.ger_result('something');
something=1823655138

它是 - 对于cx_Oracle:

>>> c.callproc('where.my_package.ger_result', ('something',))
['something']

如您所见 - 结果不同。 我不知道,如何解决它。 :

2 个答案:

答案 0 :(得分:0)

import cx_Oracle

dsn_tns = cx_Oracle.makedsn('my_ip_address_server_next_port', 0000, 'sid')
db = cx_Oracle.connect('user', 'password', dsn_tns)
curs = db.cursor()
curs.callproc("dbms_output.enable")

curs.callproc('where.my_package.ger_result', ['something',])

statusVar = curs.var(cx_Oracle.NUMBER)
lineVar = curs.var(cx_Oracle.STRING)
while True:
  curs.callproc("dbms_output.get_line", (lineVar, statusVar))
  if statusVar.getvalue() != 0:
    break
  print lineVar.getvalue()

答案 1 :(得分:0)

抱歉,我无法重现这个。

我没有你的PL / SQL包,所以我使用了以下存储过程:

CREATE OR REPLACE PROCEDURE p_do_somet (
    p_param     IN VARCHAR2
) AS
BEGIN
    dbms_output.put_line(p_param || '=1823655138');
END;
/

我从SQL * Plus获得了相同的输出something=1823655138,并在答案中使用了Python脚本。

如果你使用SQL * Plus和cx_Oracle得到不同的结果,那么你的存储过程正在做一些非常有趣的事情(我不知道是什么原因导致它这样做),或者你的SQL * Plus会话和Python脚本未连接到同一数据库和/或架构。