PLSQL过程,它将dependend包引用作为参数

时间:2015-05-21 08:46:50

标签: oracle stored-procedures plsql refactoring

我有一个oracle PLSQL程序,在三个不同的程序包中看起来完全相同。

CREATE OR REPLACE PACKAGE BODY PACK_A 
AS
   PROCEDURE PROC_A
   IS 
      TYPE ref_c_data IS REF CURSOR RETURN data_rec%ROWTYPE;
      TYPE ref_c_items IS REF CURSOR RETURN items_rec%ROWTYPE;
   BEGIN
      ...
      PACK_A.PROC_B(ref_c_data, ref_c_items)
      ...
   END;
   PROCEDURE PROC_B
   -- This procedure is different in all three packages
   END;
END;
/

现在我想将PACK_A.PROC_A提取到一个公共包中,这样我就不必三次维护相同的源。我想到了......像:

CREATE OR REPLACE PACKAGE BODY PACK_A 
AS
   PROCEDURE PROC_A
   IS
      TYPE ref_c_data IS REF CURSOR RETURN data_rec%ROWTYPE;
      TYPE ref_c_items IS REF CURSOR RETURN items_rec%ROWTYPE;
   BEGIN
      PACK_COMMON.PROC_A(ref_c_data, ref_c_items)
   END;
   PROCEDURE PROC_B
   -- This procedure is different in all three packages
   END;
END;
/

我遇到的问题是我不知道如何告诉PACK_COMMON.PROC_A哪个包PACK_APACK_BPACK_C过程PROC_B应该被称为?

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

如果你真的必须这样做,你需要为公共过程A提供一个参数,然后使用它来说明你想要呼叫哪个过程B.

例如:

create package body pack_common
as
  procedure proc_a (p_proc_to_call varchar2)
  is
    ...
  begin
    ...
    if p_proc = 'PACK_A' then
       pack_a.proc_b;
    elsif p_proc = 'PACK_B' then
       pack_b.proc_b;
    ...
    end if;
    ...
  end proc_a;
end pack_common;
/