2016-12-02 122 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並在執行後獲取返回值。 –