web-dev-qa-db-fra.com

Appeler une procédure stockée avec une autre dans Oracle

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;
35
electricsheep

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> 
46
Shannon Severance

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;
14
dcp

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;
2
Nirav savla

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
2
Dave Costa

@ 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;
/
2
Rajesh Chamarthi