如何创建从 table 插入数据的通用过程?

How can I Create a generic procedure for inserting data from a table?

我有一个 table:

create table D_DEFAULT
(
  table_name   VARCHAR2(200),
  column_name  VARCHAR2(200),
  column_value VARCHAR2(200)
);
TABLE_NAME COLUMN_NAME COLUMN_VALUE
GCG_RTM ID -1
GCG_RTM FILIAL_CODE US
GCG_RTM SK_ID -1
GCG_RTM SUBS_ID -1

在我的项目中,我必须从 COLUMN_NAME 和 COLUMN_VALUE 列中获取数据 并将其插入另一个 table.

像这样:

select LISTAGG(COLUMN_NAME, ','), LISTAGG(COLUMN_VALUE,  ',')
  into v_columns, v_values
  from D_DEFAULT
  where TABLE_NAME = p_table || '_RTM';
v_sql := 'insert into table ' || p_table || ' values (' || v_values|| ') ';

它是动态的 SQL 您需要的(因为您或多或少地了解了自己)。

示例数据和table:

SQL> select * From d_default;

TABLE_NAME      COLUMN_NAME     COLUMN_VALUE
--------------- --------------- ---------------
GCG_RTM         ID              -1
GCG_RTM         FILIAL_CODE     US

SQL> desc gcg_rtm
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 FILIAL_CODE                                        VARCHAR2(5)

代码:

SQL> declare
  2    l_tab  varchar2(30);
  3    l_cols varchar2(200);
  4    l_vals varchar2(200);
  5    l_str  varchar2(2000);
  6  begin
  7    select table_name,
  8           listagg(column_name, ',') within group (order by rowid),
  9           chr(39) || listagg(column_value, chr(39) ||','|| chr(39)) within group (order by rowid) ||chr(39)
 10    into l_tab, l_cols, l_vals
 11    from d_default
 12    where table_name = 'GCG_RTM'
 13    group by table_name;
 14
 15    l_str := 'insert into ' || l_tab || ' (' ||
 16              l_cols ||') values (' || l_vals || ')';
 17
 18    execute immediate l_str;
 19  end;
 20  /

PL/SQL procedure successfully completed.

结果:

SQL> select * from gcg_rtm;

        ID FILIA
---------- -----
        -1 US

SQL>

您可能会遇到的问题:不同的数据类型。插入字符串或数字很容易(并依赖 Oracle 的隐式数据类型转换),但是 - 例如日期?如何申请TO_DATE功能?您将使用哪种格式模型?也许您的 D_DEFAULT table 缺少更多信息 - 至少 datatypeformat_model.