从 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
我有自定义 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