【问题标题】:Pass datatable to refcursor of Oracle stored procedure将数据表传递给 Oracle 存储过程的 refcursor
【发布时间】:2014-12-05 17:47:14
【问题描述】:

我正在使用 ODP.NET 和 Oracle 11g 客户端。我将一个数据表传递给一个以refcursor 作为输入的过程。

dtSampleDataTable,有四列分别称为TypeNameSizeDescription

我有错误

参数绑定无效,参数名称:ParameterName

在线上

db.ExecuteNonQuery(oracleCommand);

完整代码:

OracleCommand oracleCommand = new OracleCommand();
oracleCommand.CommandType = CommandType.StoredProcedure;
oracleCommand.CommandText = "PCK_ADMIN.PROC_INS";
oracleCommand.Parameters.Add("P_USERID", OracleDbType.Varchar2).Value = "abcd";
oracleCommand.Parameters.Add("P_ATTACH_LIST", OracleDbType.RefCursor).Value = dtSample;
oracleCommand.Parameters.Add("P_out", OracleDbType.Int32).Direction = ParameterDirection.Output;
oracleCommand.Parameters.Add("P_msg", OracleDbType.Varchar2, 50).Direction = ParameterDirection.Output;

db.ExecuteNonQuery(oracleCommand);

存储过程:

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
  • 你不能。您需要传入另一个 ref 游标,您只能将其作为存储过程/函数的输出,或对匿名块中的表的查询......也许您可以创建一个使用不同的包装存储过程数据类型,例如关联数组。 oracle.com/technetwork/issue-archive/2006/06-jan/…

标签: oracle11g odp.net


【解决方案1】:

你不能。您需要传入另一个 ref 游标,并且只能将其作为存储过程/函数的输出,或对匿名块中的表的查询......也许您可以创建一个使用不同的包装存储过程数据类型,例如关联数组。 http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 2020-03-05
    • 2012-02-10
    • 1970-01-01
    • 2015-08-20
    • 2011-10-23
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多