Pro*C 中存在匿名 PL/SQL 块错误,但 SQL Developer 中没有:CSF-S-00201,必须声明标识符“RAISE_APPLICATION_ERROR”

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

在 Pro*C 文件中,我有一个非常简单的匿名 PL/SQL 块,如下所示:

EXEC SQL BEGIN DECLARE SECTION;
     unsigned long long stuff = 0;
EXEC SQL END DECLARE SECTION;

EXEC SQL EXECUTE
DECLARE
    nrows pls_integer := 0;
BEGIN
    select count(*) into nrows from tbl;

    if nrows != 1 then
        RAISE_APPLICATION_ERROR(-20000,
                    'The table must contain exactly one row');
    else
        select stuff into :stuff FROM tbl;
    end if;
END; 
END-EXEC;

Pro*C 抗议:

CSF-S-00201, identifier 'RAISE_APPLICATION_ERROR' must be declared

但是,将匿名 PL/SQL 块移至 SQL 开发人员(并添加填充变量):

VARIABLE stuff NUMBER;

DECLARE
    nrows pls_integer := 0;
BEGIN
    select count(*) into nrows from tbl;

    if nrows != 1 then
        RAISE_APPLICATION_ERROR(-20000,
                    'The table must contain exactly one row');
    else
        select stuff into :stuff FROM tbl;
    end if;
END;
/

工作正常。可能发生什么事?我用来编译 Pro*C 文件和在 SQL Developer 中执行块的架构是相同的。

我设置了以下选项:

sqlcheck=semantics
parse=partial
code=cpp
common_parser=yes
如果文件包含 PL/SQL 块,则

sqlcheck=semantics
是必需的,我尝试删除
common_parser=yes
但错误是相同的,并且我无法删除
parse=partial
code=cpp
,但我不认为无论如何都会有影响。

oracle plsql preprocessor oracle19c
1个回答
0
投票

不完全确定为什么有必要,但您可以通过显式引用

DBMS_STANDARD
包来避免错误:

    if nrows != 1 then
        DBMS_STANDARD.RAISE_APPLICATION_ERROR(-20000,
                    'The table must contain exactly one row');

PL/SQL 参考提到了

您可以引用包 STANDARD 和 DBMS_STANDARD 中声明的标识符,而无需使用包名称限定它们,除非您声明了具有相同名称的本地标识符

但 Pro*C 的情况并非如此。

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