Call a stored procedure with another in Oracle Call a stored procedure with another in Oracle oracle oracle

Call a stored procedure with another in Oracle


Your stored procedures work as coded. The problem is with the last line, it is unable to invoke either of your stored procedures.

Three choices in SQL*Plus are: call, exec, and an anoymous PL/SQL block.

call appears to be a SQL keyword, and is documented in the SQL Reference. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG The syntax diagram indicates that parentesis are required, even when no arguments are passed to the call routine.

CALL test_sp_1();

An anonymous PL/SQL block is PL/SQL that is not inside a named procedure, function, trigger, etc. It can be used to call your procedure.

BEGIN    test_sp_1;END;/

Exec is a SQL*Plus command that is a shortcut for the above anonymous block. EXEC <procedure_name> will be passed to the DB server as BEGIN <procedure_name>; END;

Full example:

SQL> SET SERVEROUTPUT ONSQL> 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();TestingTest worksCall completed.SQL> exec test_sp_1TestingTest worksPL/SQL procedure successfully completed.SQL> begin  2      test_sp_1;  3  end;  4  /TestingTest worksPL/SQL procedure successfully completed.SQL> 


Sure, you just call it from within the SP, there's no special syntax.

Ex:

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

If the procedure is in a different schema than the one the executing procedure is in, you need to prefix it with schema name.

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


@Michael Lockwood - you don't need to use the keyword "CALL" anywhere. You just need to mention the procedure call directly.

That is

Begin   proc1(input1, input2);end;/

instead of

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