Я думаю, что проблема в том, что ваш тип вывода не Varchar2, как вы определили в этой строке:
cmd.Parameters.Add(new OracleParameter("p_system_details", OracleDbType.Varchar2)
У вас есть p_system_details
, определенный как объект varchar2s и даты, а не один varchar2. Тип возврата может быть Array
в зависимости от того, какой драйвер доступа к данным Oracle вы используете. Например, это решение использует тип возврата Array
для их UDT.
Если ваш драйвер должным образом не поддерживает UDT как тип, я думаю, что одним из вариантов является то, что вы изменяете тип возвращаемого значения вашей хранимой процедуры на что-то, что поддерживает драйвер, например что-то вроде Oracle SYS_REFCURSOR
, определенного в .NET as OracleDbType.RefCursor
может возвращать те же элементы данных, которые вы ищете.
create or replace PROCEDURE AOF_JOE_TEST_CURSOR_SP (p_system_details OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_system_details FOR
SELECT
'Test1' as sys_id,
'Test2' as sys_name,
'Test3' as sys_desc,
SYSDATE as sys_start_date
FROM DUAL;
END;
Тогда ваш параметр определяется в .NET как:
OracleParameter cursorParameter = new OracleParameter();
cursorParameter.ParameterName = "p_system_details";
cursorParameter.Direction = ParameterDirection.Output;
cursorParameter.OracleDbType = OracleDbType.RefCursor;
cmd.Parameters.Add(cursorParameter);