2014-12-02 2 views
0

Я использую клиент ODP.NET и Oracle 11g. Я передаю данные к процедуре с вводом refcursor.Pass datatable to refcursor хранимой процедуры Oracle

dtSample является DataTable с четырьмя колоннами, называемых Type, Name, Size и Description.

я получил ошибку

Недопустимый параметр связывания, имя параметра: 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;    
+0

Я не думаю, что вы можете это сделать. – OldProgrammer

+0

Затем, как я могу передавать данные с C# на refcursor –

+0

Вы не можете. Вам нужно будет передать другой курсор ref, и вы можете получить это только как результат работы хранимой процедуры/функции или запроса к таблице в анонимном блоке ... возможно, вы можете создать хранимую процедуру-оболочку, которая использует разные типы данных, такие как ассоциативные массивы. http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html –

ответ

0

Вы не можете. Вам нужно будет передать другой курсор ref, и вы можете получить это только как результат работы хранимой процедуры/функции или запроса к таблице в анонимном блоке ... возможно, вы можете создать хранимую процедуру-оболочку, которая использует разные типы данных, такие как ассоциативные массивы. http://www.oracle.com/technetwork/issue-archive/2006/06-jan/o16odpnet-087852.html

Смежные вопросы