首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dml通用sql脚本

dml通用sql脚本
EN

Stack Overflow用户
提问于 2018-10-17 19:11:16
回答 3查看 342关注 0票数 1

我有一个表测试,它包含所有的表名、column_names和标志。我想用如下所述的flg逻辑从当前模式中的所有表中创建“插入测试”的通用脚本: flg应该是filler1 insert 'N‘之前所有列的'Y’,目前我正在硬编码为'N‘。

代码语言:javascript
复制
drop table test;
CREATE TABLE TEST (TABLE_NM VARCHAR2(10) ,COL_NM VARCHAR2(10) ,  FLG CHAR(1));

CREATE TABLE XYZ (FNAME VARCHAR2(10) , LNAME VARCHAR2(10) , PID NUMBER , FILLER1 VARCHAR2(10) , FILLER2 VARCHAR2(10) );

SELECT TABLE_NAME , COLUMN_NAME
from ALL_TAB_COLUMNS
WHERE table_name='XYZ'
order by COLUMN_ID;

脚本查询:

代码语言:javascript
复制
 select 'INSERT INTO TEST (TABLE_NM,COL_NM,FLG)VALUES ('''||TABLE_NAME||
    ''','''||COLUMN_NAME||''',''N'''||')'
    from ALL_TAB_COLUMNS
    where table_name='XYZ'
    order by COLUMN_ID;

预期产出

代码语言:javascript
复制
 INSERT INTO TEST (TABLE_NM,COL_NM,FLG)VALUES ('XYZ','FNAME','Y');
    INSERT INTO TEST (TABLE_NM,COL_NM,FLG)VALUES ('XYZ','LNAME','Y');
    insert into TEST (TABLE_NM,COL_NM,FLG)VALUES ('XYZ','PID','Y');
    INSERT INTO TEST (TABLE_NM,COL_NM,FLG)VALUES ('XYZ','FILLER1','N');
    insert into TEST (TABLE_NM,COL_NM,FLG)VALUES ('XYZ','FILLER2','N');

我怎样才能做到这一点?提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-17 20:19:32

如果您在所有这些单引号中迷失了方向,我建议您使用CHR(39) (这是单引号)。

下面是一个例子。

代码语言:javascript
复制
SQL> create table test (table_nm varchar2(10),
  2                     col_nm   varchar2(10),
  3                     flg      char(1));

Table created.

SQL> create table xyz (fname     varchar2(10),
  2                    lname     varchar2(10),
  3                    pid       number,
  4                    filler1   varchar2(10),
  5                    filler2   varchar2(10),
  6                    some_col  number);

Table created.

CTE FILLER1_POS返回FILLER1列的位置(即column_id);它在CASE中用于区分ID低于(或高于) FILLER1列的列。

代码语言:javascript
复制
SQL> with filler1_pos as
  2    (select column_id fid_pos
  3     from all_tab_columns
  4     where table_name = 'XYZ'
  5       and column_name = 'FILLER1'
  6    )
  7  select 'insert into test (table_nm, col_nm, flg) values (' ||
  8     chr(39) || a.table_name  || chr(39) ||', '||
  9     chr(39) || a.column_name || chr(39) ||', '||
 10     chr(39) || case when a.column_id < f.fid_pos then 'Y'
 11                     else 'N'
 12                end           || chr(39) ||');' result
 13    from all_tab_columns a join filler1_pos f on 1 = 1
 14    where a.table_name = 'XYZ'
 15    order by a.column_id;

RESULT
--------------------------------------------------------------------------------
insert into test (table_nm, col_nm, flg) values ('XYZ', 'FNAME', 'Y');
insert into test (table_nm, col_nm, flg) values ('XYZ', 'LNAME', 'Y');
insert into test (table_nm, col_nm, flg) values ('XYZ', 'PID', 'Y');
insert into test (table_nm, col_nm, flg) values ('XYZ', 'FILLER1', 'N');
insert into test (table_nm, col_nm, flg) values ('XYZ', 'FILLER2', 'N');
insert into test (table_nm, col_nm, flg) values ('XYZ', 'SOME_COL', 'N');

6 rows selected.

SQL>

让我们运行这些插入并检查结果:

代码语言:javascript
复制
SQL> insert into test (table_nm, col_nm, flg) values ('XYZ', 'FNAME', 'Y');

1 row created.

SQL> insert into test (table_nm, col_nm, flg) values ('XYZ', 'LNAME', 'Y');

1 row created.

SQL> insert into test (table_nm, col_nm, flg) values ('XYZ', 'PID', 'Y');

1 row created.

SQL> insert into test (table_nm, col_nm, flg) values ('XYZ', 'FILLER1', 'N');

1 row created.

SQL> insert into test (table_nm, col_nm, flg) values ('XYZ', 'FILLER2', 'N');

1 row created.

SQL> insert into test (table_nm, col_nm, flg) values ('XYZ', 'SOME_COL', 'N');

1 row created.

SQL> select * from test;

TABLE_NM   COL_NM     F
---------- ---------- -
XYZ        FNAME      Y
XYZ        LNAME      Y
XYZ        PID        Y
XYZ        FILLER1    N
XYZ        FILLER2    N
XYZ        SOME_COL   N

6 rows selected.

SQL>
票数 1
EN

Stack Overflow用户

发布于 2018-10-17 20:11:15

这能做你想做的事吗?

代码语言:javascript
复制
SELECT 'INSERT INTO TEST (TABLE_NM,COL_NM,FLG)VALUES (''' ||
       TABLE_NAME ||
       ''',''' ||
       COLUMN_NAME ||
       ''',''' ||
       CASE WHEN SUBSTR(COLUMN_NAME,1,6) = 'FILLER' THEN 'N' ELSE 'Y' END ||
       ''');'        
  FROM ALL_TAB_COLUMNS
 WHERE table_name='XYZ'
 ORDER BY COLUMN_ID;
票数 1
EN

Stack Overflow用户

发布于 2018-10-17 20:11:27

一种选择可能是将decodesign一起用作:

代码语言:javascript
复制
SELECT 'INSERT INTO TEST (TABLE_NM,COL_NM,FLG)VALUES ('''||TABLE_NAME||
    ''','''||COLUMN_NAME||''','''||decode(sign(u.column_id-3),1,'N','Y')||''');'
  FROM USER_TAB_COLUMNS U
 WHERE table_name='XYZ'
 ORDER BY COLUMN_ID;

http://sqlfiddle.com/#!4/1d5c5/4

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52862029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档