C#OleDb Oracle函数和表类型
我试图调用一个Oracle函数,该函数返回一个封装在表中的类型 类型对象C#OleDb Oracle函数和表类型,c#,function,oracle11g,oledb,oledbdatareader,C#,Function,Oracle11g,Oledb,Oledbdatareader,我试图调用一个Oracle函数,该函数返回一个封装在表中的类型 类型对象 create or replace type Z_TBL_STRUCTURE_CODE AS OBJECT ( PROJ_ID varchar2(50 BYTE) ); 类型表 create or replace type Z_TABLE_STRUCTURE_CODE AS TABLE of Z_TBL_STRUCTURE_CODE; 甲骨文功能 create or replace FUNCTION Z_TES
create or replace
type Z_TBL_STRUCTURE_CODE
AS OBJECT
(
PROJ_ID varchar2(50 BYTE)
);
类型表
create or replace
type Z_TABLE_STRUCTURE_CODE AS TABLE of Z_TBL_STRUCTURE_CODE;
甲骨文功能
create or replace
FUNCTION Z_TESTE_IN_FUNC
(
var_teste in varchar2
)
return Z_TABLE_STRUCTURE_CODE
AS
tab Z_TABLE_STRUCTURE_CODE;
BEGIN
EXECUTE IMMEDIATE
'SELECT
CAST(
MULTISET(
select count(*) into num from structure
where structure_code in ('|| var_teste ||')) as Z_TABLE_STRUCTURE_CODE)
into tab
from dual;';
dbms_output.put_line(var_teste);
return tab;
END Z_TESTE_IN_FUNC;
注意:请忽略executeimmediate,它只是用于测试
注2:我知道有一个选项可以避免类型(使用游标),但我还不能理解这个主题,所以我会要求您在回答时忽略游标,除非它是唯一可用的选项
C#代码
我得到的当前错误如下:
ORA-06550:第1行第13列:
PLS-00382:表达式类型错误
ORA-06550:第1行第7列:
PL/SQL:忽略语句
我在网上看到过类似的例子,但都是使用ExecuteScalar()或一些程序或函数代码返回奇异值,而不是表。如果您想返回单个值,我的建议是(针对多行编辑): 编辑2:尝试此功能
OleDbConnection con = new OleDbConnection(cntStr);
con.Open();
OleDbCommand cmd = new OleDbCommand("F_TESTFUNC", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OleDbParameter("retVal", OleDbType.VarChar, 11,ParameterDirection.ReturnValue, true, 0, 0, "retVal", DataRowVersion.Current,null);
cmd.Parameters.Add("ID", strID);
cmd.ExecuteScalar();
con.Close();
嗨,希勒姆,如果我想要一个单一的值就可以了。但我假装获得多个值和多行。我有一种方法可以做到这一点,但它不安全,而且容易发生sql注入(使用基本方法,将sql和变量设置为字符串,并在cmd.CommandText中发送字符串)。因为我想避免这样做,所以我尝试了我显示的方式,但它不起作用。所以我尝试了你的代码,我得到了以下错误:{System.Data.OleDb.OLEDBEException:ORA-06550:第1行,第7列:PLS-00221:“Z_TESTE_IN_FUNC”不是过程或未定义ORA-06550:第1行,第7列:PL/SQL:语句被忽略。我是否需要执行其他操作,因为我想执行一个函数?我可以在addwithParameter中使用我想要的任何名称吗?
OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleBD"].ConnectionString);
OleDbCommand cmd = new OleDbCommand("Z_TESTE_IN_FUNC", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@procValueName", "myValue");
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
conn.Open();
try
{
da.Fill(dt);
}
catch (Exception excp)
{
//Handle Exception
}
finally
{
conn.Close();
}
OleDbConnection con = new OleDbConnection(cntStr);
con.Open();
OleDbCommand cmd = new OleDbCommand("F_TESTFUNC", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OleDbParameter("retVal", OleDbType.VarChar, 11,ParameterDirection.ReturnValue, true, 0, 0, "retVal", DataRowVersion.Current,null);
cmd.Parameters.Add("ID", strID);
cmd.ExecuteScalar();
con.Close();