调用oracle函数从C#
问题描述:
我已经定制的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工作正常。 我该如何解决这个问题&
答
你不能直接在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 CURSORs和Cursor Variable Declaratioñ
THX。现在我这样做。这个很好的解决方法,但我认为正确的方式是使用CommandType.StoredProcedure并在执行后获取返回值。 –