Vous ne pouvez pas faire référence à un nom de colonne/champ dynamiquement via une autre variable.
Vous devrez gérer l'ensemble de la data_table
interroger dynamiquement ; ceci est une démo avec le dbms_sql
paquet
:
declare
l_col_name varchar2(100);
l_col_val varchar2(100);
type t_col_tab is table of column_table%rowtype;
l_col_tab t_col_tab;
-- for dbms_sql
l_c pls_integer;
l_col_cnt pls_integer;
l_desc_t dbms_sql.desc_tab;
l_rc pls_integer;
l_varchar varchar2(4000);
begin
select * bulk collect into l_col_tab from column_table;
-- create cursor and prepare from original query
l_c := dbms_sql.open_cursor;
dbms_sql.parse(c=>l_c, statement=>'select * from data_table',
language_flag=>dbms_sql.native);
dbms_sql.describe_columns(c => l_c, col_cnt => l_col_cnt,
desc_t => l_desc_t);
for i in 1..l_col_cnt loop
dbms_sql.define_column(c=>l_c, position=>i,
column=>l_varchar, column_size=>4000);
end loop;
l_rc := dbms_sql.execute(c=>l_c);
while dbms_sql.fetch_rows(c=>l_c) > 0 loop
for i in 1..l_col_cnt loop
for j in 1..l_col_tab.count loop
if l_desc_t(i).col_name = l_col_tab(j).column_name then
-- same column
dbms_sql.column_value(l_c, i, l_varchar);
dbms_output.put_line('Row ' || dbms_sql.last_row_count
|| ': ' || l_desc_t(i).col_name
|| ' = ' || l_varchar);
end if;
end loop;
end loop;
end loop;
dbms_sql.close_cursor(l_c);
end;
/
La requête du curseur est analysée et exécutée, et les descriptions de table permettent de comparer les noms de colonne. Il s'agit simplement d'imprimer les informations, mais vous pouvez évidemment en faire ce dont vous avez besoin.
Avec des tables factices créées comme :
create table data_table(id number, column_1 date, column_2 varchar2(10), column_3 varchar2(10));
insert into data_table (id, column_1, column_2, column_3) values (1, date '2017-01-01', 'dummy', 'first');
insert into data_table (id, column_1, column_2, column_3) values (2, date '2017-02-01', 'dummy', 'second');
create table column_table (column_name varchar2(30));
insert into column_table (column_name) values ('ID');
insert into column_table (column_name) values ('COLUMN_3');
... ceci obtient la sortie :
Row 1: ID = 1
Row 1: COLUMN_3 = first
Row 2: ID = 2
Row 2: COLUMN_3 = second
PL/SQL procedure successfully completed.