я пытаюсь вызвать функцию 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;
ПРИМЕЧАНИЕ: ПОЖАЛУЙСТА, ИГНОРИРУЙТЕ НЕМЕДЛЕННОЕ ВЫПОЛНЕНИЕ, ЭТО ТОЛЬКО ДЛЯ ТЕСТА.
ПРИМЕЧАНИЕ 2: Я ЗНАЮ, ЧТО ЕСТЬ ВОЗМОЖНОСТЬ ИЗБЕЖАТЬ ТИПОВ (ИСПОЛЬЗУЯ КУРСОРЫ), НО Я ЕЩЕ НЕ СМОГ ПОНЯТЬ ТЕМУ, ПОЭТОМУ Я ПРОШУ ВАС ИГНОРИРОВАТЬ КУРСЫ ПРИ ОТВЕТЕ, ЕСЛИ ЭТО ЕДИНСТВЕННЫЙ ВАРИАНТ.
Код С#
public DataTable getTaskStartFinish()
{
OleDbConnection con = null;
OleDbDataReader reader = null;
try{
con = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleBD"].ConnectionString);
OleDbCommand cmd = new OleDbCommand("", con);
cmd.CommandText = "Z_TESTE_IN_FUNC";
cmd.CommandType = CommandType.StoredProcedure;
OleDbParameter retval = new OleDbParameter("retval", OleDbType.VarChar, 10);
retval.Direction = ParameterDirection.ReturnValue;
OleDbParameter inval = new OleDbParameter("inval", OleDbType.Variant, 50);
inval.Direction = ParameterDirection.Input;
inval.Value = "1";
cmd.Parameters.Add(retval);
cmd.Parameters.Add(inval);
con.Open();
reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
return dt;
}
catch(Exception ex)
{
throw new Exception("getTaskStartFinish error: " + ex.Message);
}
finally
{
if(con != null)
con.Close();
if(reader != null || !reader.IsClosed)
reader.Close();
}
}
Текущая ошибка, которую я получаю, следующая: ORA-06550: строка 1, столбец 13: PLS-00382: выражение имеет неправильный тип ORA-06550: строка 1, столбец 7: PL/SQL: оператор игнорируется
Я видел в сети подобные примеры, но все они использовали ExecuteScalar() или некоторый код для процедур или функций, возвращающих единичные значения, но не таблицы.