Chiama una stored procedure con un’altra in Oracle

Qualcuno sa di un modo, o anche se è ansible, di chiamare una stored procedure da un’altra? Se sì, come lo faresti?

Ecco il mio codice di prova:

SET SERVEROUTPUT ON; DROP PROCEDURE test_sp_1; DROP PROCEDURE test_sp; CREATE PROCEDURE test_sp AS BEGIN DBMS_OUTPUT.PUT_LINE('Test works'); END; / CREATE PROCEDURE test_sp_1 AS BEGIN DBMS_OUTPUT.PUT_LINE('Testing'); test_sp; END; / CALL test_sp_1; 

Le tue stored procedure funzionano come codificate. Il problema è con l’ultima riga, non è in grado di richiamare nessuna delle stored procedure.

Tre scelte in SQL * Plus sono: call , exec e un blocco PL / SQL anonimo.

call sembra essere una parola chiave SQL ed è documentata nel Riferimento SQL. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG Il diagramma di syntax indica che è richiesta la parentesi anche quando non vengono passati argomenti alla routine di chiamata.

 CALL test_sp_1(); 

Un blocco PL / SQL anonimo è PL / SQL che non si trova all’interno di una procedura, funzione, trigger, ecc., Che può essere utilizzato per chiamare la procedura.

 BEGIN test_sp_1; END; / 

Exec è un comando SQL * Plus che è una scorciatoia per il blocco anonimo sopra. EXEC verrà passato al server DB come BEGIN ; END; BEGIN ; END;

Esempio completo:

 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> 

Certo, lo chiami da dentro l’SP, non c’è una syntax speciale.

Ex:

  PROCEDURE some_sp AS BEGIN some_other_sp('parm1', 10, 20.42); END; 

Se la procedura si trova in uno schema diverso da quello in cui si trova la procedura di esecuzione, è necessario aggiungerlo al nome dello schema.

  PROCEDURE some_sp AS BEGIN other_schema.some_other_sp('parm1', 10, 20.42); END; 

Per richiamare la procedura dalla riga di comando di SQLPlus, provare uno di questi:

 CALL test_sp_1(); EXEC test_sp_1 

@ Michael Lockwood – non è necessario utilizzare la parola chiave “CALL” ovunque. Devi solo menzionare direttamente la procedura di chiamata.

Questo è

 Begin proc1(input1, input2); end; / 

invece di

 Begin call proc1(input1, input2); end; / 

Chiamare una procedura da un’altra procedura:

Uno per una normale procedura:

 CREATE OR REPLACE SP_1() AS BEGIN /* BODY */ END SP_1; 

Procedura di chiamata SP_1 da SP_2:

 CREATE OR REPLACE SP_2() AS BEGIN /* CALL PROCEDURE SP_1 */ SP_1(); END SP_2; 

Chiamare una procedura con REFCURSOR o il cursore di output:

 CREATE OR REPLACE SP_1 ( oCurSp1 OUT SYS_REFCURSOR ) AS BEGIN /*BODY */ END SP_1; 

Chiamare la procedura SP_1 che restituirà il REFCURSOR come parametro di output

 CREATE OR REPLACE SP_2 ( oCurSp2 OUT SYS_REFCURSOR ) AS `enter code here` BEGIN /* CALL PROCEDURE SP_1 WITH REF CURSOR AS OUTPUT PARAMETER */ SP_1(oCurSp2); END SP_2;