plsql - Dynamic String contcatination in Cursor -
i have function concatinates value cursor. concatinates 4 columns , column name should hardcoded. there way have generic solution this, such if pass cursor automatically concatinate data regardless of column name , number of columns in 11g.
function generatedata(p_datacursor in sys_refcursor) return varchar2 -- --------------------------------------------------------------------- crlf varchar2(2) := chr(13)||chr(10); lv_message varchar2(32000); begin rec in p_datacursor loop lv_message := lv_message || rec.a||','||rec.b||','||rec.c||','||rec.d || crlf; end loop; return lv_message; end;
since 11g oracle built-in package dbms_sql provides function to_cursor_number - "this function takes opened or weakly-typed ref cursor , transforms dbms_sql cursor number."
example code:
declare l_cursor sys_refcursor; function generatedata(p_datacursor in sys_refcursor) return varchar2 curs sys_refcursor := p_datacursor; l_cursorid number; l_column_count integer; l_describe_table dbms_sql.desc_tab; l_numvar number; l_ignore integer; l_value varchar2(2000); l_coma varchar2(10); crlf varchar2(2) := chr(13)||chr(10); lv_message varchar2(32000); begin l_cursorid := dbms_sql.to_cursor_number( curs ); dbms_sql.describe_columns( l_cursorid, l_column_count, l_describe_table ); in 1..l_column_count loop dbms_sql.define_column(l_cursorid, i, l_value, 2000); end loop; loop if dbms_sql.fetch_rows(l_cursorid)>0 l_coma := ''; in 1..l_column_count loop dbms_sql.column_value(l_cursorid, i, l_value); lv_message := lv_message || l_coma || l_value; l_coma := ','; end loop; lv_message := lv_message || crlf; else exit; end if; end loop; dbms_sql.close_cursor( l_cursorid ); return lv_message; end; begin open l_cursor 'select 1 a, 2 b, 3 c, 4 d dual union select 1 a, 2 b, 3 c, 4 d dual'; dbms_output.put_line(generatedata(l_cursor)); end; /
Comments
Post a Comment