【问题标题】: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 参数。
提前致谢。
【问题讨论】:
标签:
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。然后用这个值做任何你需要做的事情——我只是在这里展示它。