按顺序执行包中定义的函数

时间:2017-01-25 16:23:55

标签: oracle plsql

我已经完成了将具有多个CRUD操作的存储过程转换为具有已定义函数的包的任务。

当我在Oracle SQL Developer中创建包时,我定义了可能的功能:

FUNCTION func1 RETURN NUMBER;
FUNCTION func2 RETURN NUMBER;
etc...

我在'package body'中有相应的代码:

 FUNCTION func1 RETURN NUMBER
    IS
          BEGIN     
              -- some CRUD operation
          END;

          RETURN 0;
          COMMIT;

        EXCEPTION
        WHEN OTHERS THEN
           dbms_output.put_line('FUNCTION func1: error ' || ERR_NUM || ', Msg:' || ERR_MSG);
           ROLLBACK;
 END func1;  

当我运行它们时,我可以从提供的列表中选择要运行的功能。我的问题是我需要编写或做什么才能使用一个命令按顺序运行所有函数?

谢谢

1 个答案:

答案 0 :(得分:1)

如果需要按给定顺序运行某些过程,则需要构建一个过程或匿名块,以正确的顺序调用过程。 例如:

create or replace package aPackage is
    procedure runAll;
end;   

create or replace package body aPackage is
    procedure proc1 is
    begin
        dbms_output.put_line('Procedure 1');
    end proc1;
    --
    procedure proc2 is
    begin
        dbms_output.put_line('Procedure 2');
    end proc2;

    procedure runAll is    
    begin
        proc1;
        --
        proc2;
        --
    end runAll;

end; 

电话:

SQL> exec aPackage.runAll;
Procedure 1
Procedure 2

PL/SQL procedure successfully completed.

SQL>

我使用过程来调用它们而不需要将结果赋给变量,但是对于函数来说,这个想法是一样的。

有功能:

create or replace package aPackageFun is
    function runAll return number;
end;    

create or replace package body aPackageFun is
    function fun1 return number  is
    begin
        dbms_output.put_line('Inside function 1');
        return 1;
    end fun1;
    --
    function fun2 return number  is
    begin
        dbms_output.put_line('Inside function  2');
        return 2;
    end fun2;

    function runAll return number is  
        vNum1 number;
        vNum2 number;  
    begin
        vNum1 := fun1();
        --
        vNum2 := fun2();
        --
        return vNum1 + vNum2; 
    end runAll;

end; 

电话:

SQL> select aPackageFun.runAll() from dual;

APACKAGEFUN.RUNALL()
--------------------
                   3

Inside function 1
Inside function  2
SQL>

关于您的代码,请注意commit之后您有returncommit永远不会被执行。