SQL 用SQL生成SQL

SQL 用SQL生成SQL,你想生成动态的 SQL 语句,例如你的目的是将某些维护任务自动化。你希望完成 3 项任务:计算各个表的行数,禁用各个表的外键约束,根据表里的数据生成插入脚本。

SQL 用SQL生成SQL 问题描述

你想生成动态的 SQL 语句,例如你的目的是将某些维护任务自动化。你希望完成 3 项任务:计算各个表的行数,禁用各个表的外键约束,根据表里的数据生成插入脚本。

SQL 用SQL生成SQL 解决方案

基本思路是使用字符串拼接 SQL 语句,通过查询某些表来获取需要填入的数据(例如数据库对象名称)。注意,这些查询仅生成 SQL 语句。你需要手动或者通过其他方式运行脚本,以执行这些 SQL 语句。下面的示例都是针对 Oracle 数据库的。对于其他数据库而言,做法应该极其相似,但是数据字典表的名称以及日期格式之类的细节或有不同。下面的输出结果来自我的笔记本电脑上的一个 Oracle 实例。你的计算机上的执行结果当然会有所不同。

/* 生成SQL以计算各个表的行数 */
 
select 'select count(*) from '||table_name||';' cnts
  from user_tables;
 
CNTS
--------------------------------------
select count(*) from ANT;
select count(*) from BONUS;
select count(*) from DEMO1;
select count(*) from DEMO2;
select count(*) from DEPT;
select count(*) from DUMMY;
select count(*) from EMP;
select count(*) from EMP_SALES;
select count(*) from EMP_SCORE;
select count(*) from PROFESSOR;
select count(*) from T;
select count(*) from T1;
select count(*) from T2;
select count(*) from T3;
select count(*) from TEACH;
select count(*) from TEST;
select count(*) from TRX_LOG;
select count(*) from X;
 
/* 禁用所有表的外键约束 */
 
select 'alter table '||table_name||
        ' disable constraint '||constraint_name||';' cons
   from user_constraints
  where constraint_type = 'R';
 
CONS
--------------------------------------------------------
alter table ANT disable constraint ANT_FK;
alter table BONUS disable constraint BONUS_FK;
alter table DEMO1 disable constraint DEMO1_FK;
alter table DEMO2 disable constraint DEMO2_FK;
alter table DEPT disable constraint DEPT_FK;
alter table DUMMY disable constraint DUMMY_FK;
alter table EMP disable constraint EMP_FK;
alter table EMP_SALES disable constraint EMP_SALES_FK;
alter table EMP_SCORE disable constraint EMP_SCORE_FK;
alter table PROFESSOR disable constraint PROFESSOR_FK;
 
/* 根据EMP表的某些列生成插入脚本 */
 
select 'insert into emp(empno,ename,hiredate) '||chr(10)||
       'values( '||empno||','||''''||ename
       ||''',to_date('||''''||hiredate||''') );' inserts
 from emp
where deptno = 10;
 
INSERTS
---------------------------------------------------------------
insert into emp(empno,ename,hiredate)
values( 7782,'CLARK',to_date('09-JUN-1981 00:00:00') );
 
insert into emp(empno,ename,hiredate)
values( 7839,'KING',to_date('17-NOV-1981 00:00:00') );
 
insert into emp(empno,ename,hiredate)
values( 7934,'MILLER',to_date('23-JAN-1982 00:00:00') );

SQL 用SQL生成SQL 扩展知识

若要创建可移植的脚本(如用于在多个环境下进行测试),用 SQL 生成 SQL 的做法尤其有用。另外,正如上面的例子所示,对于执行批处理维护任务以及一次性找出与多种对象相关的信息,用 SQL 生成 SQL 的做法也非常有用。这种方法简单易学,你练习的次数越多,它就会变得越简单。本例只是希望向你展示一下如何创建属于你自己的动态 SQL 脚本,坦白来说,这并不难做到。你只需要不断尝试就能熟练掌握其中的技巧。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程