我试图插入数据到Oracle数据库从ASP. NET MVC应用程序。我使用存储过程这样做,但我得到这个错误:
ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小ORA-06512:在“C#AET.KATEGORIJA_PKG”第40行ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小ORA-06512:在第1行
程序代码为:
PROCEDURE INS_KATEGORIJA
(
P_NAZIV IN KATEGORIJA.NAZIV%TYPE,
P_KATEGORIJA_ID OUT KATEGORIJA.KATEGORIJA_ID%TYPE,
P_REZULTAT OUT NUMBER,
P_PORUKA OUT VARCHAR2
)
IS
BEGIN
P_REZULTAT := 1;
SELECT KATEGORIJA_SEQ.NEXTVAL INTO P_KATEGORIJA_ID FROM DUAL;
INSERT INTO KATEGORIJA
VALUES (P_KATEGORIJA_ID, P_NAZIV);
P_REZULTAT := 0;
P_PORUKA := 'DB: Kategorija uspesno uneta.';
EXCEPTION
WHEN OTHERS THEN
P_REZULTAT := 1;
P_PORUKA := 'DB: ' ||SQLCODE|| ' - ' ||SQLERRM;
END INS_KATEGORIJA;
以及调用它的方法:
List<OracleParameter> izvrsiTransakciju(string nazivProcedure, List<OracleParameter> parametri, OracleTransaction transakcija)
{
try
{
using (OracleCommand komanda = new OracleCommand(nazivProcedure, konekcija))
{
komanda.Transaction = transakcija;
komanda.CommandType = CommandType.StoredProcedure;
komanda.BindByName = true;
List<OracleParameter> izlazniParametri = new List<OracleParameter>();
foreach (OracleParameter p in parametri)
{
komanda.Parameters.Add(p);
if (p.Direction != ParameterDirection.Input) izlazniParametri.Add(p);
}
komanda.ExecuteNonQuery();
return izlazniParametri;
}
}
catch (Exception ex)
{
throw new Exception("Greška pri izvršavanju transakcije: " + ex.Message);
}
}
与数据库通信的方法有:
public List<OracleParameter> PokreniTransakciju(string nazivProcedure, List<OracleParameter> parametri)
{
try
{
List<OracleParameter> listaParametara;
using (konekcija)
{
konekcija.Open();
using (OracleTransaction transakcija = konekcija.BeginTransaction())
{
listaParametara = izvrsiTransakciju(nazivProcedure, parametri, transakcija);
int rezultat = Convert.ToInt32(listaParametara.FirstOrDefault(x => x.ParameterName == "P_REZULTAT"));
if (rezultat != 0)
transakcija.Rollback();
else
transakcija.Commit();
return listaParametara;
}
}
}
catch (Exception ex)
{
throw ex;
}
}
List<OracleParameter> izvrsiTransakciju(string nazivProcedure, List<OracleParameter> parametri, OracleTransaction transakcija)
{
try
{
using (OracleCommand komanda = new OracleCommand(nazivProcedure, konekcija))
{
komanda.Transaction = transakcija;
komanda.CommandType = CommandType.StoredProcedure;
komanda.BindByName = true;
List<OracleParameter> izlazniParametri = new List<OracleParameter>();
foreach (OracleParameter p in parametri)
{
komanda.Parameters.Add(p);
if (p.Direction != ParameterDirection.Input) izlazniParametri.Add(p);
}
komanda.ExecuteNonQuery();
return izlazniParametri;
}
}
catch (Exception ex)
{
throw new Exception("Greška pri izvršavanju transakcije: " + ex.Message);
}
}
public OracleParameter NapraviParametar(string naziv, object vrednost, OracleDbType? tip, ParameterDirection pravac)
{
OracleParameter param = new OracleParameter();
param.ParameterName = naziv;
param.Direction = pravac;
if (tip != null)
param.OracleDbType = (OracleDbType)tip;
dodajVrednost(param, vrednost);
return param;
}
void dodajVrednost(OracleParameter param, object vrednost)
{
if (vrednost == null) return;
if (vrednost is int)
param.Value = (int)vrednost;
else if (vrednost is decimal)
param.Value = (decimal)vrednost;
else if (vrednost is string)
param.Value = (string)vrednost;
else if (vrednost is DateTime)
param.Value = (DateTime)vrednost;
}
有什么想法吗?提前谢谢你!
[解决方案]在LauDec的帮助下,我发现在定义Varchar2
参数时,必须指定OracleParameter
对象的size
属性。补充了这一点,问题就解决了。
显然,它来自调用INS_KATEGORIJA
过程时受影响的P_PORUKA
out参数变量,该过程太小,无法存储您试图输入的消息(基于注释中的讨论)。
如果你从你的包裹里打电话给INS_KATEGORIJA,我会理解你的行为:
DECLARE
PORUKA VARCHAR2(10);
KATEGORIJA_ID NUMBER;
REZULTA NUMBER;
BEGIN
INS_KATEGORIJA('TEST',KATEGORIJA_ID,REZULTA,PORUKA);
END;
这肯定会引发所提到的错误消息。但我没想到从外面打电话来。(您的代码是直接调用INS_KATEGORIJA还是从调用INS_KATEGORIJA的包中调用另一个过程?)
我猜您必须更改PokreniTransakciju
调用程序中的代码,该调用程序定义用于调用过程的out变量(及其大小)
编辑:根据OP的评论,原因如下:
当定义Varchar2类型的OracleParameter时,OracleParameter。大小是必需的(如果不是手动设置,则似乎设置为0)。
这里是我的过程中,我过滤4个参数的数据库: 开始日期、结束日期、小时和分钟。 当我过滤数据之间2017-11-01到2017-11-30(与一个月)它的工作罚款,但当我过滤数据大于1个月,如2017-11-01到2017-12-10然后它给我的错误如下。 程序 错误 ORA-06502:PL/SQL:数字或值错误 ORA-06512:在"MYRENT. RENTEDTOTALCARS",第58行
我在执行触发器时遇到以下错误: 请说明问题的原因。 编辑 数据类型:
我实现了一个返回clob数据类型的函数,我希望在DBMS输出中打印结果。不幸的是,我得到了ORA-06502:PL/SQL:numeric或value错误,我认为这是由于dbms_output的大小造成的。 这是密码。 这里有一些东西可以帮助您理解这个问题 1)添加了以下内容来设置缓冲区的大小不受限制,但不起作用… 3)我可以通过执行以下操作来解决这个问题,但我认为这不是一个好的解决方案,因为它执
我得到了 ORA-06502:PL/SQL:以下代码中出现数值或值错误:
我正在尝试编写一个调用oracle存储过程的web服务。该过程有两个输入-一个字符串(公司代码)和一个int(客户代码)。它有2个输出参数;一个数字(pout_addr_code)和一个varchar2(pout_descr)。当我从sqldeveloper运行这个过程时,一切正常,两个值都按预期返回。当我从C#web服务调用该过程时,我在执行时(而不是在编译期间)得到错误“Oracle.Data
我有一个程序,从表中读取值,生成一个csv文件并将其发送。这个过程一直运行良好,直到我在DB中输入了新条目,之后它无法生成CSV文件。该过程引发异常“ORA-06502:PL/SQL:numeric or value error:character string buff”,我已尝试打印从表中读取的值,以检查它是否正常工作。 通过打印这些值,我可以看到一个新条目没有被正确读取,我相信这可能是问题的