从 c# 调用具有自定义类型 return 值的 oracle 函数

Calling oracle function with custom type return value from c#

我有自定义 oracle 数据类型:

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

type tTClients is table of tClients;

和具有 return 流水线 tTClients 值的 oracle 函数:

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 工作正常。 我该如何解决这个问题&

您不能直接在 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 那么您的函数必须 return SYS_REFCURSOR 类型,请参阅 Using PL/SQL Stored Procedures and REF CURSORs and Cursor Variable Declaration