基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现
一个、概要
在实际的软件开发项目。我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,。例如。假设按照尾号点表的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语句来实现的更多相关文章
- SQL语句创建数据库,SQL语句删除数据库,SQL语句创建表,SQL语句删除表,SQL语句添加约束,SQL语句删除约束
创建数据库: CREATE DATABASE Test --要创建的数据库名称 ON PRIMARY ( --数据库文件的具体描述 NAME='Test_data', --主数据文件的逻辑名称 FIL ...
- 5.oracle建表的时候同时创建主键,外键,注释,约束,索引
5.oracle建表的时候同时创建主键,外键,注释,约束,索引 1 --主键 )); ) ,constraint aba_pr primary key(id,name1)); --外键 )); --复 ...
- PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写
原文:PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大.小写 若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入T ...
- oracle 建表时显示ORA-00984: 列在此处不允许
oracle 建表时显示ORA-00984: 列在此处不允许 CreationTime--2018年7月19日16点10分 Author:Marydon 1.情景展示 使用plsql建表时,报错 ...
- oracle 建表时显示ORA-00904无效的标识符
oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...
- oracle 建表 主键自增序列/////
oracle 建表 主键自增序列 (2011-10-12 11:59:22) 转载▼ 标签: 杂谈 分类: oracle SQL> create table sms_activity( 2 ...
- Oracle建表提示SQL 错误: ORA-00904: : 标识符无效
Oracle建表提示: 错误报告:SQL 错误: ORA-00904: : 标识符无效00904. 00000 - "%s: invalid identifier"*Cause: ...
- Oracle数据库常用Sql语句大全
一,数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSE ...
- Oracle,SQL Server 数据库较MySql数据库,Sql语句差异
原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...
随机推荐
- delphi webbrowser 经常使用的演示样本
var Form : IHTMLFormElement ; D:IHTMLDocument2 ; begin with WebBrowser1 do begin D := Document as IH ...
- c++堆栈实现
A Stack is a data-structure that You can only add an element to the top of the Stack, andYou can onl ...
- 配置jndi服务,javax.naming.NamingException的四种情况
1.当jndi服务没有启动,或者jndi服务的属性没有设置正确,抛出如下异常: javax.naming.CommunicationException: Can't find SerialContex ...
- HTML学习_01
html总结 html是一门标记语言,也就是不经过编译就能直接执行的语言,不像是c/c++/java等等须要转换成二进制码, html是一门最主要的学科,提供了一个框架,提供了各种标签和规则,使得语言 ...
- 区间第K大
protected static int partitions(List<KDNode> data,int left,int right,int k,int pos){ int l = l ...
- Zookeeper分享
Zookeeper: 是一个分布式的,为分布式应用提供数据一致性服务的程序. Zookeeper是怎么来的? 分布式系统:是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信 ...
- Nubia Z5S 官方4.4 201内測版 内核版本号信息
从egl推断内核的的版本号: OpenGL ES Shader Compiler Version: E031.24.00.14 Build Date: 04/29/14 Tue Local Branc ...
- Godaddy Drupal Update
Godaddy对Drupal默认安装仅仅支持到7.22,眼下Drupal已经升级到7.28,安装完Drupal 7.22后,仅仅能手工升级. 安装Drupal在:https://hostingconn ...
- [Linux]scp 命令远程复制
这些天来干预系统之前没有接触,建立使用用途良好的发展环境 scp命令,那么如何使用查询以下信息. scp是secure copy的缩写.主要用来linux系统之间的文件和文件夹的远程拷贝 能够非常ea ...
- 【Linux探索之旅】第一部分第四课:磁盘分区,并完成Ubuntu安装
内容简介 1.第一部分第四课:磁盘分区,并完成Ubuntu安装 2.第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区 上一课我们正式开始安装Ubuntu了,但是到了分区的那一步,小编却戛然 ...