将datatable传递给Oracle存储过程的refcursor
问题描述:
我正在使用ODP.NET和Oracle 11g客户端。我将一个数据表传递给一个输入为refcursor
的过程。将datatable传递给Oracle存储过程的refcursor
dtSample
是DataTable
四列名为Type
,Name
,Size
和Description
。
我有错误
无效参数绑定,参数名称:参数名称
在该行
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;
答
你不行。您需要传递另一个引用游标,并且只能将其作为存储过程/函数的输出或对匿名块中的表进行查询......也许您可以创建一个使用不同的包装器存储过程数据类型,如关联数组。 http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html
我不认为你可以这样做。 – OldProgrammer 2014-12-02 13:07:19
那么,我怎样才能将数据从C#传递给refcursor – 2014-12-02 13:11:35
你不能。您需要传递另一个引用游标,并且只能将其作为存储过程/函数的输出或对匿名块中的表进行查询......也许您可以创建一个使用不同的包装器存储过程数据类型,如关联数组。 http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html – 2014-12-03 08:23:03