2017-01-25 2 views
0

Мне поручено преобразовать хранимую процедуру с несколькими операциями 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; 

Когда я запускаю их, я может выбрать, какую функцию запускать из предоставленного списка. Мой вопрос в том, что мне нужно написать или сделать, чтобы все функции выполнялись последовательно с одной командой?

благодаря

+0

Похоже, вы могли бы просто добавить в свой пакет другой метод (функцию или процедуру), который вызывает их по порядку. Я ничего не знаю о том, что сделало бы это для вас. –

+0

BTW, ваша фиксация не имеет никакого эффекта, так как она появляется после оператора возврата. –

+0

Если вы хотите использовать более общий способ, вам нужно написать процедуру, которая приняла массив некоторого типа объекта, где тип имел некоторые вид метода «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> 

О коде, обратите внимание, что у вас есть commit после return: commit никогда не будет выполнена.

+0

Отлично, спасибо! Спасибо, что тоже заметила мою ошибку. – user2284341

Смежные вопросы