2016-12-02 123 views
0

我已经定制的Oracle数据类型:调用oracle函数从C#

type tClients is record(
    id  NUMBER, 
    name VARCHAR2(1000 CHAR), 
    tax varchar2(30), 
    IsClient  number 
); 

type tTClients is table of tClients; 

和Oracle功能与tTClients的返回值流水线:

function getClients(p_Organization_Name varchar2, 
          p_Director_Last_Name varchar2, 
         ) return tTClients 
     pipelined; 

我使用ODP.NET和尝试在C#中的下一个代码:

using(OracleConnection conOra=new OracleConnection(oraConStr)) 
      { 
       conOra.Open(); 
       using (OracleCommand cmd = new OracleCommand("MQ_CRM.CC_NEW.getClients",conOra)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 

        cmd.Parameters.Add(new OracleParameter("p_Organization_Name", OracleDbType.Varchar2, "мяскин", ParameterDirection.Input)); 
        cmd.Parameters.Add(new OracleParameter("p_Director_Last_Name", OracleDbType.Varchar2,"", ParameterDirection.Input)); 
       //return parameter 
        OracleParameter p = new OracleParameter(); 
        p.OracleDbType = OracleDbType.RefCursor; 
        p.UdtTypeName = "MQ_CRM.CC_NEW.tTClients"; 
        p.Direction = ParameterDirection.ReturnValue; 

        cmd.Parameters.Add(p); 


        try 
        { 
         cmd.ExecuteReader(); 
        } 
        catch(Exception ex) 
        { 
         MessageBox.Show(ex.Message); 
        } 

       } 
      } 

有例外ORA-06550。直接执行这个函数sqlplus工作正常。 我该如何解决这个问题&

回答

1

你不能直接在ODP.NET中使用自定义类型。但是,你可以使用它作为

OracleCommand cmd = new OracleCommand(); 
cmd.Connection = conOra; 
cmd.CommandText = "SELECT * FROM TABLE(MQ_CRM.CC_NEW.getClients(:p_Organization_Name, :p_Director_Last_Name)) "; 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.Add(new OracleParameter("p_Organization_Name", OracleDbType.Varchar2, "мяскин", ParameterDirection.Input)); 
cmd.Parameters.Add(new OracleParameter("p_Director_Last_Name", OracleDbType.Varchar2,"", ParameterDirection.Input)); 
OracleDataReader dr = cmd.ExecuteReader(); 

如果你想拿回OracleDbType.RefCursor那么你的函数必须返回SYS_REFCURSOR类型,请参阅Using PL/SQL Stored Procedures and REF CURSORsCursor Variable Declaratioñ

+0

THX。现在我这样做。这个很好的解决方法,但我认为正确的方式是使用CommandType.StoredProcedure并在执行后获取返回值。 –