当前位置: 首页 > 知识库问答 >
问题:

ORA-06502: PL/SQL:存储过程和ASP. NET MVC的数字或值错误

蓟捷
2023-03-14

我试图插入数据到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属性。补充了这一点,问题就解决了。

共有1个答案

李康安
2023-03-14

显然,它来自调用INS_KATEGORIJA过程时受影响的P_PORUKAout参数变量,该过程太小,无法存储您试图输入的消息(基于注释中的讨论)。

如果你从你的包裹里打电话给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”,我已尝试打印从表中读取的值,以检查它是否正常工作。 通过打印这些值,我可以看到一个新条目没有被正确读取,我相信这可能是问题的