在 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
,但我不认为无论如何都会有影响。
不完全确定为什么有必要,但您可以通过显式引用
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 的情况并非如此。