Em um arquivo Pro*C, tenho um bloco PL/SQL anônimo muito simples como este:
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;
Protestos Pro*C com:
CSF-S-00201, identifier 'RAISE_APPLICATION_ERROR' must be declared
No entanto, movendo o bloco PL/SQL anônimo para o desenvolvedor SQL (e adicionando uma variável 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;
/
funciona bem. O que poderia estar acontecendo? O esquema que estou usando para compilar o arquivo Pro*C e executar o bloco no SQL Developer é o mesmo.
Eu configurei as seguintes opções:
sqlcheck=semantics
parse=partial
code=cpp
common_parser=yes
sqlcheck=semantics
é obrigatório se o arquivo contiver blocos PL/SQL, tentei remover, common_parser=yes
mas o erro é o mesmo e não consigo remover parse=partial
and code=cpp
, mas não acho que isso afetaria de forma alguma.
Não tenho certeza por que isso é necessário, mas você pode evitar o erro referindo-se explicitamente ao
DBMS_STANDARD
pacote:A referência PL/SQL menciona que
mas esse não é o caso do Pro*C.