Sobre como lidar com esse tipo de problema de sintaxe como iniciante, sugiro que você pratique a simplificação até o menor exemplo possível, para não se distrair com a lógica de junção.
Por exemplo, você pode testar isso rapidamente e ver que não funcionará :
declare
rc sys_refcursor;
begin
open rc for
case
when 1 = 1 then select * from dual -- not valid
end;
end;
que falha com
ORA-06550: line 6, column 29:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ...
porque o
open rc for select
sintaxe tem que ser uma única instrução e não pode ser dividida com lógica condicional. Observe como não há
create function
, parâmetros ou junções etc para complicar as coisas. Você pode adicionar todos eles de volta assim que tiver a sintaxe corrigida. O case
a sintaxe da instrução é aqui
. (Observe que existem alguns tipos diferentes de case
.) Precisa ser ou declare
rc sys_refcursor;
begin
case
when 1 = 1 then
open rc for select * from dual;
end case;
end;
ou o equivalente usando
if
:declare
rc sys_refcursor;
begin
if 1 = 1 then
open rc for select * from dual;
end if;
end;