Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#OleDb Oracle函数和表类型_C#_Function_Oracle11g_Oledb_Oledbdatareader - Fatal编程技术网

C#OleDb 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

我试图调用一个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_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();