Python将Oracle Cursor作为参数传递给Oracle存储过程

时间:2015-11-02 17:25:14

标签: python oracle stored-procedures

我正在尝试将Oracle Cursor从python传递到Oracle存储过程(SP)。要求是SP获取数据并将数据插入表中。 SP采用两个参数-p1和p2,p1-> VARCHAR2,p2是sys_refcursor。

以下是存储过程详细信息:

p2是sys_refcursor,数据将采用串联格式(col1 | col2 | ...)

CREATE OR REPLACE PROCEDURE pt1 (p1 IN VARCHAR2,
                             p2 IN sys_refcursor)
IS
    t VARCHAR2(32767);
    v_err_cd       NUMBER;
    v_err_msg      VARCHAR2(32767); 
BEGIN
     LOOP
          fetch p2
          into t;

          INSERT INTO LIBRA.test_2(col1,col2)
          VALUES(p1,t);
          EXIT WHEN p2%NOTFOUND;
    END LOOP;
    COMMIT;
EXCEPTION
  WHEN OTHERS
  THEN
      rollback;
      v_err_cd  := SQLCODE;
      v_err_msg := v_err_msg || 'SQL Error:' ||     SUBSTR(dbms_utility.format_error_stack() || chr(10)  ||   dbms_utility.format_error_backtrace(),1,300);
      RAISE_APPLICATION_ERROR (-20101,'Error Code : ' || v_err_cd || 'Exception :  ' || v_err_msg );
END pt1;

Python代码:

srcqry = "select col1 || '|' || col2 from TEST rownum < 2"

oraconn = qz.core.sqldbs.connect(DBContext.getOracleConnectionName()) ##TODO Add a cursor in dbcontext
qzdb = qz.data.qztable_dbapi.QzTableSql(oraconn) 
cur = qzdb.conn.cursor()
result = cur.execute(srcqry)
print "type of result",type(result) # type 'OracleCursor'
lineStr = 'Call1'
cur.callproc("LIBRA.pt1",[linestr,result])
cur.close()
qzdb.conn.close()

获取“DatabaseError:ORA-01036:非法变量名称/编号” cur.callproc( “LIBRA.pt1”,[linestr,结果])

请帮忙!

谢谢, 巴拉

1 个答案:

答案 0 :(得分:0)

默认情况下,Oracle中的所有数据库对象名称都是UPPERCASE,即使它们在源代码中是小写的。解决方案是将cur.callproc的调用更改为使用"LIBRA.PT1"而不是"LIBRA.pt1"

祝你好运。