validateconversion不在包中编译,而是作为独立过程进行编译



当我尝试在plsql中使用validate_enversion时,我遇到了一个编译错误。

Error: PLS-00801: Interner Fehler [*** ASSERT at file pdz2.c, line 5361; The_Exp is null.; TEST__DBNAME__B__2920081[10, 3]]
Line: 10
Text: END;

有趣的是,只有在包中编译时才会出现此错误。MWE是:

CREATE OR REPLACE PACKAGE test IS
PROCEDURE my_VALIDATE_CONVERSION(asNbr VARCHAR2);
END test;
/
CREATE OR REPLACE PACKAGE BODY test IS
PROCEDURE my_VALIDATE_CONVERSION(asNbr VARCHAR2) IS
BEGIN
CASE VALIDATE_CONVERSION(asNbr AS NUMBER, '999999D99', ' NLS_NUMERIC_CHARACTERS = '',.''')
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('He');
ELSE
DBMS_OUTPUT.PUT_LINE('Cu');
END CASE;
END;
BEGIN
NULL;
END test;
/

如果编译为独立的过程my_VALIDATE_CONVERSION,它工作得很好。

CREATE OR REPLACE PROCEDURE my_VALIDATE_CONVERSION(asNbr VARCHAR2) IS
BEGIN
CASE VALIDATE_CONVERSION(asNbr AS NUMBER, '999999D99', ' NLS_NUMERIC_CHARACTERS = '',.''')
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('He');
ELSE
DBMS_OUTPUT.PUT_LINE('Cu');
END CASE;
END;

这是怎么回事?

我正在使用:

  • PL/SQL开发人员13.0.6.1911版(64位(
  • Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0

看起来像是数据库中的一个错误。我会尝试升级到Oracle 19c或将最新的补丁集应用到您的数据库。我能够在我的数据库(19.6.0.0.0版本(中编译你的包,没有任何错误。

这个内部故障肯定会在过程编译中发生。事实上,它并没有表明包的编译是在打开PLSQL_DEBUG的情况下完成的,而过程的编译是不打开的。

当您在CCD_ 2编译成功。

Select Validate_Conversion(p_Oran AS Number) Into IsNumeric From dual; --COMPILED
IsNumeric := Validate_Conversion(p_Oran AS Number); --FAILURE
If Validate_conversion(p_Oran AS Number) = 0 Then  --FAILURE

在此处输入图像描述

最新更新