存储过程 ERROR 1520.文件号:ORA-06502:PLSQL:当从oracle_cx python驱动调用时,数字或值错误。文件号:ORA-06502: PLSQL: 当从oracle_cx python驱动调用它时,数字或值错误。

问题描述 投票:0回答:1

我正在从Python程序中调用一个存储过程。

有一个问题发生在某些值上,例如当我发送值时,它失败了。2020,2017 但当我发送时,它成功了 2010,2050 等。会是什么问题?

DB版本。NLSRTL Version 11.2.0.4.0 - Production

Oracle_cx: latest

导致该问题的程序参数。P_FILE_YEAR IN NUMBER

错误信息。ERROR 1520.文件号:ORA-06502:PLSQL:数字或值错误:数字精度太大。文件号:ORA-06502:PLSQL:数字或值错误:数字精度太大。

它在以下异常中失败。

BEGIN
        SELECT  MAX(mlal_file_no) + 1
        INTO    ln_file_no
        FROM    doc_mail_allocation
        WHERE   mlal_file_year = P_FILE_YEAR
        AND     std_file_type_code = 2 ;
    EXCEPTION
        WHEN no_data_found THEN
            ln_file_no := 1 ;
        WHEN OTHERS THEN
            p_error_code := 1 ;
            p_error_msg  := 'ERROR 1520: File No:'||SQLERRM||' AND flal_file_year = '||P_FILE_YEAR;
            RETURN ;
    END ;
python oracle stored-procedures plsql cx-oracle
1个回答
1
投票

看起来是这样的。

样本数据:

SQL> select * From doc_mail_allocation;

MLAL_FILE_YEAR STD_FILE_TYPE_CODE MLAL_FILE_NO
-------------- ------------------ ------------
          2010                  2          100
          2020                  2          999

你的代码。

SQL> declare
  2    ln_file_no number(3);
  3  begin
  4    SELECT  MAX(mlal_file_no) + 1
  5          INTO    ln_file_no
  6          FROM    doc_mail_allocation
  7          WHERE   mlal_file_year = &P_FILE_YEAR
  8          AND     std_file_type_code = 2 ;
  9    dbms_output.put_line('result = ' || ln_file_no);
 10  end;
 11  /
Enter value for p_file_year: 2010
result = 101

PL/SQL procedure successfully completed.

SQL> /
Enter value for p_file_year: 2020
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 4


SQL>

看到区别了吗& 错误原因?如果你把一个变量声明为 "太小"(number(3)),为年 2020 MAX(mlal_file_no) + 1 等于1000,不能装入这样的变量。

解决办法?放大 ln_file_no或检查 何以 这种情况会发生(如果不应该发生)--那么数据就会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.