Jak řekl Amarillo, lokálně definovanou proceduru nemůžete provádět dynamicky, protože neexistuje v rozsahu SQL, který bude dynamická sekce používat.
Situace, kterou popisujete, je taková, že všechny procedury jsou definovány v DECLARE
anonymního bloku a spouštíte dotaz, který vám říká, které z nich se mají provést - a pravděpodobně také dává argumenty, které je třeba předat. Stačí použít if
/else
konstrukt nebo case
příkaz k provedení příslušných procedur, něco jako:
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;
/
Stačí vám jeden WHEN
podmínky a příslušné procedury vyžadují každou proceduru. Můžete mít také ELSE
zachytit neočekávané názvy procedur nebo nechat CASE_NOT_FOUND
výjimka (ORA-06592) bude vyvolána v závislosti na tom, co se musí stát, pokud k tomu někdy dojde.