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

Posted

技术标签:

【中文标题】按包中定义的顺序执行函数【英文标题】:Executing functions in sequence defined in a package 【发布时间】:2017-01-25 16:23:55 【问题描述】:

我的任务是将一个包含多个 CRUD 操作的存储过程转换为一个定义了函数的包。

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

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

我在“包体”中有对应的代码:

 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;  

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

谢谢

【问题讨论】:

听起来你可能只是在你的包中添加另一个方法(函数或过程,根据需要),它按顺序调用它们。我不知道哪个会为你做这件事。 顺便说一句,您的提交无效,因为它在返回语句之后 如果你想要一种更通用的方法来做到这一点,你需要编写一个接受某种对象类型数组的过程,其中该类型有某种“run()”方法,所以该过程可以逐步遍历执行每个方法的数组。 【参考方案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>

关于您的代码,请注意您在return 之后有一个commitcommit 将永远不会被执行。

【讨论】:

以上是关于按包中定义的顺序执行函数的主要内容,如果未能解决你的问题,请参考以下文章

go程序执行顺序

Go语言的执行顺序(转)

Golang中的init函数

Golang之goroutine

显式设置 NuGet 包中定义的构建目标的顺序

js 怎么让方法执行有先后顺序