The Oracle function is not a procedure or is undefined. Statement ignored

I am trying to call an Oracle function from C # that returns multiple rows but does not work. Here is the function I'm using:

create or replace function return_columns(
   tableName IN varchar
)
return types.ref_c
as
  c_result types.ref_c;
begin
  open c_result for
    select column_name 
      from all_tab_columns
     where table_name = tableName;

  return c_result;
end return_columns;

Here is a type:

create or replace package types
as
  type ref_c is ref cursor;
end;

I am in C # code calling a function like this:

OracleConnection oraConn = new OracleConnection("DATA SOURCE=MySource;PASSWORD=MyPassword;USER ID=MyID");
OracleCommand objCmd = new OracleCommand("MyID.RETURN_COLUMNS", oraConn);
objCmd.CommandType = CommandType.StoredProcedure;

OracleParameter oraParam = new OracleParameter("tableName", OracleType.VarChar);
oraParam.Value = "MY_TABLE";
oraCmd.Parameters.Add(oraParam);

oraConn .Open();

DataTable dt = new DataTable();

OracleDataAdapter ad = new OracleDataAdapter(objCmd);

ad.Fill(dt);

oraConn.Close();

And he keeps returning this error:

'RETURN_COLUMNS' is not a procedure or is undefined ORA-06550: line 1, column 7: PL/SQL: Statement ignored

What is wrong with my Oracle function?

+4
source share
2 answers

You just need to define another parameter - the parameter responsible for the return value. Here is an example:

OracleParameter retVal = new OracleParameter("retVal", OracleDbType.RefCursor);
retVal.Direction = ParameterDirection.ReturnValue;

Note # 1: The parameter retValmust first be added to the parameter list, otherwise you may receive an error ORA-00306: wrong number or type of arguments...

 cmd.Parameters.Add(retVal);    -- ReturnValue parameter is being added first 
 cmd.Parameters.Add(tabName);   -- then goes everything else

# 2: ODP .NET Microsoft Oracle (System.Data.OracleClient)

# 3: varchar2 varchar PL/SQL. , .

+3

- , ...

OracleParameter prm = cmd.CreateParameter();
prm.OracleDbType = OracleDbType.RefCursor;
prm.ParameterName = "retcurse";
prm.Direction = ParameterDirection.ReturnValue;
oraCmd.Parameters.Add(prm);

OracleRefCursor rc = (OracleRefCursor)prm.Value;

// Not sure about this next part off the top of my head... 

OracleDataAdapter ad = new OracleDataAdapter(objCmd);

DataSet ds = new DataSet();
ad.Fill(ds, "retcurse", rc);
// May also be this
// ad.Fill(ds, "retcurse", (OracleRefCursor)(oraCmd.Parameters["retcurse"].Value));
0

Source: https://habr.com/ru/post/1538877/


All Articles