Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Rufen Sie eine gespeicherte Prozedur mit einer anderen in Oracle auf

Ihre gespeicherten Prozeduren funktionieren wie codiert. Das Problem liegt in der letzten Zeile, sie kann keine Ihrer gespeicherten Prozeduren aufrufen.

Drei Möglichkeiten in SQL*Plus sind:call , exec , und ein anonymer PL/SQL-Block.

call scheint ein SQL-Schlüsselwort zu sein und ist in der SQL-Referenz dokumentiert. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG Das Syntaxdiagramm zeigt an, dass Elternteile erforderlich sind, selbst wenn keine Argumente an die Aufrufroutine übergeben werden.

CALL test_sp_1();

Ein anonymer PL/SQL-Block ist PL/SQL, das sich nicht in einer benannten Prozedur, Funktion, Trigger usw. befindet. Er kann verwendet werden, um Ihre Prozedur aufzurufen.

BEGIN
    test_sp_1;
END;
/

Exec ist ein SQL*Plus-Befehl, der eine Abkürzung für den obigen anonymen Block darstellt. EXEC <procedure_name> wird als BEGIN <procedure_name>; END;

Vollständiges Beispiel:

SQL> SET SERVEROUTPUT ON
SQL> CREATE OR REPLACE PROCEDURE test_sp 
  2  AS 
  3  BEGIN 
  4      DBMS_OUTPUT.PUT_LINE('Test works'); 
  5  END;
  6  /

Procedure created.

SQL> CREATE OR REPLACE PROCEDURE test_sp_1 
  2  AS
  3  BEGIN
  4      DBMS_OUTPUT.PUT_LINE('Testing'); 
  5      test_sp; 
  6  END;
  7  /

Procedure created.

SQL> CALL test_sp_1();
Testing
Test works

Call completed.

SQL> exec test_sp_1
Testing
Test works

PL/SQL procedure successfully completed.

SQL> begin
  2      test_sp_1;
  3  end;
  4  /
Testing
Test works

PL/SQL procedure successfully completed.

SQL>