sql >> Base de Datos >  >> RDS >> Oracle

Llame a un procedimiento almacenado con otro en Oracle

Sus procedimientos almacenados funcionan según lo codificado. El problema está en la última línea, no puede invocar ninguno de sus procedimientos almacenados.

Tres opciones en SQL*Plus son:call , exec y un bloque PL/SQL anónimo.

call parece ser una palabra clave de SQL y está documentada en la Referencia de SQL. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG El diagrama de sintaxis indica que se requieren paréntesis, incluso cuando no se pasan argumentos a la rutina de llamada.

CALL test_sp_1();

Un bloque PL/SQL anónimo es PL/SQL que no está dentro de un procedimiento, función, disparador, etc. con nombre. Puede usarse para llamar a su procedimiento.

BEGIN
    test_sp_1;
END;
/

Exec es un comando SQL*Plus que es un atajo para el bloque anónimo anterior. EXEC <procedure_name> se pasará al servidor de base de datos como BEGIN <procedure_name>; END;

Ejemplo 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>