按包中定义的顺序执行函数
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
之后有一个commit
:commit
将永远不会被执行。
【讨论】:
以上是关于按包中定义的顺序执行函数的主要内容,如果未能解决你的问题,请参考以下文章