当前位置: 首页 > 知识库问答 >
问题:

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

皇甫高阳
2023-03-14

我试图通过Oracle光标从python到Oracle存储过程(SP)。要求SP获取数据并将数据插入表中。SP取两个参数p1和p2 p1

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

p2sys_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()

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

请帮忙!

谢谢你,巴拉

共有1个答案

刘成礼
2023-03-14

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

祝你好运。

 类似资料:
  • 我正在尝试执行从hibernate到oracle表的插入操作。我的存储过程是:-

  • 问题内容: 我想将两个数组形式的java发送到oracle存储过程。第一个数组是字符串数组,第二个是字符数组,我怎样才能做到这一点? 问题答案: 这是一个如何做的例子。 以下脚本在数据库中设置表,类型和存储过程。该过程采用数组类型的参数,并将数组的每一行插入表中: 然后,Java代码演示如何将数组传递到此存储过程中: 如果先运行SQL脚本,然后运行Java类,然后查询表,则应该发现所有数据都已插入

  • 问题内容: 我有大约六种通用但相当复杂的存储过程和函数,我想以一种更通用的方式使用它们。 理想情况下,我希望能够将表名作为参数传递给过程,因为当前它是硬编码的。 我所做的研究表明,我需要将过程中所有现有的SQL转换为使用动态SQL,以便从参数中拼接动态表名称,但是我想知道是否还有一种更简便的方法可以通过另一种方式引用该表? 例如: 如果是这样,如何从表名设置@MyTable变量? 我正在使用SQL

  • 问题内容: 我正在创建一些存储过程来管理我的数据库。特别是,我想创建一个存储过程来编辑特定行的一列,但是我想通过将列名作为参数传递来做到这一点。 那就是我想做的 使用该参数,我找到了要编辑的特定行,并且我想使用该参数来仅编辑我想要的列。 正如我在其他主题上所读到的那样,我已经尝试使用或定义局部变量,但没有找到解决方案。 有什么帮助吗? 问题答案: 您将需要使用 动态SQL : 请注意,正如Paul

  • 问题内容: 我正在使用一个存储过程,在其中发送数据库中其类型为的存储过程,并且还声明parameter 。 当我将列名传递为float时,它给出了错误: 消息8114,将数据类型nvarchar转换为float时出错。 这是我的测试查询 当我将参数类型更改为时,它给了我这个错误: 消息8117,操作数数据类型varchar对avg运算符无效。 我该如何解决? 更新 : 这是我的存储过程: 问题答案

  • 如何使用表(X)作为输入参数编写Oracle存储过程,并且在过程中使用表X与另一个表Y联接? 表X将有数千条记录。 不希望将表名传递为varchar,然后使用动态SQL(因此,此选项不在画面中)