Как вызвать процедуру в пакете из другой процедуры в другом пакете?
Есть две процедуры, name1 и name2, которые находяться в разных пакетах. И я хочу вызвать name2 процедуру в name1 процедуре.
Как это сделать?
PROCEDURE name1 (RC OUT SYS_REFCURSOR) IS
BEGIN
OPEN RC FOR
END name1;
PROCEDURE name2 (RC OUT SYS_REFCURSOR) IS
BEGIN
OPEN RC FOR
SELECT * FROM Person
END name2;
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Stored procedure(name1 и name2) которые находяться в разных пакетах ...
Пакет - это пространство имён, которое указывается, как и во многих ЯП, через точку (Oracle применяет термин: Dot Notation). Внутри пакета, его имя для его собственных идентификаторов опционально и может быть опущено.
Посмотрите на воспроизводимом примере, как это всё работает, и обратите внимание на порядок компиляции пакетов:
create table person (id, name) as
select 1, 'person1' from dual
/
create or replace package pack2 as
procedure name2 (rc out sys_refcursor);
end pack2;
/
create or replace package body pack2 as
procedure name2 (rc out sys_refcursor) is
begin
open rc for select * from person;
end name2;
end pack2;
/
create or replace package pack1 as
type persontab is table of person%rowtype;
procedure name1 (rc out sys_refcursor);
end pack1;
/
create or replace package body pack1 as
procedure name1 (rc out sys_refcursor) is
pt persontab;
begin
pack2.name2 (rc);
fetch rc bulk collect into pt;
open rc for select * from table (pt);
end name1;
end pack1;
/
Запустите и получите результат:
var rc refcursor
execute pack1.name1 (:rc);
ID NAME
---------- -------
1 person1