En ce qui concerne la façon de gérer ce type de problème de syntaxe en tant que débutant, je vous suggère de vous entraîner à le simplifier jusqu'au plus petit exemple possible, afin de ne pas être distrait par la logique de jointure.
Par exemple, vous pouvez rapidement tester cela et voir que cela ne fonctionnera pas :
declare
rc sys_refcursor;
begin
open rc for
case
when 1 = 1 then select * from dual -- not valid
end;
end;
qui échoue avec
ORA-06550: line 6, column 29:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ...
parce que le open rc for select
la syntaxe doit être une seule instruction et ne peut pas être divisée avec une logique conditionnelle.
Remarquez qu'il n'y a pas de create function
, paramètres ou jointures etc pour compliquer les choses. Vous pouvez ajouter tous ces éléments une fois que vous avez corrigé la syntaxe. Le case
la syntaxe de l'instruction est ici
. (Notez qu'il existe plusieurs types de case
.) Il doit être soit
declare
rc sys_refcursor;
begin
case
when 1 = 1 then
open rc for select * from dual;
end case;
end;
ou l'équivalent en utilisant if
:
declare
rc sys_refcursor;
begin
if 1 = 1 then
open rc for select * from dual;
end if;
end;