• 基于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。请扫描下面二维码:
    这里写图片描写叙述

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

  • 相关阅读:
    vue-Prop
    C#四舍五入的方法
    设计模式-建造者模式
    vue-解决Vue打包上线之后部分CSS不生效的问题
    vue项目兼容IE浏览器
    html-box-sizing
    MSSQLSERVER执行计划详解
    white-space和word-wrap和word-break所表示的换行和不换行的区别
    JS设置cookie、读取cookie、删除cookie
    windows7 telnet服务开启和登录授权
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4855324.html
Copyright © 2020-2023  润新知