如何通过过程返回REF CURSOR返回的别名来获取列值

时间:2018-10-15 09:52:53

标签: oracle plsql oracle12c

有一个过程返回多列结果。列在输入参数(例如

)上更改

对于 FLAG = 1 返回的列可以是

NAME,AGE,ID,LOCATION

,对于 FLAG = 2 ,返回的列可以为

EMPID,LOCATION,GENDER,ID

以此类推。

返回的列来自JOIN,因此不是特定的表类型。

我只想在遍历该过程返回的REF CURSOR时获取 ID

如何实现这种行为。

编辑:具体而言,列数可以根据输入参数进行更改,但是 ID 列将在每个结果中可用。如何遍历此类过程的结果以仅获取 ID 参数。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用the dbms_sql package动态查询参考光标以找到名为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。然后使用该值做您需要做的一切-我只是在这里显示它。