我正在尝试使用ADO .NET调用存储过程,我收到以下错误:
ORA-01460 - 未实施或 要求无理转换
我试图调用的存储过程具有以下参数:
param1 IN VARCHAR2,
param2 IN NUMBER,
param3 IN VARCHAR2,
param4 OUT NUMBER,
param5 OUT NUMBER,
param6 OUT NUMBER,
param7 OUT VARCHAR2
下面是我用来调用存储过程的C#代码:
OracleCommand command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MY_PROC";
OracleParameter param1 = new OracleParameter() { ParameterName = "param1", Direction = ParameterDirection.Input,
Value = p1, OracleDbType = OracleDbType.Varchar2, Size = p1.Length };
OracleParameter param2 = new OracleParameter() { ParameterName = "param2", Direction = ParameterDirection.Input,
Value = p2, OracleDbType = OracleDbType.Decimal };
OracleParameter param3 = new OracleParameter() { ParameterName = "param3", Direction = ParameterDirection.Input,
Value = p3, OracleDbType = OracleDbType.Varchar2, Size = p3.Length };
OracleParameter param4 = new OracleParameter() { ParameterName = "param4", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Decimal };
OracleParameter param5 = new OracleParameter() { ParameterName = "param5", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Decimal};
OracleParameter param6 = new OracleParameter() { ParameterName = "param6", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Decimal };
OracleParameter param7 = new OracleParameter() { ParameterName = "param7", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Varchar2, Size = 32767 };
command.Parameters.Add(param1);
command.Parameters.Add(param2);
command.Parameters.Add(param3);
command.Parameters.Add(param4);
command.Parameters.Add(param5);
command.Parameters.Add(param6);
command.Parameters.Add(param7);
command.ExecuteNonQuery();
任何想法我做错了什么?
答案 0 :(得分:1)
不确定它是否相关但SQL VARCHAR2值限制为4000(尽管PL / SQL可以应付32,000)
您可以尝试将“尺寸= 32767”修改为较小的尺寸(例如500)并查看是否有效。
还要查看要传入的字符串的大小。如果其中一个是50000个字符,则可能是问题。
答案 1 :(得分:1)
我有一个适用于10.2.0.1的应用程序,并且突然与11.1.0.7客户端一起得到了上述错误。
切换到11.2.0.1 oracle客户端修复了该问题。
但是在你的情况下,我会首先检查你的客户端的NLS设置是否与数据库匹配(或者至少是兼容的)
Theres不保证它是同一个问题,但你至少可以仔细检查它。
//很抱歉只是看到它已经修好了,但有时这些信息对其他人有用
干杯, 喝醉
答案 2 :(得分:0)
你在哪里将值推入参数?
编辑:抱歉,不好问题。相反,你正在推动参数的价值是什么? ADO.NET实现不会检查您在客户端输入参数的对象的类型;服务器负责验证对象类型是否与您给定的DB参数类型进行网格划分。转换错误可能是由于将参数声明为OracleDbType.Decimal,然后意外地将字符串推入其中而引起的。