【发布时间】:2020-06-07 11:42:31
【问题描述】:
我有一个这样定义的 SQL 函数:
create or replace function func_cmap_unit_test
(what varchar2)
return varchar2 as
begin
return 'hello ' || what || '!';
end func_cmap_unit_test;
我在 SQL Developer 中测试过,效果很好:
select portal_ops.func_cmap_unit_test('world') from dual;
我有以下 C# 代码:
Command.CommandText = funcName;
Command.CommandType = CommandType.StoredProcedure;
Command.Parameters.Add(
new OracleParameter
(
"Output"
, TypeMapping[typeof(T)]
//, OracleDbType.Clob
, ParameterDirection.ReturnValue
)
);
foreach ((string name, object value) param in spParams)
{
Command.Parameters.Add(param.name, param.value);
}
if (Command.Connection.State == ConnectionState.Closed)
{
Command.Connection.Open();
}
Command.ExecuteNonQuery();
return (T)Command.Parameters[0].Value;
问题是Command.ExecuteNonQuery 一直失败
ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小
正如您在注释代码中看到的那样,当我将 OracleDbType 切换到 Clob 时,ExecuteNonQuery 通过了。我很困惑为什么它不适用于OracleDBType。非常感谢任何帮助。
【问题讨论】:
-
你返回一个
VARCHAR2,那么参数类型也应该是OracleDbType.Varchar2而不是OracleDbType.Clob -
我认为对于
OracleDbType.Varchar2返回值,您必须指定参数的Size(即长度)属性。
标签: oracle odp.net executenonquery ora-06502