Вы можете использовать пакет dbms_sql
для динамического опроса курсора ссылки, чтобы найти столбец с именем ID
и отметить его положение;затем используйте эту позицию, чтобы позже получить значение для каждой строки:
declare
l_refcursor sys_refcursor;
l_cursor pls_integer;
l_desc dbms_sql.desc_tab;
l_cols pls_integer;
l_id_pos pls_integer;
l_id pls_integer;
begin
-- call your procedure with appropriate flag value and argument names
your_procedure(p_flag => 1, p_refcursor => l_refcursor);
-- use dbms_sql to interrogate
l_cursor := dbms_sql.to_cursor_number(l_refcursor);
dbms_sql.describe_columns(c => l_cursor, col_cnt => l_cols, desc_t => l_desc);
-- find column position based on expected name/alias
for i in 1..l_cols loop
if l_desc(i).col_name = 'ID' then
dbms_sql.define_column(l_cursor, i, l_id);
l_id_pos := i;
end if;
end loop;
-- find column value for each row in result set
while dbms_sql.fetch_rows(l_cursor) > 0 loop
dbms_sql.column_value(l_cursor, l_id_pos, l_id);
dbms_output.put_line('Row ' || dbms_sql.last_row_count
|| ': ' || l_desc(l_id_pos).col_name
|| ' = ' || l_id);
end loop;
dbms_sql.close_cursor(l_cursor);
end;
/
Сначала вы получите реальный курсор ref из вашей процедуры, затем преобразуете его в курсор dbms_sql
, чтобы вы могли описать его столбцы.
Затем вы перебираете все столбцы и устанавливаете для l_id_pos
номер столбца с именем ID
.
Затем вы перебираете возвращенные строки, выбирая их каждый раз и используя dbms_sql.column_value
для извлечения фактического значения в локальную переменную, l_id
в этом примере.Затем делайте с этим значением все, что вам нужно - я просто показываю его здесь.