0

Un package est créé pour définir une collection personnalisée et un proc stocké ayant cette collection personnalisée en tant que paramètre d'entrée. Comment puis-je appeler ce proc de C#?Transférer UDT défini dans un package en tant que paramètre de proc stocké dans Oracle

Voici le paquet:

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; 

est ici mise en œuvre de l'usine de customCollectionType:

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 
} 

Voici l'appel:

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(); 

L'erreur .Net est:

"OCI -22303: tapez \ "USER_NAME \". \ "CUSTOMCOLLECTIONTYPE \" introuvable "

Répondre

0

Lorsque vous passez un objet à la procédure de C# qui est mappé à un UDT, vous devez définir le type au niveau du schéma niveau et pas au niveau du paquet. Donc, vous devez exécuter la commande suivante dans sqlplus: -

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

et de supprimer la déclaration de customCollectionType de vos spécifications de package.

+0

Merci, Max. J'ai défini les types en dehors du paquet. Les erreurs sont affichées dans ce lien: http://stackoverflow.com/questions/15503720/pls-00386-type-mismatch-found-between-fetch-cursor-and-into-variables –

Questions connexes