2010-11-24 3 views
5

table of numbers의 사용자 지정 데이터 형식을 매개 변수 중 하나로 사용하는 프로 시저를 호출하려고합니다.프로 시저 매개 변수의 Oracle UDT에 대한 바인딩이 잘못되었습니다.

create type num_list as table of number; 

그리고 절차의 정의 : : 여기

이 유형의 정의는 다음과 같이

create or replace procedure my_procedure 
    (listofnumbers num_list, 
        v_value char) 
is 
begin 

    update my_table 
    set my_column = v_value 
    where my_row_id in (select column_value 
         from table(listofnumbers)); 

end; 

는 ODP.NET 및 C#을 사용하여, 나는 그것을 선언하고 있습니다 :

var row_ids = new int[] { 1, 2 }; 

using (var oracleConn = new Oracle.DataAccess.Client.OracleConnection(myConnectionString)) 
{ 
    oracleConn.Open(); 
    var cmd = new Oracle.DataAccess.Client.OracleCommand("my_procedure", oracleConn); 
    cmd.CommandType = CommandType.StoredProcedure; 

    var param1 = new Oracle.DataAccess.Client.OracleParameter("listofnumbers", Oracle.DataAccess.Client.OracleDbType.Array, ParameterDirection.Input); 
    param1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray; 
    param1.UdtTypeName = "num_list"; 
    param1.Value = row_ids; 
    cmd.Parameters.Add(param1); 

    var param2 = new Oracle.DataAccess.Client.OracleParameter("v_value ", Oracle.DataAccess.Client.OracleDbType.Char, ParameterDirection.Input); 
    param2.Value = "Y"; 
    cmd.Parameters.Add(param2); 

    cmd.ExecuteNonQuery(); 
} 

throw되는 예외 상태 :

잘못된 매개 변수 바인딩 매개 변수 이름 : listofnumbers

속성 내가 매개 변수를 정의 실종 무엇

?

+0

안녕하세요, 어떻게 해결하셨습니까? 아래 답변은 저에게 효과적이지 않았습니다. – Jason

+0

수정 된 답변에 게시 된 링크에서 제공되는 솔루션을 사용해보십시오. –

+0

추신 : 나에게 적합한 대답은 다음과 같습니다. UdtTypeName을 설정하지 말고 대신 CollectionType을 사용하십시오. –

답변

2

편집 : 14

내 대답은 용인되지 얻었다 바와 같이, 여기에 사용 될 수있는 링크가 있습니다

http://developergeeks.com/article/35/working-with-user-defined-type-oracle-udt-and-custom-type-using-odp-net-11g


불행하게도 나는이 같은 주위에 재생할 수 없습니다 UDT를 지원하지 않는 x64 ODP.NET이 있습니다.

그러나 UDT가 컬렉션이므로 param1에서 Size 속성을 설정하려고 했습니까?

param1.Size = row_ids.Length; 

자,이 UDT 아니지만, 여기에 내가 같은 패키지 사양에 정의 된 형식에 바인딩 방법 코드입니다 :

TYPE t_stringlist IS TABLE OF VARCHAR2(4000); 

      string[] values = new string[] { "AAA", "BBB" }; 

      OracleParameter parameter = new OracleParameter(); 
      parameter.Name = "my_param"; 
      parameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
      parameter.OracleDbType = OracleDbType.Varchar2; 
      parameter.ArrayBindSize = new int[values.Length]; 
      parameter.ArrayBindStatus = new OracleParameterStatus[values.Length]; 
      parameter.Size = values.Length; 

      for (int i = 0; i < values.Length; ++i) 
      { 
       parameter.ArrayBindSize[i] = 4000; 
       parameter.ArrayBindStatus[i] = OracleParameterStatus.Success; 
      } 

      parameter.Value = values; 

나는 확실하지 않다 어떤 값 ArrayBindSize를로 설정할 수 있습니다.

또한, 당신이 당신의 UDT에 대한 형 공장을 만드는 것이 좋습니다 수 있습니다

http://download.oracle.com/docs/html/E15167_01/featUDTs.htm

을 어쨌든, 나는 당신이하는 데 도움이 여기서 뭔가를 찾을 수 있기를 바랍니다.

관련 문제