2017-01-25 4 views
0

複数のCRUD操作を含むストアドプロシージャを、関数が定義されたパッケージに変換する作業が行われました。私は、Oracle SQL Developerでパッケージを作成しパッケージで定義された順番に関数を実行する

は、私は5月の関数を定義した:

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; 

私はそれらを実行し、I指定されたリストから実行する関数を選択できます。私の質問は、すべての機能を1つのコマンドで順番に実行させるには、何を書くか、または実行する必要がありますか?

おかげ

+0

おそらく、別のメソッド(関数またはプロシージャを必要に応じて)をパッケージに追加して順番に呼び出すように思えるかもしれません。私が知っていることはあなたのために何をするのか分からない。 –

+0

ところで、あなたのコミットは戻りません。 –

+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> 

、あなたがreturncommitを持っていることに気づく:commitが実行されることはありません。

+0

よかった、ありがとう!私のエラーも見つけてくれてありがとう。 – user2284341

関連する問題