我正在尝试将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;
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,结果])
请帮忙!
谢谢, 巴拉
答案 0 :(得分:0)
默认情况下,Oracle中的所有数据库对象名称都是UPPERCASE,即使它们在源代码中是小写的。解决方案是将cur.callproc
的调用更改为使用"LIBRA.PT1"
而不是"LIBRA.pt1"
。