一个、概要

在实际的软件开发项目。我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,。例如。假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中。

对于类型同样的多个表,我们能够逐个建立,也能够採用循环的方法来建立。与之相相应的,能够用一个存储过程实现对全部表的操作。也能够循环建立存储过程,每一个存储过程实现对某个特定表的操作。

本文中,我们建立10个员工信息表。每一个表中包括员工工号(8位)和年龄字段,以工号的最后一位来分表。同一时候,我们建立存储过程实现对员工信息的插入。本文中的SQL语句基于ORACLE数据库实现。

二、一般的实现方式

在该实现方式中,我们逐个建立员工信息表,并在一个存储过程实现对全部表的操作。详细SQL语句例如以下:

建表语句:

-- tb_employeeinfo0
begin
execute immediate 'drop table tb_employeeinfo0 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo0
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo0 on tb_employeeinfo0(employeeno); prompt 'create table tb_employeeinfo0 ok';
commit; -- tb_employeeinfo1
begin
execute immediate 'drop table tb_employeeinfo1 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo1
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo1 on tb_employeeinfo1(employeeno); prompt 'create table tb_employeeinfo1 ok';
commit; -- tb_employeeinfo2
begin
execute immediate 'drop table tb_employeeinfo2 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo2
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo2 on tb_employeeinfo2(employeeno); prompt 'create table tb_employeeinfo2 ok';
commit; -- tb_employeeinfo3
begin
execute immediate 'drop table tb_employeeinfo3 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo3
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo3 on tb_employeeinfo3(employeeno); prompt 'create table tb_employeeinfo3 ok';
commit; -- tb_employeeinfo4
begin
execute immediate 'drop table tb_employeeinfo4 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo4
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo4 on tb_employeeinfo4(employeeno); prompt 'create table tb_employeeinfo4 ok';
commit; -- tb_employeeinfo5
begin
execute immediate 'drop table tb_employeeinfo5 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo5
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo5 on tb_employeeinfo5(employeeno); prompt 'create table tb_employeeinfo5 ok';
commit; -- tb_employeeinfo6
begin
execute immediate 'drop table tb_employeeinfo6 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo6
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo6 on tb_employeeinfo6(employeeno); prompt 'create table tb_employeeinfo6 ok';
commit; -- tb_employeeinfo7
begin
execute immediate 'drop table tb_employeeinfo7 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo7
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo7 on tb_employeeinfo7(employeeno); prompt 'create table tb_employeeinfo7 ok';
commit; -- tb_employeeinfo8
begin
execute immediate 'drop table tb_employeeinfo8 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo8
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo8 on tb_employeeinfo8(employeeno); prompt 'create table tb_employeeinfo8 ok';
commit; -- tb_employeeinfo9
begin
execute immediate 'drop table tb_employeeinfo9 cascade constraints';
exception when others then commit;
end; /
create table tb_employeeinfo9
(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
);
create unique index idx1_tb_employeeinfo9 on tb_employeeinfo9(employeeno); prompt 'create table tb_employeeinfo9 ok';
commit;

存储过程创建语句:

create or replace procedure pr_insertdata
(
v_employeeno in varchar2,
v_employeeage in int
)
as
v_employeecnt int;
v_tableindex varchar2(2); begin
v_tableindex := substr(v_employeeno, length(v_employeeno), 1); if v_tableindex = '0' then
begin
select count(*) into v_employeecnt from tb_employeeinfo0 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo0(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '1' then
begin
select count(*) into v_employeecnt from tb_employeeinfo1 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo1(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '2' then
begin
select count(*) into v_employeecnt from tb_employeeinfo2 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo2(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '3' then
begin
select count(*) into v_employeecnt from tb_employeeinfo3 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo3(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '4' then
begin
select count(*) into v_employeecnt from tb_employeeinfo4 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo4(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '5' then
begin
select count(*) into v_employeecnt from tb_employeeinfo5 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo5(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '6' then
begin
select count(*) into v_employeecnt from tb_employeeinfo6 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo6(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '7' then
begin
select count(*) into v_employeecnt from tb_employeeinfo7 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo7(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '8' then
begin
select count(*) into v_employeecnt from tb_employeeinfo8 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo8(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
elsif v_tableindex = '9' then
begin
select count(*) into v_employeecnt from tb_employeeinfo9 where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into tb_employeeinfo9(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
end;
end if;
commit; exception when others then
begin
rollback;
return;
end;
end;
/
prompt 'create procedure pr_insertdata ok'

三、循环创建的实现方式

在该实现方式中,我们採用循环的方法建立员工信息表及存储过程。详细SQL语句例如以下:

建表语句:

-- tb_employeeinfo0~9
begin
declare i int;tmpcount int;tbname varchar2(50);strsql varchar2(1000);
begin
i:=0;
while i<10 loop
begin
tbname := 'tb_employeeinfo'||to_char(i);
i := i+1; select count(1) into tmpcount from user_tables where table_name = Upper(tbname);
if tmpcount>0 then
begin
execute immediate 'drop table '||tbname;
commit;
end;
end if;
strsql := 'create table '||tbname||
'(
employeeno varchar2(10) not null, -- employee number
employeeage int not null -- employee age
)';
execute immediate strsql;
strsql := 'begin
execute immediate ''drop index idx1_'||tbname || ' '''
|| ';exception when others then null;
end;';
execute immediate strsql; execute immediate 'create unique index idx1_'||tbname||' on '||tbname||'(employeeno)'; end;
end loop;
end;
end;
/

存储过程创建语句:

begin
declare v_i int;v_procname varchar(50);v_employeeinfotbl varchar(50);strsql varchar(4000);
begin
v_i := 0;
while v_i < 10 loop
v_procname := 'pr_insertdata'||substr(to_char(v_i),1,1);
v_employeeinfotbl := 'tb_employeeinfo'||substr(to_char(v_i),1,1); v_i := v_i + 1;
strsql := 'create or replace procedure '||v_procname||'(
v_employeeno in varchar2,
v_employeeage in int
)
as
v_employeecnt int; begin
select count(*) into v_employeecnt from '||v_employeeinfotbl||' where employeeno = v_employeeno;
if v_employeecnt > 0 then -- the employeeno is already in DB
begin
return;
end;
else -- the employeeno is not in DB
begin
insert into '||v_employeeinfotbl||'(employeeno, employeeage) values(v_employeeno, v_employeeage);
end;
end if;
commit;
exception when others then
begin
rollback;
return;
end;
end;';
execute immediate strsql;
end loop;
end;
end;
/

四、总结

当同样类型的表的个数较多时(如有上百个)。显然用循环创建的实现方式能够节约大量的工作时间,提高工作效率。可是,在使用该方法的时候,要特别细致,尤其要注意单引號的使用,避免为了省事而引入代码逻辑问题。


本人微信公众号:zhouzxi。请扫描下面二维码:

版权声明:本文博主原创文章。博客,未经同意不得转载。

基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现的更多相关文章

  1. SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束

    创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...

  2. 5.oracle建表的时候同时创建主键,外键,注释,约束,索引

    5.oracle建表的时候同时创建主键,外键,注释,约束,索引 1 --主键 )); ) ,constraint aba_pr primary key(id,name1)); --外键 )); --复 ...

  3. PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写

    原文:PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入T ...

  4. oracle 建表时显示ORA-00984: 列在此处不允许

      oracle 建表时显示ORA-00984: 列在此处不允许 CreationTime--2018年7月19日16点10分 Author:Marydon 1.情景展示 使用plsql建表时,报错 ...

  5. oracle 建表时显示ORA-00904无效的标识符

      oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...

  6. oracle 建表 主键自增序列/////

    oracle 建表 主键自增序列 (2011-10-12 11:59:22) 转载▼ 标签: 杂谈 分类: oracle SQL> create table sms_activity(  2   ...

  7. Oracle建表提示SQL 错误: ORA-00904: : 标识符无效

    Oracle建表提示: 错误报告:SQL 错误: ORA-00904: : 标识符无效00904. 00000 -  "%s: invalid identifier"*Cause: ...

  8. Oracle数据库常用Sql语句大全

    一,数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...

  9. Oracle,SQL Server 数据库较MySql数据库,Sql语句差异

    原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...

随机推荐

  1. 加入指数(IOS开发)

    该指数是用来协助查询. 原则上: - 索引的标题是不完全一样的标题显示: - 指数应该具有一定的代表性,它可表示一组数据: - 假设索引列表视图.在一般情况下不再使用扩展视图. (easy指向) 会又 ...

  2. C++写一个简单的解析器(分析C语言)

    该方案实现了一个分析C语言的词法分析+解析. 注意: 1.简单语法,部分秕.它可以在本文法的基础上进行扩展,此过程使用自上而下LL(1)语法. 2.自己主动能达到求First 集和 Follow 集. ...

  3. 【原创】leetCodeOj --- Min Stack 解题报告

    题目地址: https://oj.leetcode.com/problems/min-stack/ 题目内容: Design a stack that supports push, pop, top, ...

  4. 排列组合相关算法 python

    获取指定长度得全部序列 通过事件来表述这个序列,即n重伯努利实验(二项分布)的全部可能结果.比如时间a表示为: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 假设每次实验为从 ...

  5. 《图书管理系统——java》

    /* (程序头部凝视開始) * 程序的版权和版本号声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名:    < ...

  6. log4net使用特定的解释

    说明:该程序演示如何使用log4net记录日志信息. log4net它是-known开源组件的日志记录功能.使用log4net可以很容易地将信息记录到文件.控制台.Windows事件日志和数据库(含有 ...

  7. 不用库(框架),自己写ajax

    平常会使用ajax来请求数据,加载一个库(框架),或许仅仅maybe就使用了它的ajax部分. 写个ajax,一来可以经历一下处理问题的过程,提升技术能力,二来工作中有时真的用不着这么大的一个库(框架 ...

  8. 开源Math.NET基础数学类库使用(08)C#进行数值积分

    原文:[原创]开源Math.NET基础数学类库使用(08)C#进行数值积分               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  9. [ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4158   Accepted: 1777 Descr ...

  10. SQL Server 2005,2008 正则表达式 替换函数应用详解

    CREATE function dbo.regexReplace ( @source ntext, --原字符串 ), --正则表达式 ), --替换值 , --是否是全局替换 --是否忽略大小写 ) ...