【问题标题】:How to Fetch a column value by alias returned by Procedure returning REF CURSOR如何通过返回 REF CURSOR 的过程返回的别名获取列值
【发布时间】:2018-10-15 20:22:12
【问题描述】:

有一个返回多列结果的过程。列更改输入参数,如

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

NAME,AGE,ID,LOCATION

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

EMPID,LOCATION,GENDER,ID

等等。

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

我只想在循环过程返回的 REF CURSOR 时获取 ID

我怎样才能实现这样的行为。

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

提前致谢。

【问题讨论】:

  • 您能详细说明一下需求吗?
  • @Jacob 使描述更加清晰

标签: oracle plsql oracle12c


【解决方案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;
/

首先,您从过程中获取实际的引用光标,然后将其转换为 dbms_sql 光标,以便描述其列。

然后循环遍历所有列并将l_id_pos 设置为名称为ID 的列号。

然后循环遍历返回的行,每次都获取并使用dbms_sql.column_value 将实际值提取到局部变量中,在本例中为l_id。然后用这个值做任何你需要做的事情——我只是在这里展示它。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 2022-07-21
    • 2012-01-13
    • 1970-01-01
    • 2014-01-23
    • 2023-04-02
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多