精华内容
下载资源
问答
  • 本篇文章是对如何在SQL SERVER 2005存储过程中,使用循环语句进行了详细的分析介绍,需要的朋友参考下
  • 创建存储过程 # 修改分隔符 delimiter $$; # 创建存储过程 CREATE PROCEDURE proc_while () BEGIN DECLARE num INT; SET num = 0; WHILE num < 1000 DO <..待执行的语句..> SET num = num + 1 ; ...
    • 创建存储过程
    # 修改分隔符
    delimiter $$;
    # 创建存储过程
    CREATE PROCEDURE proc_while ()
    BEGIN
        DECLARE num INT;
        SET num = 0;
        WHILE num < 1000 DO
            <..待执行的语句..>
            SET num = num + 1 ;
        END WHILE ;
    END;
    $$;
    # 将分隔符变成分号。
    delimiter ;
    
    • 调用存储过程
    # 调用存储过程
    call proc_while;
    
    • 删除存储过程
    # 删除存储过程
    #DROP PROCEDURE IF EXISTS proc_while;
    
    展开全文
  • 本文实例讲述了mysql存储过程循环语句(WHILE,REPEAT和LOOP)用法。分享给大家供大家参考,具体如下: MySQL提供循环语句,允许我们根据条件重复执行一个SQL代码块其中有三个循环语句:WHILE,REPEAT和LOOP,我们...
  • sql 循环语句

    2013-01-28 12:16:10
    循环插入数据的语句,相信会对你有所启发。希望对你有所帮助!
  • 主要介绍了循环和游标在Sql存储过程使用sql如何使用cursor写一个简单的循环的相关资料,需要的朋友可以参考下
  • SQL循环语句

    千次阅读 2010-04-16 12:46:00
    SQL循环语句 declare @i int set @i=1 while @ibegin insert into test (userid) values(@i) set @i=@i+1 end --------------- while 条件 begin 执行操作 set @i=@i+1 end WHILE 设置重复执行 SQL 语句或语句块的...

    SQL循环语句
    declare @i int
    set @i=1
    while @i<30
    begin
    insert into test (userid) values(@i)
    set @i=@i+1
    end

    ---------------

    while 条件
    begin
    执行操作
    set @i=@i+1
    end

    WHILE
    设置重复执行 SQL 语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

    语法
    WHILE Boolean_expression
          { sql_statement | statement_block }
          [ BREAK ]
          { sql_statement | statement_block }
          [ CONTINUE ]

    参数
    Boolean_expression

    返回 TRUE 或 FALSE 的表达式。如果布尔表达式中含有 SELECT 语句,必须用圆括号将 SELECT 语句括起来。

    {sql_statement | statement_block}

    Transact-SQL 语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字 BEGIN 和 END。

    BREAK

    导致从最内层的 WHILE 循环中退出。将执行出现在 END 关键字后面的任何语句,END 关键字为循环结束标记。

    CONTINUE

    使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后的任何语句。

    注释
    如果嵌套了两个或多个 WHILE 循环,内层的 BREAK 将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。

    示例
    A. 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE
    在下例中,如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。

    USE pubs
    GO
    WHILE (SELECT AVG(price) FROM titles) < $30
    BEGIN
         UPDATE titles
            SET price = price * 2
         SELECT MAX(price) FROM titles
         IF (SELECT MAX(price) FROM titles) > $50
            BREAK
         ELSE
            CONTINUE
    END
    PRINT 'Too much for the market to bear'

    B. 在带有游标的过程中使用 WHILE
    以下的 WHILE 结构是名为 count_all_rows 过程中的一部分。下例中,该 WHILE 结构测试用于游标的函数 @@FETCH_STATUS 的返回值。因为 @@FETCH_STATUS 可能返回 –2、-1 或 0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取 (0) 后将执行 BEGIN...END 循环内部的 SELECT 语句。

    USE pubs
    DECLARE tnames_cursor CURSOR
    FOR
         SELECT TABLE_NAME
         FROM INFORMATION_SCHEMA.TABLES
    OPEN tnames_cursor
    DECLARE @tablename sysname
    --SET @tablename = 'authors'
    FETCH NEXT FROM tnames_cursor INTO @tablename
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
         IF (@@FETCH_STATUS <> -2)
         BEGIN   
            SELECT @tablename = RTRIM(@tablename)
            EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '
                  + @tablename )
            PRINT ' '
        END
         FETCH NEXT FROM tnames_cursor INTO @tablename
    END
    CLOSE tnames_cursor
    DEALLOCATE tnames_cursor

    展开全文
  • 一、概述 在实际的软件开发项目中,我们经常会遇到需要创建多个相同类型的...与之相对应的,可以用一个存储过程实现对所有表的操作,也可以循环建立存储过程,每个存储过程实现对某个特定表的操作。 本文中,我们

    一、概述
    在实际的软件开发项目中,我们经常会遇到需要创建多个相同类型的数据库表或存储过程的时候。例如,如果按照身份证号码的尾号来分表,那么就需要创建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,请扫描以下二维码:
    这里写图片描述

    展开全文
  • 今天写存储过程,遇到一个问题,具体如下:需求是要统计一张报表,这张表的列固定,因此在存储过程里做插入语句的时候,就用到了sql语句拼接再执行。这里拼接的insert语句是set @sql= 'insert into ##tn(prj) ...

    今天写存储过程,遇到一个问题,具体如下:

    需求是要统计一张报表,这张表的列不固定,因此在存储过程里做插入语句的时候,就用到了sql语句拼接再执行。

    这里拼接的insert语句是

    set @sql= 'insert into ##tn(prj) values('+@pzid+')'
    		

    如果按照上述语句执行就会报错“列名无效”;

    改为

    set @sql= 'insert into ##tn(prj) values('+char(39)+@pzid+char(39)+')'

    加上char(39)这样就可以了。

    至于为什么加char(39),后来我上网查了相关资料,知道这是ASCII码值,表示单引号。

    到此问题解决,以上是我遇到的问题,做个笔记,仅供参考。

    展开全文
  • Oracle之创建存储过程SQL语句

    千次阅读 2020-05-19 17:23:26
    1、创建存储过程。 create or replace procedure myprocedure(sid in number) as exam number; begin select * from score where sid=score.userid; dbms_output.put_line(exam); if exam>60 then dbms_o
  •  1、此存储过程SQL SERVER 2005上测试通过,值得注意的是,循环体中,语句是使用BEGIN……END包括的,而不是网络上常说的WHILE ……END WHILE结构,其他的循环语句,如LOOP ……UNTIL……END LOOP也能通过编译...
  • MySQL 存储过程使用动态SQL语句示例 CREATE PROCEDURE CaluHejije(IN ind int,IN iyf int) BEGIN DECLARE ihv INT; DECLARE sfname varchar(20); declare var_sql varchar(800); DECLARE jeheji decimal(18,...
  • SQL循环语句 详解

    千次阅读 2018-03-16 11:43:00
    SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end ---------------while 条件begin执行操作set @i=@i+1endWHILE设置重复执行 ...
  • 这里转换成hive的sql语句:hql,其根本问题是为了解决hive支持事物处理、数据删除操作,这两点是hive的sql和传统sql差异的主要点; 就比如一段存储过程,现在需要迁移到hive上运行,一般主要过程:声明变量、初始...
  • SQL循环语句

    千次阅读 2008-02-22 09:17:00
    declare @i intset @i=1while @ibegininsert into test (userid) values(@i)set @i=@i+1end---------------while 条件begin执行操作set @i=@i+1endWHILE设置重复执行 SQL 语句语句块的条件。只要指定的条件为真,...
  • sqlserver 数据库 SQL循环语句

    千次阅读 2010-08-22 13:37:00
    SQL循环语句 declare @i int set @i=1 while @i begin insert into test (userid) values(@i) set @i=@i+1 end --------------- while 条件 begin 执行操作 set @i=@i+1 ...
  • 主要介绍了MySQL存储过程中实现执行动态SQL语句的方法,实例分析了MySQL中构造及执行动态SQL语句的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 自动执行SQL语句&创建标准的Sql 存储过程
  • (一)MySQL存储过程的 IF语句语法 IF expression THEN statements; END IF; 使用实例:从customers表中获得客户的信用额度。 参数:p_customerlevel用来存储客户的级别,并由调用程序使用。 DELIMITER $$ ...
  • 基本编程: 定义变量 declare @变量名 数据类型  赋值 set @变量名 = 值 select @变量名 = 值  取值打印 select @变量名 print @变量名 映射到结果集 ... 循环语句 注意循环四要素:初始条件,循环条
  • 存储过程中的循环语句

    千次阅读 2010-11-21 11:43:00
    可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环语句的执行。 语法 WHILE Boolean_expression  { sql_statement | statement_block }  [ BREAK ]  { sql_statement | ...
  • 常用sql语句
  • 存储过程中拼接SQL语句

    万次阅读 2012-01-18 09:59:39
    很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了。具体看如下演示代码:   代码: set ANSI_NULLS ON set...
  • PL/SQL 中的循环语句主要包括LOOP语句、WHERE语句和FOR语句3种。本篇博客主要讲解这三种用法及代码示例。 本篇博客主要围绕 基本语法、简单代码示例,以及实战上常用的示例,这三点来讲解,学习循环看这一篇足够了。...
  • 先判断当前时间,如果是0点到08点之间,就执行第一条sql语句,否则就执行第二条sql语句 我就知道用case when去判断,但是 then 后面怎么写?难道要用一个变量装SQLy语句?然后分别给他赋值? 比如举个例子: ...
  • SQL循环语句 的写法

    千次阅读 2011-06-01 11:23:00
    SQL循环语句 declare @i int set @i=1 while @i<30 <br />begin insert into test (userid) values(@i) set @i=@i+1 end <br />--------------- <br />while...
  • SqlServer存储过程循环使用

    千次阅读 2020-04-01 11:17:58
    1.while循环 格式示例如下: declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end 2.游标循环 格式示例如下: DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 ...
  • SQL Code复制内容到剪贴板 mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc()  -> BEGIN   ->  -> DECLARE i int;  -> SET i=1;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,618
精华内容 45,447
关键字:

不使用存储过程sql循环语句