基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现
2015-10-05 08:26
471 查看
一个、概要
在实际的软件开发项目。我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,。例如。假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中。
对于类型同样的多个表,我们能够逐个建立,也能够採用循环的方法来建立。与之相相应的,能够用一个存储过程实现对全部表的操作。也能够循环建立存储过程,每一个存储过程实现对某个特定表的操作。
本文中,我们建立10个员工信息表。每一个表中包括员工工号(8位)和年龄字段,以工号的最后一位来分表。同一时候,我们建立存储过程实现对员工信息的插入。本文中的SQL语句基于ORACLE数据库实现。
二、一般的实现方式
在该实现方式中,我们逐个建立员工信息表,并在一个存储过程实现对全部表的操作。详细SQL语句例如以下:
建表语句:
存储过程创建语句:
三、循环创建的实现方式
在该实现方式中,我们採用循环的方法建立员工信息表及存储过程。详细SQL语句例如以下:
建表语句:
存储过程创建语句:
四、总结
当同样类型的表的个数较多时(如有上百个)。显然用循环创建的实现方式能够节约大量的工作时间,提高工作效率。可是,在使用该方法的时候,要特别细致,尤其要注意单引號的使用,避免为了省事而引入代码逻辑问题。
本人微信公众号:zhouzxi。请扫描下面二维码:
在实际的软件开发项目。我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,。例如。假设按照尾号点表的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 Linux官方yum源
- CentOS6 下Oracle 11 g数据库
- Oracle中DBMS_JOB.SUBMIT的用法说明
- oracle系统包——dbms job用法(oracle定时任务)
- oracle job 定时执行 存储过程
- linux下一个Oracle11g RAC建立(五岁以下儿童)
- SQL Server与Oracle的一些区别
- Oracle在不同的语言环境结果to_date错误的问题
- oracle4
- ORACLE PL/SQL编程,触发器
- Manual Database Creation in Oracle10g(RAC)
- ORACLE触发器详解
- oracle 使用ID关键字作列名导致索引失效
- Oracle中的触发器
- C#调用Oracle存储过程
- Oracle创建序列,序列的语法格式及使用和查询
- Oracle RETURNING INTO 用法示例
- Oracle VM VirtualBox 不显示64位系统 linux 64 redhat 64
- Oracle元数据重构实验
- 安装Oracle11g-client