一个、概要

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

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

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

二、一般的实现方式

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

建表语句:

  1. -- tb_employeeinfo0
  2. begin
  3. execute immediate 'drop table tb_employeeinfo0 cascade constraints';
  4. exception when others then commit;
  5. end;
  6. /
  7. create table tb_employeeinfo0
  8. (
  9. employeeno varchar2(10) not null, -- employee number
  10. employeeage int not null -- employee age
  11. );
  12. create unique index idx1_tb_employeeinfo0 on tb_employeeinfo0(employeeno);
  13. prompt 'create table tb_employeeinfo0 ok';
  14. commit;
  15. -- tb_employeeinfo1
  16. begin
  17. execute immediate 'drop table tb_employeeinfo1 cascade constraints';
  18. exception when others then commit;
  19. end;
  20. /
  21. create table tb_employeeinfo1
  22. (
  23. employeeno varchar2(10) not null, -- employee number
  24. employeeage int not null -- employee age
  25. );
  26. create unique index idx1_tb_employeeinfo1 on tb_employeeinfo1(employeeno);
  27. prompt 'create table tb_employeeinfo1 ok';
  28. commit;
  29. -- tb_employeeinfo2
  30. begin
  31. execute immediate 'drop table tb_employeeinfo2 cascade constraints';
  32. exception when others then commit;
  33. end;
  34. /
  35. create table tb_employeeinfo2
  36. (
  37. employeeno varchar2(10) not null, -- employee number
  38. employeeage int not null -- employee age
  39. );
  40. create unique index idx1_tb_employeeinfo2 on tb_employeeinfo2(employeeno);
  41. prompt 'create table tb_employeeinfo2 ok';
  42. commit;
  43. -- tb_employeeinfo3
  44. begin
  45. execute immediate 'drop table tb_employeeinfo3 cascade constraints';
  46. exception when others then commit;
  47. end;
  48. /
  49. create table tb_employeeinfo3
  50. (
  51. employeeno varchar2(10) not null, -- employee number
  52. employeeage int not null -- employee age
  53. );
  54. create unique index idx1_tb_employeeinfo3 on tb_employeeinfo3(employeeno);
  55. prompt 'create table tb_employeeinfo3 ok';
  56. commit;
  57. -- tb_employeeinfo4
  58. begin
  59. execute immediate 'drop table tb_employeeinfo4 cascade constraints';
  60. exception when others then commit;
  61. end;
  62. /
  63. create table tb_employeeinfo4
  64. (
  65. employeeno varchar2(10) not null, -- employee number
  66. employeeage int not null -- employee age
  67. );
  68. create unique index idx1_tb_employeeinfo4 on tb_employeeinfo4(employeeno);
  69. prompt 'create table tb_employeeinfo4 ok';
  70. commit;
  71. -- tb_employeeinfo5
  72. begin
  73. execute immediate 'drop table tb_employeeinfo5 cascade constraints';
  74. exception when others then commit;
  75. end;
  76. /
  77. create table tb_employeeinfo5
  78. (
  79. employeeno varchar2(10) not null, -- employee number
  80. employeeage int not null -- employee age
  81. );
  82. create unique index idx1_tb_employeeinfo5 on tb_employeeinfo5(employeeno);
  83. prompt 'create table tb_employeeinfo5 ok';
  84. commit;
  85. -- tb_employeeinfo6
  86. begin
  87. execute immediate 'drop table tb_employeeinfo6 cascade constraints';
  88. exception when others then commit;
  89. end;
  90. /
  91. create table tb_employeeinfo6
  92. (
  93. employeeno varchar2(10) not null, -- employee number
  94. employeeage int not null -- employee age
  95. );
  96. create unique index idx1_tb_employeeinfo6 on tb_employeeinfo6(employeeno);
  97. prompt 'create table tb_employeeinfo6 ok';
  98. commit;
  99. -- tb_employeeinfo7
  100. begin
  101. execute immediate 'drop table tb_employeeinfo7 cascade constraints';
  102. exception when others then commit;
  103. end;
  104. /
  105. create table tb_employeeinfo7
  106. (
  107. employeeno varchar2(10) not null, -- employee number
  108. employeeage int not null -- employee age
  109. );
  110. create unique index idx1_tb_employeeinfo7 on tb_employeeinfo7(employeeno);
  111. prompt 'create table tb_employeeinfo7 ok';
  112. commit;
  113. -- tb_employeeinfo8
  114. begin
  115. execute immediate 'drop table tb_employeeinfo8 cascade constraints';
  116. exception when others then commit;
  117. end;
  118. /
  119. create table tb_employeeinfo8
  120. (
  121. employeeno varchar2(10) not null, -- employee number
  122. employeeage int not null -- employee age
  123. );
  124. create unique index idx1_tb_employeeinfo8 on tb_employeeinfo8(employeeno);
  125. prompt 'create table tb_employeeinfo8 ok';
  126. commit;
  127. -- tb_employeeinfo9
  128. begin
  129. execute immediate 'drop table tb_employeeinfo9 cascade constraints';
  130. exception when others then commit;
  131. end;
  132. /
  133. create table tb_employeeinfo9
  134. (
  135. employeeno varchar2(10) not null, -- employee number
  136. employeeage int not null -- employee age
  137. );
  138. create unique index idx1_tb_employeeinfo9 on tb_employeeinfo9(employeeno);
  139. prompt 'create table tb_employeeinfo9 ok';
  140. commit;

存储过程创建语句:

  1. create or replace procedure pr_insertdata
  2. (
  3. v_employeeno in varchar2,
  4. v_employeeage in int
  5. )
  6. as
  7. v_employeecnt int;
  8. v_tableindex varchar2(2);
  9. begin
  10. v_tableindex := substr(v_employeeno, length(v_employeeno), 1);
  11. if v_tableindex = '0' then
  12. begin
  13. select count(*) into v_employeecnt from tb_employeeinfo0 where employeeno = v_employeeno;
  14. if v_employeecnt > 0 then -- the employeeno is already in DB
  15. begin
  16. return;
  17. end;
  18. else -- the employeeno is not in DB
  19. begin
  20. insert into tb_employeeinfo0(employeeno, employeeage) values(v_employeeno, v_employeeage);
  21. end;
  22. end if;
  23. end;
  24. elsif v_tableindex = '1' then
  25. begin
  26. select count(*) into v_employeecnt from tb_employeeinfo1 where employeeno = v_employeeno;
  27. if v_employeecnt > 0 then -- the employeeno is already in DB
  28. begin
  29. return;
  30. end;
  31. else -- the employeeno is not in DB
  32. begin
  33. insert into tb_employeeinfo1(employeeno, employeeage) values(v_employeeno, v_employeeage);
  34. end;
  35. end if;
  36. end;
  37. elsif v_tableindex = '2' then
  38. begin
  39. select count(*) into v_employeecnt from tb_employeeinfo2 where employeeno = v_employeeno;
  40. if v_employeecnt > 0 then -- the employeeno is already in DB
  41. begin
  42. return;
  43. end;
  44. else -- the employeeno is not in DB
  45. begin
  46. insert into tb_employeeinfo2(employeeno, employeeage) values(v_employeeno, v_employeeage);
  47. end;
  48. end if;
  49. end;
  50. elsif v_tableindex = '3' then
  51. begin
  52. select count(*) into v_employeecnt from tb_employeeinfo3 where employeeno = v_employeeno;
  53. if v_employeecnt > 0 then -- the employeeno is already in DB
  54. begin
  55. return;
  56. end;
  57. else -- the employeeno is not in DB
  58. begin
  59. insert into tb_employeeinfo3(employeeno, employeeage) values(v_employeeno, v_employeeage);
  60. end;
  61. end if;
  62. end;
  63. elsif v_tableindex = '4' then
  64. begin
  65. select count(*) into v_employeecnt from tb_employeeinfo4 where employeeno = v_employeeno;
  66. if v_employeecnt > 0 then -- the employeeno is already in DB
  67. begin
  68. return;
  69. end;
  70. else -- the employeeno is not in DB
  71. begin
  72. insert into tb_employeeinfo4(employeeno, employeeage) values(v_employeeno, v_employeeage);
  73. end;
  74. end if;
  75. end;
  76. elsif v_tableindex = '5' then
  77. begin
  78. select count(*) into v_employeecnt from tb_employeeinfo5 where employeeno = v_employeeno;
  79. if v_employeecnt > 0 then -- the employeeno is already in DB
  80. begin
  81. return;
  82. end;
  83. else -- the employeeno is not in DB
  84. begin
  85. insert into tb_employeeinfo5(employeeno, employeeage) values(v_employeeno, v_employeeage);
  86. end;
  87. end if;
  88. end;
  89. elsif v_tableindex = '6' then
  90. begin
  91. select count(*) into v_employeecnt from tb_employeeinfo6 where employeeno = v_employeeno;
  92. if v_employeecnt > 0 then -- the employeeno is already in DB
  93. begin
  94. return;
  95. end;
  96. else -- the employeeno is not in DB
  97. begin
  98. insert into tb_employeeinfo6(employeeno, employeeage) values(v_employeeno, v_employeeage);
  99. end;
  100. end if;
  101. end;
  102. elsif v_tableindex = '7' then
  103. begin
  104. select count(*) into v_employeecnt from tb_employeeinfo7 where employeeno = v_employeeno;
  105. if v_employeecnt > 0 then -- the employeeno is already in DB
  106. begin
  107. return;
  108. end;
  109. else -- the employeeno is not in DB
  110. begin
  111. insert into tb_employeeinfo7(employeeno, employeeage) values(v_employeeno, v_employeeage);
  112. end;
  113. end if;
  114. end;
  115. elsif v_tableindex = '8' then
  116. begin
  117. select count(*) into v_employeecnt from tb_employeeinfo8 where employeeno = v_employeeno;
  118. if v_employeecnt > 0 then -- the employeeno is already in DB
  119. begin
  120. return;
  121. end;
  122. else -- the employeeno is not in DB
  123. begin
  124. insert into tb_employeeinfo8(employeeno, employeeage) values(v_employeeno, v_employeeage);
  125. end;
  126. end if;
  127. end;
  128. elsif v_tableindex = '9' then
  129. begin
  130. select count(*) into v_employeecnt from tb_employeeinfo9 where employeeno = v_employeeno;
  131. if v_employeecnt > 0 then -- the employeeno is already in DB
  132. begin
  133. return;
  134. end;
  135. else -- the employeeno is not in DB
  136. begin
  137. insert into tb_employeeinfo9(employeeno, employeeage) values(v_employeeno, v_employeeage);
  138. end;
  139. end if;
  140. end;
  141. end if;
  142. commit;
  143. exception when others then
  144. begin
  145. rollback;
  146. return;
  147. end;
  148. end;
  149. /
  150. prompt 'create procedure pr_insertdata ok'

三、循环创建的实现方式

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

建表语句:

  1. -- tb_employeeinfo0~9
  2. begin
  3. declare i int;tmpcount int;tbname varchar2(50);strsql varchar2(1000);
  4. begin
  5. i:=0;
  6. while i<10 loop
  7. begin
  8. tbname := 'tb_employeeinfo'||to_char(i);
  9. i := i+1;
  10. select count(1) into tmpcount from user_tables where table_name = Upper(tbname);
  11. if tmpcount>0 then
  12. begin
  13. execute immediate 'drop table '||tbname;
  14. commit;
  15. end;
  16. end if;
  17. strsql := 'create table '||tbname||
  18. '(
  19. employeeno varchar2(10) not null, -- employee number
  20. employeeage int not null -- employee age
  21. )';
  22. execute immediate strsql;
  23. strsql := 'begin
  24. execute immediate ''drop index idx1_'||tbname || ' '''
  25. || ';exception when others then null;
  26. end;';
  27. execute immediate strsql;
  28. execute immediate 'create unique index idx1_'||tbname||' on '||tbname||'(employeeno)';
  29. end;
  30. end loop;
  31. end;
  32. end;
  33. /

存储过程创建语句:

  1. begin
  2. declare v_i int;v_procname varchar(50);v_employeeinfotbl varchar(50);strsql varchar(4000);
  3. begin
  4. v_i := 0;
  5. while v_i < 10 loop
  6. v_procname := 'pr_insertdata'||substr(to_char(v_i),1,1);
  7. v_employeeinfotbl := 'tb_employeeinfo'||substr(to_char(v_i),1,1);
  8. v_i := v_i + 1;
  9. strsql := 'create or replace procedure '||v_procname||'(
  10. v_employeeno in varchar2,
  11. v_employeeage in int
  12. )
  13. as
  14. v_employeecnt int;
  15. begin
  16. select count(*) into v_employeecnt from '||v_employeeinfotbl||' where employeeno = v_employeeno;
  17. if v_employeecnt > 0 then -- the employeeno is already in DB
  18. begin
  19. return;
  20. end;
  21. else -- the employeeno is not in DB
  22. begin
  23. insert into '||v_employeeinfotbl||'(employeeno, employeeage) values(v_employeeno, v_employeeage);
  24. end;
  25. end if;
  26. commit;
  27. exception when others then
  28. begin
  29. rollback;
  30. return;
  31. end;
  32. end;';
  33. execute immediate strsql;
  34. end loop;
  35. end;
  36. end;
  37. /

四、总结

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


本人微信公众号: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. 【HTML+CSS】(1)基本语法

    HTML基金会 <em>他强调标签,<strong>加粗标签 <q>短文本引用.<blockquote>长文本引用,这两个标签会让文字带双引號.   空 ...

  2. [转载] 树莓派读取温湿度传感器DHT11

    原文地址: http://blog.csdn.net/liang890319/article/details/8739683 硬件: 树莓派 2.0 DHT模块  接树莓派5V GND GPIO1 功 ...

  3. 【Python项目】配合爱漫画爬取漫画脚本而设计的GUI漫画阅读器 (一)

    博客园的第一个坑,想想都有点小激动 =3= 首先是那个爬虫的地址: [原创]最近写的一个比较hack的小爬虫 选择工具: 以前用过Qt,那么选pyqt4也就是情理之中了. 明确需求: 0.首先,要读取 ...

  4. Mybatis深入之事务管理

    Mybatis之事务管理 简单介绍 Mybatis的事务管理分为两种JdbcTransaction.ManagedTransaction. 当中JdbcTransaction仅仅是对数据库连接Conn ...

  5. Linux高性能server规划——多线程编程(在)

    多线程编程 Linux主题概述 线程模型 线程是程序中完毕一个独立任务的完整执行序列.即一个可调度的实体. 依据执行环境和调度者的身份.线程可分为内核线程和用户线程.内核线程,在有的系统上也称为LWP ...

  6. myeclipse如何恢复已删除的文件和代码

    这是一篇文章分享秘诀:myeclipse恢复意外删除的文件和代码 [ 恢复误删文件 ] 今天在写代码的时候,不小心把一个包给删除了,然后这个包下全部的文件都没了,相信非常多人都有类似的经历. 幸好my ...

  7. 花生壳宣布网站的网址直接绑定到详细的项目——jboss版本

    花生壳公布,首先要有域名.然后激活域名,详细的公布就不说了,网上有非常多资料,这里是在jboss下直接将网址与详细的项目相应.做法有点不地道 假设跟图上一样配置的话.訪问网址相当于訪问的是http:/ ...

  8. LinuxDLL加载优化方案

    作者:zhanhailiang 日期:2014-10-26 linux程序动态库载入流程简单介绍 linux从程序(program或对象)变成进程(process或进程),简单说来须要经过三步: fo ...

  9. 开源 java CMS - FreeCMS2.1公布

    项目地址:http://www.freeteam.cn/ FreeCMS商业版V2.1更新功能 1.web页面信息採集:通过简单配置就可以抓取目标网页信息,支持增量式採集.keyword替换.定时採集 ...

  10. SQLServer 扫盲

    原文:SQLServer 扫盲 谨以本文记录本人成长历程,并分享给各位SQL Server数据库管理系统使用者.本系列包含个人认为一个DBA应该具有的各项素质,系列文章将以下面列表展示,将持续更新,敬 ...