我有一个名为 col_mapping 的Oracle表,其中此表中的列具有另一个表中列的列值。
表格的示例数据:col_mapping
ID DESCR COL_VALS
------------------------------
1 LABEL COL_1
2 NAME_ADDR COL_2:COL_3
3 SALARY COL4
根据上表,我现在想通过col_mapping中的每条记录,并使用COL_VALS作为我的一部分
select COL_VALS from other_tab
显然,如果有多个值,例如 COL_2:COL_3 ,则需要将':'替换为','
SELECT COL_1 from other_tab;
SELECT COL_2,COL_3 from other_tab;
SELECT COL_4 from other_tab;
答案 0 :(得分:1)
您可以使用动态SQL在col_vals
行上的游标循环内基于col_mappings
值生成和执行insert语句:
begin
for r in (select replace(col_vals, ':', ',') as cols from col_mapping) loop
dbms_output.put_line('insert into staging_tab(' || r.cols || ')'
|| ' select ' || r.cols || ' from other_tab');
execute immediate 'insert into staging_tab(' || r.cols || ')'
|| ' select ' || r.cols || ' from other_tab';
end loop;
end;
/
光标只获取cols_val
值,用逗号替换冒号。生成的插入使用修改后的cols_val
作为插入列列表和选择列表 - 因为您说登台表将与other_tab
结构匹配。
dbms_output
行只是为了让您可以看到生成的语句 - 代码运行所必需的,您需要set serveroutput on
或同等的内容才能看到无论如何。启用此功能后,使用示例映射数据运行该块将显示:
PL/SQL procedure successfully completed.
insert into staging_tab(COL_1) select COL_1 from other_tab
insert into staging_tab(COL_2,COL_3) select COL_2,COL_3 from other_tab
insert into staging_tab(COL4) select COL4 from other_tab
您最终得到的是other_tab
中每一行的数据分布在staging_tab
的多行中,并带有大量空值。希望这就是你的意图。