Oracle 数据访问 ORA-06512: 字符串缓冲区太小
Posted
技术标签:
【中文标题】Oracle 数据访问 ORA-06512: 字符串缓冲区太小【英文标题】:Oracle Data Access ORA-06512: character string buffer too small 【发布时间】:2014-08-20 20:31:13 【问题描述】:当我打电话给GetTest
时,我收到了这个错误:
字符串缓冲区太小 ORA-06512
这是我的 c# 方法:
public string GetTEST()
using (var conn = new OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Dbconnection"].ConnectionString))
OracleCommand cmd = new OracleCommand("Package.GetTEST");
cmd.BindByName = true;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Varchar2,1000,ParameterDirection.Output);
cmd.ExecuteNonQuery();
var t = cmd.Parameters["P_OUT_MESSAGE"].Value;
Oracle 程序:
PROCEDURE GetTEST
(
P_OUT_MESSAGE OUT VARCHAR2
)
IS
BEGIN
p_out_message := 'Un problème a été signalé pour votre propriété. Veuillez communiquer avec le Service de l''évaluation au 418 111-7878 ou à l''adresse test@tesst.com';
END;
【问题讨论】:
指定大小为 9999999999999999999 的目的是什么? 确保 p_out_message 大小足够... 【参考方案1】:这显然不是你想要的,但似乎ODP.NET使用.NET端的参数长度作为out参数的长度...
这将解决您的问题:
cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Varchar2, 32767, "x".PadRight(500, 'x'), ParameterDirection.Output);
但这更好,虽然不完全正确,但它有效:
cmd.Parameters.Add("P_OUT_MESSAGE", OracleDbType.Clob, ParameterDirection.Output);
或者,如果可能,最好避免使用out
参数并使用标量返回值或表函数。
【讨论】:
是的,确实如此。我什至尝试了新的 Oracle.ManagedDataAccess,但也失败了。 这对我不起作用,但我不会反对,因为很明显它适用于某些人。 @dan:感谢您的评论。你能详细说明“不工作”的部分吗?也许您可以提出一个新问题,参考这个问题,也许我们可以找到适合您的方法。 @PatrickHofman 在尝试这两种解决方案时,我仍然得到ORA-06502: PL/SQL: numeric or value error: NULL index table key value
。
@dan 是否与您代码中的另一个问题有关。似乎与函数的内部代码有关。见here。以上是关于Oracle 数据访问 ORA-06512: 字符串缓冲区太小的主要内容,如果未能解决你的问题,请参考以下文章
Oracle ORA-06512&ORA-08103对象已不存在
Oracle错误——ORA-39002:操作无效ORA-39070:无法打开日志文件ORA-06512:在“SYS.UTL_FILE”,line
oracle数据库alert日志报:ORA-12012: 自动执行作业 211 出错 ORA-12541: TNS: 无监听程序