6502 来自 ODP.NET 函数返回字符串
6502 from ODP.NET on a function returning string
我有一个 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: numeric or value error: character string buffer too small
正如您在注释代码中看到的,当我将 OracleDbType
切换为 Clob
时,ExecuteNonQuery
通过了。我很困惑为什么它不适用于 OracleDBType
。非常感谢任何帮助。
从技术上讲,下面的代码显示了您的需要。对于字符串类型参数的输出类型需要提供大小,否则为1
。请记住,参数 return 的值将为 OracleString
。你可以在上面查看IsNull
属性
string retval = null;
using (var conn = new OracleConnection("conn str . . .")
{
using (var cmd= new OracleCommand(funcName, conn)
{
cmd = CommandType.StoredProcedure;
var p = new OracleParameter("out", OracleDbType.Varchar2, 200).Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(p);
foreach ((string name, object value) param in spParams)
{
Command.Parameters.Add(param.name, param.value);
}
conn.Open();
cmd.ExecuteNonQuery();
retval = cmd.Parameters[0].Value.ToString();
}
}
我有一个 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: numeric or value error: character string buffer too small
正如您在注释代码中看到的,当我将 OracleDbType
切换为 Clob
时,ExecuteNonQuery
通过了。我很困惑为什么它不适用于 OracleDBType
。非常感谢任何帮助。
从技术上讲,下面的代码显示了您的需要。对于字符串类型参数的输出类型需要提供大小,否则为1
。请记住,参数 return 的值将为 OracleString
。你可以在上面查看IsNull
属性
string retval = null;
using (var conn = new OracleConnection("conn str . . .")
{
using (var cmd= new OracleCommand(funcName, conn)
{
cmd = CommandType.StoredProcedure;
var p = new OracleParameter("out", OracleDbType.Varchar2, 200).Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(p);
foreach ((string name, object value) param in spParams)
{
Command.Parameters.Add(param.name, param.value);
}
conn.Open();
cmd.ExecuteNonQuery();
retval = cmd.Parameters[0].Value.ToString();
}
}