Som Amarillo sa att du inte kan köra en lokalt definierad procedur dynamiskt, eftersom den inte finns i SQL-omfattningen som den dynamiska sektionen kommer att använda.
Situationen du beskriver är att alla procedurer är definierade i det anonyma blockets DECLARE
sektionen och du kör en fråga som talar om för dig vilken av dem du ska köra - och förmodligen som också ger dig argumenten att passera. Du kan bara använda en if
/else
konstruktion eller ett case
uttalande för att utföra lämpliga procedurer, något som:
DECLARE
...
BEGIN
FOR data IN (SELECT procname, arg1, arg2, ... from <your_query>) LOOP
CASE data.procname
WHEN 'OPENLOG' THEN
openlog(data.arg1);
WHEN 'WRITELOG' THEN
writelog(data.arg1, data.arg2);
WHEN ...
...
ELSE
-- handle/report an invalid procedure name
-- or skip the `ELSE` and let CASE_NOT_FOUND be thrown
END CASE;
END LOOP;
END;
/
Du behöver bara en WHEN
villkor och lämplig proceduruppmaning för varje procedur. Du kan också antingen ha en ELSE
för att fånga eventuella oväntade procedurnamn eller låta CASE_NOT_FOUND
undantag (ORA-06592) kastas, beroende på vad du behöver hända om det någonsin inträffar.