我有一个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_A
,PACK_B
或PACK_C
过程PROC_B
应该被称为?
我怎样才能做到这一点?
答案 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;
/