Относно това как да се справите с този вид синтактичен проблем като начинаещ, предлагам ви да се упражнявате да го опростявате до възможно най-малкия пример, така че да не се разсейвате от логиката на свързване.
Например, можете бързо да тествате това и да видите, че няма да работи :
declare
rc sys_refcursor;
begin
open rc for
case
when 1 = 1 then select * from dual -- not valid
end;
end;
което се проваля с
ORA-06550: line 6, column 29:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ...
защото open rc for select
синтаксисът трябва да бъде един израз и не може да бъде разделян с условна логика.
Забележете как няма create function
, параметри или съединения и т.н., за да усложните нещата. Можете да добавите всички тези обратно, след като сте изяснили синтаксиса. case
синтаксисът на израза е тук
. (Забележете, че има няколко различни вида case
.) Трябва да бъде или
declare
rc sys_refcursor;
begin
case
when 1 = 1 then
open rc for select * from dual;
end case;
end;
или еквивалент с помощта на if
:
declare
rc sys_refcursor;
begin
if 1 = 1 then
open rc for select * from dual;
end if;
end;