Call a stored procedure with another in Oracle

后端 未结 5 1904
北荒
北荒 2020-11-27 15:57

Does anyone know of a way, or even if its possible, to call a stored procedure from within another? If so, how would you do it?

Here is my test code:



        
相关标签:
5条回答
  • 2020-11-27 16:09

    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;
    
    0 讨论(0)
  • 2020-11-27 16:10

    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 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> 
    
    0 讨论(0)
  • 2020-11-27 16:12

    To invoke the procedure from the SQLPlus command line, try one of these:

    CALL test_sp_1();
    EXEC test_sp_1
    
    0 讨论(0)
  • 2020-11-27 16:19

    Calling one procedure from another procedure:

    One for a normal procedure:

    CREATE OR REPLACE SP_1() AS 
    BEGIN
    /*  BODY */
    END SP_1;
    

    Calling procedure SP_1 from SP_2:

    CREATE OR REPLACE SP_2() AS
    BEGIN
    /* CALL PROCEDURE SP_1 */
    SP_1();
    END SP_2;
    

    Call a procedure with REFCURSOR or output cursor:

    CREATE OR REPLACE SP_1
    (
    oCurSp1 OUT SYS_REFCURSOR
    ) AS
    BEGIN
    /*BODY */
    END SP_1;
    

    Call the procedure SP_1 which will return the REFCURSOR as an output parameter

    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;
    
    0 讨论(0)
  • 2020-11-27 16:25

    @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;
    /
    
    0 讨论(0)
提交回复
热议问题