我已经完成了将具有多个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;
当我运行它们时,我可以从提供的列表中选择要运行的功能。我的问题是我需要编写或做什么才能使用一个命令按顺序运行所有函数?
谢谢
答案 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
之后您有return
:commit
永远不会被执行。