Как извлечь значение столбца по псевдониму, возвращенному процедурой, возвращающей REF CURSOR - PullRequest
0 голосов
/ 15 октября 2018

Существует процедура, которая возвращает результаты с несколькими столбцами.Изменения столбцов во входном параметре, например

, для FLAG = 1 возвращаемые столбцы могут быть

NAME,AGE,ID,LOCATION

, а для FLAG = 2 возвращаемые столбцы могутбыть

EMPID,LOCATION,GENDER,ID

и т. д.

Возвращенные столбцы получены из JOIN, поэтому они не относятся к конкретному типу таблицы.

Я хочу получить ID только при циклическом просмотре REF CURSOR, возвращенного процедурой.

Как мне добиться такого поведения.

Редактировать: Точнее, количество столбцов может изменяться в зависимости от входных параметров, но ID столбец будет доступен в каждом результате.Как перебрать результат такой процедуры, чтобы получить только ID параметр.

Заранее спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете использовать пакет 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 в этом примере.Затем делайте с этим значением все, что вам нужно - я просто показываю его здесь.

...