如何在预言机存储过程中将值从 c# 传递到 refcursor 参数

本文关键字:参数 refcursor 预言机 存储 过程中 存储过程 | 更新日期: 2023-09-27 18:32:44

你能帮我把一个值从C#传递给refCursor类型吗?我尝试发送数据表,如下面的链接所示,但它不起作用。将数据表传递给 Oracle 存储过程的引用游标

存储过程:

PROCEDURE PROC_INS(  P_USERID IN VARCHAR2,
                     P_ATTACH_LIST IN SYS_REFCURSOR,
                     P_out      OUT NUMBER,
                     P_msg     OUT VARCHAR2) AS
V_BRS_USERID         VARCHAR2(50);
V_ATTACHMENT_TYPE_ID BRS_USER_ATTACHMENT.ATTACHMENT_TYPE_ID%TYPE;
V_FILE_NAME          BRS_USER_ATTACHMENT.FILE_NAME%TYPE;
V_FILE_SIZE          BRS_USER_ATTACHMENT.FILE_SIZE%TYPE;
V_FILE_DESCR         BRS_USER_ATTACHMENT.FILE_DESCR%TYPE; 
BEGIN 
LOOP 
FETCH P_ATTACH_LIST INTO V_BRS_USERID, V_ATTACHMENT_TYPE_ID,V_FILE_NAME, V_FILE_SIZE,   V_FILE_DESCR; 
EXIT WHEN P_ATTACH_LIST%NOTFOUND; 
INSERT INTO USER_ATTACHMENT VALUES
        (SEQ_RER_EMP_REP_ID.NEXTVAL,
          V_BRS_USERID,
          V_ATTACHMENT_TYPE_ID,
          V_FILE_NAME,
          V_FILE_SIZE,
          V_FILE_DESCR,
          NULL,
          NULL,
          0,
          0,
          'A',
          P_USERID,
          SYSDATE,
          NULL,
          NULL
        );
END LOOP; 
CLOSE P_ATTACH_LIST;
EXCEPTION
 WHEN OTHERS THEN
 ROLLBACK; -- Transaction mgmt
 p_out := 2;
 p_msg := sqlerrm;
  END PROC_REG_INS_ATTACH;  

如何在预言机存储过程中将值从 c# 传递到 refcursor 参数

这是该用户的重复帖子。请参阅将数据表传递给 Oracle 存储过程的引用游标

不能将数据表绑定到 ref 游标。您需要传入另一个 ref 游标,并且只能将其作为存储过程/函数的输出或针对匿名块中表的查询......也许您可以创建一个使用不同数据类型(如关联数组)的包装器存储过程。

http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html

Use OracleCommand i OracleParameter classes.注意 OracleParameter 的 ParameterDirection 属性。

这是我的代码中的示例,我正在调用web_shop_interface.kreiraj_mp_racun存储过程,并为其设置参数:

var fnRac = new OracleCommand();
fnRac.Connection = conn;
fnRac.CommandText = "web_shop_interface.kreiraj_mp_racun";
fnRac.CommandType = CommandType.StoredProcedure;
var ret = new OracleParameter("ret", OracleDbType.Varchar2);
ret.Direction = ParameterDirection.ReturnValue;
ret.Size = 4096;
fnRac.Parameters.Add(ret);
var p1 = new OracleParameter("did", OracleDbType.Decimal);
p1.Value = 15m;
p1.Direction = ParameterDirection.Input;
fnRac.Parameters.Add(p1);
var p2 = new OracleParameter("prn", OracleDbType.Varchar2);
p2.Value = "Invoice 15";
p2.Direction = ParameterDirection.Input;
fnRac.Parameters.Add(p2);
fnRac.ExecuteNonQuery();