0

이 사용자 정의 콜렉션을 입력 매개 변수로 갖는 저장 프로 시저와 사용자 정의 콜렉션을 정의하는 패키지가 작성됩니다. 이 proc를 C#에서 어떻게 호출합니까? 전화 여기패키지에 정의 된 UDT를 Oracle에 저장된 proc 매개 변수로 전달하십시오.

public class PlaceHolderType : IOracleCustomType, INullable 
{ 
    [OracleArrayMapping()] 
    public string[] Array; 
    private bool m_bIsNull; 
    private OracleUdtStatus[] m_statusArray; 

    public OracleUdtStatus[] StatusArray 
    { 
     get 
     { 
      return this.m_statusArray; 
     } 
     set 
     { 
      this.m_statusArray = value; 
     } 
    } 

    public virtual bool IsNull 
    { 
     get 
     { 
      return m_bIsNull; 
     } 
    } 

    public static PlaceHolderType Null 
    { 
     get 
     { 
      PlaceHolderType p = new PlaceHolderType(); 
      p.m_bIsNull = true; 
      return p; 
     } 
    } 

    public virtual void FromCustomObject(OracleConnection con, IntPtr pUdt) 
    { 
     OracleUdt.SetValue(con, pUdt, 0, Array, m_statusArray); 
     return; 
    } 

    public virtual void ToCustomObject(OracleConnection con, IntPtr pUdt) 
    { 
     object objectStatusArray = null; 
     Array = (string[])OracleUdt.GetValue(con, pUdt, 0, out objectStatusArray); 
     m_statusArray = (OracleUdtStatus[])objectStatusArray; 
    } 

    public override string ToString() 
    { 
     return string.Empty; 
    } 
} 

[OracleCustomTypeMappingAttribute("USER_NAME.PKG_NAME.CUSTOMCOLLECTIONTYPE")] 
public class CUSTOMCOLLECTIONTYPE: IOracleCustomTypeFactory, IOracleArrayTypeFactory 
{ 
    // Implementation of IOracleCustomTypeFactory.CreateObject() 
    public IOracleCustomType CreateObject() 
    { 
     // Return a new custom object 
     //OracleString or; 
     return new PlaceHolderType(); 
    } 

    #region IOracleArrayTypeFactory Members 
    public Array CreateArray(int numElems) 
    { 
     return new string[numElems]; 
    } 

    public Array CreateStatusArray(int numElems) 
    { 
     return new OracleUdtStatus[numElems]; 
    } 

    #endregion 
} 

것 :

cmd.Connection = OracleConnectionObj; 
cmd.BindByName = true; 
cmd.CommandText = "PKG_NAME.PROC_NAME"; 
cmd.CommandType = System.Data.CommandType.StoredProcedure; 
OracleParameter param1 = new OracleParameter(); 
Array inputValue = (new CUSTOMCOLLECTIONTYPE()).CreateArray(5); 
System.Array.Copy(SomeArray, inputValue, 5); 
param1.OracleDbType = OracleDbType.Array; 
param1.Direction = ParameterDirection.Input; 
param1.UdtTypeName = "USER_NAME.CUSTOMCOLLECTIONTYPE"; 
param1.Value = inputValue; 
cmd.Parameters.Add(param1); 
cmd.ExecuteNonQuery(); 

닷넷의 오류는 다음과 같습니다

CREATE OR REPLACE PACKAGE pkg_name 
AS 
    TYPE customCollectionType IS VARRAY(200) OF VARCHAR2 (1000); 

    PROCEDURE ProcName(p_collection IN customCollectionType); 
END pkg_name; 
/
CREATE OR REPLACE PACKAGE BODY pkg_name 
AS 
    PROCEDURE StudyProc (p_StudyNum IN  customCollectionType) 
    IS 
    ........................ 
END pkg_name; 

여기 customCollectionType의 팩토리 구현의 : 여기

는 패키지의 "OCI -22303 : \ "USER_NAME \"을 입력하십시오. "CUSTOMCOLLECTIONTYPE"을 (를) 찾을 수 없습니다. "CUSTOMCOLLECTIONTYPE \"

답변

0

UDT에 매핑 된 C#의 프로 시저에 객체를 전달할 때 스키마에서 유형을 정의해야합니다 패키지 수준이 아닌 레벨입니다.

Create Type customCollectionType AS VARRAY(200) OF VARCHAR2 (1000); 

및 패키지 사양에서 customCollectionType의 선언을 제거 - : 그래서, 당신은 SQLPLUS에서 다음 명령을 실행해야합니다.

+0

감사합니다. 패키지 외부에 유형을 정의했습니다. 오류는 다음 링크에 게시됩니다. http://stackoverflow.com/questions/15503720/pls-00386-type-mismatch-found-between-fetch-cursor-and-into-variables –