Java 执行存储过程时发生Oracle错误:ORA-06502:PL/SQL:数字或值错误

Java 执行存储过程时发生Oracle错误:ORA-06502:PL/SQL:数字或值错误,java,angularjs,oracle,Java,Angularjs,Oracle,这是完全错误: 代码:-6502 消息:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:位于“MYDATABASE” 以下是我在java服务中执行过程的方式: public String[] execpross_p_hra_int_population_trim () throws SQLException, Exception { Connect("DBALIAS"); String SQL = "{call EDD_CONFID.P_HR

这是完全错误:

代码:-6502
消息:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:位于“MYDATABASE”

以下是我在java服务中执行过程的方式:

public String[] execpross_p_hra_int_population_trim () throws SQLException, Exception {
    Connect("DBALIAS");

    String SQL = "{call EDD_CONFID.P_HRA_INT_POPULATION_TRIM (?, ?)}";
    CallableStatement cs = conn.prepareCall (SQL);

    String status[];
    status = new String[2];

    Integer P_CODEERREUR = 0;
    String P_TEXTEERREUR = null;

    try {

        cs.registerOutParameter(1, java.sql.Types.INTEGER);
        cs.registerOutParameter(2, java.sql.Types.VARCHAR);

       cs.executeUpdate();
    }
    catch (SQLException e) {
      System.out.println("Erreur SQL : "+e);
    }
    finally {

       P_CODEERREUR = cs.getInt(1);
       P_TEXTEERREUR = cs.getString(2);

       cs.close();
    }

    status[0] = P_CODEERREUR.toString();
    status[1] = P_TEXTEERREUR;
    return status;
}
我正在为我的基础(12.1.0.2.0)使用正确的JDBC驱动程序

经过大量研究,这似乎是一个“地区”问题。因为我的基地是法语的。我尝试添加本地语言,甚至Oracle提供的国际化java库。但似乎什么都不管用

我不能真正调试存储过程,因为我没有这样做,但是当我用SQLDeveloper执行它时,一切看起来都很好

现在我有一些奇怪的行为,在我的开发环境中,每当我启动服务时,我都会出现相同的错误,但几分钟后,它就开始正常工作了。这怎么可能呢

因此,到目前为止,我的结论是,要么我需要找到一种方法来处理NLS_LANG设置(我真的不知道如何在我的案例中使用它),要么我的数据库中有一些不兼容的数据。但我无法识别它


我知道这是一个具体的问题,我不是在寻找一个直接的解决方案,只要你们能帮我朝着正确的方向走?因为我在这里迷路了。

看起来错误在过程中,所以您需要查看完整的堆栈跟踪(从
e
)以获得行号,并且还可以查看过程代码;您可以在
all_source
中看到;但可能被包装,或者您可能没有特权。您的假设是有一个字符串变量对于多字节值来说太小了?不过,您显示的错误是英文的,那么为什么您认为这是一个法语问题,以及您如何/在哪里设置区域设置?@AlexPoole非常感谢您的快速回答。我正在与过程程序员联系,我确实可以在我的SQLDeveloper IDE中看到它。当我们直接从那里执行时,一切似乎都很好。只有当我的API(我添加的方法)尝试执行它时,问题才会发生。这是我的错是的。我尝试在java代码中设置区域设置,但似乎没有任何变化,这就是为什么我不确定这是解决方案。如果您可以从堆栈跟踪中看到过程代码和行号,您可以看到错误实际来自何处?即使您不能在这里发布过程代码,也应该缩小范围。(我猜发生了一些真正的错误,proc正在捕获这些错误,并试图将错误代码复制到局部变量中,然后复制到out参数中;并且局部变量太小。但是纯粹的推测…)您是否通过Java和SQL Developer以同一个DB用户的身份连接?不,在过程中。但是没有看到amd堆栈的代码跟踪,这只是(毫无意义的)猜测。我不相信你如何从Java中调用它会成为问题,Java字符串的大小太大了。您是否以同一个DB用户的身份进行所有签名?如果不是,则过程(或它所属的包)是否定义为authid current_user?实际上,假设
EDD_CONFID
是一个包而不是一个模式,那么在所有产品/功能代码之后是否存在包实例化代码,即
begin
块中的代码?如果有,并且这是导致错误的原因,它可能会解释您在dev env中看到了什么。会话中的第一个调用遇到错误,后续调用不会,因为每个会话只发生一次实例化?不过仍然是猜测。