在 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 开发人员(并添加 stuff 变量):
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
sqlcheck=semantics
如果文件包含 PL/SQL 块,则 是强制性的,我尝试删除common_parser=yes
但错误是相同的,并且我无法删除parse=partial
and code=cpp
,但我认为这不会对其产生任何影响。
DBMS_STANDARD
不完全确定为什么有必要,但您可以通过显式引用该包来避免错误:PL /SQL 参考文献提到
但 Pro*C 的情况并非如此。