Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Chamar um procedimento armazenado com outro no Oracle


Seus procedimentos armazenados funcionam como codificados. O problema é com a última linha, ela não consegue invocar nenhum de seus procedimentos armazenados.

Três opções no SQL*Plus são:call , exec , e um bloco PL/SQL anônimo.

call parece ser uma palavra-chave SQL e está documentada na Referência SQL. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG O diagrama de sintaxe indica que os parênteses são necessários, mesmo quando nenhum argumento é passado para a rotina de chamada.
CALL test_sp_1();

Um bloco PL/SQL anônimo é PL/SQL que não está dentro de um procedimento nomeado, função, gatilho, etc. Ele pode ser usado para chamar seu procedimento.
BEGIN
    test_sp_1;
END;
/

Exec é um comando SQL*Plus que é um atalho para o bloco anônimo acima. EXEC <procedure_name> será passado para o servidor DB como BEGIN <procedure_name>; END;

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