sql >> Databáze >  >> RDS >> Oracle

Jak provést místní proceduru pomocí spustit immedate?

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.



  1. Design tak, aby reprezentoval přihlášení a odhlášení zaměstnanců

  2. Otázka návrhu DB týkající se cizích klíčů s hodnotou Null a normalizace

  3. Použití ADO asynchronně v aplikaci Microsoft Access k urychlení formulářů

  4. Chyba automatického přírůstku mysql