declare v_cmd varchar2(100); v_table_owner varchar2(30) := 'SCH_OLTP'; v_table_name varchar2(30) := 'T_VISIT_STATS_DETAILED'; v_column_name varchar2(30); begin v_cmd := 'select column_name from dba_tab_columns where owner=:v_table_owner and table_name=:v_table_name'; execute immediate v_cmd into v_column_name using v_table_owner, v_table_name; end; /* ORA-01422: exact fetch returns more than requested number of rows ORA-06512: at line 13 */
So it is important to check the returning row count before using execute immediate is important. Or you can use the bulk collect clause to fetch multiple returning rows into an array.
declare type typ_varcharlist is table of varchar2(30); col_list typ_varcharlist; v_cmd varchar2(100); v_table_owner varchar2(30) := 'SCH_OLTP'; v_table_name varchar2(30) := 'T_VISIT_STATS_DETAILED'; begin v_cmd := 'select column_name from dba_tab_columns where owner=:v_table_owner and table_name=:v_table_name'; execute immediate v_cmd bulk collect into col_list using v_table_owner, v_table_name; for n_ctl in 1 .. col_list.count() loop dbms_output.put_line (col_list(n_ctl)); end loop; end; /* DUMMY SUCCESS VISITED_USER_ID FROM_IP VISIT_DATE PAGE_ID */
Reference:
Oracle PLSQL Users Guide
Thesis and Papers > Oracle 11g Execute Immediate