Определите тип записи, чтобы соответствовать проекции запросов, которые вы хотите выполнить. Вы можете использовать это для определения параметра IN test3()
.
Определить курсор ref, который возвращает этот тип записи. Вы можете использовать это для определения параметра IN test2()
.
. Вместо курсоров задайте функции, которые возвращают ref-курсоры, определенные этим типом курсора.
Итак, ваш пакет выглядит следующим образом:
create or replace package my_test as
type t_record is record(
column1 mytable.column1%type
,column2 mytable.column2%type
);
type t_cursor is ref cursor return t_record;
function my_cursor (my_filter NUMBER) return t_cursor ;
function my_cursor2(my_filter VARCHAR2) return t_cursor ;
procedure test1;
procedure test2(p_cursor t_cursor);
function test3(test_record t_record) return number;
end my_test;
/
, а реализация выглядит так (с некоторым выводом, чтобы сделать демонстрацию более понятной):
create or replace package body my_test as
function my_cursor(my_filter NUMBER) return t_cursor is
rc sys_refcursor;
begin
open rc for select column1, column2 from mytable where column3 = my_filter;
return rc;
end my_cursor;
function my_cursor2(my_filter VARCHAR2) return t_cursor is
rc sys_refcursor;
begin
open rc for select column1, column2 from mytable where column4 LIKE my_filter;
return rc;
end my_cursor2;
procedure test1 is
begin
dbms_output.put_line('test2(my_cursor, 3)');
test2(my_cursor(3));
dbms_output.put_line('test2(my_cursor2, foo');
test2(my_cursor2('foo%'));
dbms_output.put_line('test2(my_cursor,5)');
test2(my_cursor(5));
-- ...
end test1;
procedure test2(p_cursor t_cursor) is
tmp number;
l_rec t_record;
begin
loop
fetch p_cursor into l_rec;
exit when p_cursor%notfound;
--some actions
tmp := test3(l_rec);
dbms_output.put_line(l_rec.column1 ||'+'||l_rec.column2||'='||tmp);
--some actions
end loop;
close p_cursor;
end test2;
function test3(test_record t_record) return number is
tmp_sum number;
begin
-- ...
tmp_sum := test_record.column1 + test_record.column2;
-- ...
return tmp_sum;
end test3;
end my_test;
/
Сделал Я говорю демо? Конечно, демо на db <> fiddle .