如何创建从 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 缺少更多信息 - 至少 datatype
和 format_model
.
我有一个 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 缺少更多信息 - 至少 datatype
和 format_model
.