有一个过程返回多列结果。列在输入参数(例如
)上更改对于 FLAG = 1 返回的列可以是
NAME,AGE,ID,LOCATION
,对于 FLAG = 2 ,返回的列可以为
EMPID,LOCATION,GENDER,ID
以此类推。
返回的列来自JOIN,因此不是特定的表类型。
我只想在遍历该过程返回的REF CURSOR时获取 ID 。
如何实现这种行为。
编辑:具体而言,列数可以根据输入参数进行更改,但是 ID 列将在每个结果中可用。如何遍历此类过程的结果以仅获取 ID 参数。
谢谢。
答案 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
。然后使用该值做您需要做的一切-我只是在这里显示它。