我正在从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 ;
看起来是这样的。
样本数据:
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
或检查 何以 这种情况会发生(如果不应该发生)--那么数据就会出现错误。