sql >> Database >  >> RDS >> Oracle

Roep een opgeslagen procedure aan met een andere in Oracle

Uw opgeslagen procedures werken als gecodeerd. Het probleem zit in de laatste regel, deze kan geen van uw opgeslagen procedures oproepen.

Drie keuzes in SQL*Plus zijn:call , exec , en een vreemd PL/SQL-blok.

call lijkt een SQL-sleutelwoord te zijn en is gedocumenteerd in de SQL Reference. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG Het syntaxisdiagram geeft aan dat parentese vereist is, zelfs als er geen argumenten worden doorgegeven aan de oproeproutine.

CALL test_sp_1();

Een anoniem PL/SQL-blok is PL/SQL dat zich niet in een benoemde procedure, functie, trigger, enz. bevindt. Het kan worden gebruikt om uw procedure aan te roepen.

BEGIN
    test_sp_1;
END;
/

Exec is een SQL*Plus-opdracht die een snelkoppeling is voor het bovenstaande anonieme blok. EXEC <procedure_name> wordt doorgegeven aan de DB-server als BEGIN <procedure_name>; END;

Volledig voorbeeld:

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> 


  1. Hoe FIND_IN_SET() werkt in MariaDB

  2. Voorwaardelijke opmaak toepassen op een getal in SQL Server met FORMAT()

  3. Hoe voeg ik meerdere checkbox-waarden in een tabel in?

  4. Fout:PLS-00428:er wordt een into-clausule verwacht in deze select-instructie