Est-ce que quelqu'un connaît un moyen, ou même si c'est possible, d'appeler une procédure stockée depuis un autre? Si oui, comment le feriez-vous?
Voici mon code de test:
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;
Vos procédures stockées fonctionnent comme codées. Le problème est avec la dernière ligne, il est impossible d'appeler l'une de vos procédures stockées.
Trois choix dans SQL * Plus sont: call
, exec
et un bloc PL/SQL anormal.
call
semble être un mot clé SQL et est documenté dans la référence SQL. http://download.Oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG Le diagramme de syntaxe indique que la parentèse est requise, même si aucun argument n'est transmis. la routine d'appel.
CALL test_sp_1();
Un bloc PL/SQL anonyme est un bloc PL/SQL qui ne se trouve pas dans une procédure nommée, une fonction, un déclencheur, etc. Il peut être utilisé pour appeler votre procédure.
BEGIN
test_sp_1;
END;
/
Exec
est une commande SQL * Plus qui constitue un raccourci pour le bloc anonyme ci-dessus. EXEC <procedure_name>
sera transmis au serveur de base de données en tant que BEGIN <procedure_name>; END;
Exemple complet:
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>
Bien sûr, vous l'appelez simplement depuis le SP, il n'y a pas de syntaxe spéciale.
Ex:
PROCEDURE some_sp
AS
BEGIN
some_other_sp('parm1', 10, 20.42);
END;
Si la procédure se trouve dans un schéma différent de celui de la procédure en cours d'exécution, vous devez le préfixer avec le nom du schéma.
PROCEDURE some_sp
AS
BEGIN
other_schema.some_other_sp('parm1', 10, 20.42);
END;
Appel d'une procédure d'une autre procédure:
Un pour une procédure normale:
CREATE OR REPLACE SP_1() AS
BEGIN
/* BODY */
END SP_1;
Procédure d'appel SP_1 à partir de SP_2:
CREATE OR REPLACE SP_2() AS
BEGIN
/* CALL PROCEDURE SP_1 */
SP_1();
END SP_2;
Appelez une procédure avec REFCURSOR ou le curseur de sortie:
CREATE OR REPLACE SP_1
(
oCurSp1 OUT SYS_REFCURSOR
) AS
BEGIN
/*BODY */
END SP_1;
Appelez la procédure SP_1 qui renvoie le REFCURSOR en tant que paramètre de sortie.
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;
Pour appeler la procédure à partir de la ligne de commande SQLPlus, essayez l’une des méthodes suivantes:
CALL test_sp_1();
EXEC test_sp_1
@ Michael Lockwood - vous n'avez pas besoin d'utiliser le mot clé "APPELER" nulle part. Vous devez juste mentionner l'appel de procédure directement.
C'est
Begin
proc1(input1, input2);
end;
/
au lieu de
Begin
call proc1(input1, input2);
end;
/