• 第二百八十七节,MySQL数据库-条件语句、循环语句、动态执行SQL语句


    MySQL数据库-条件语句、循环语句、动态执行SQL语句

    1、if条件语句

    delimiter \
    CREATE PROCEDURE proc_if ()
    BEGIN
        
        declare i int default 0;
        if i = 1 THEN
            SELECT 1;
        ELSEIF i = 2 THEN
            SELECT 2;
        ELSE
            SELECT 7;
        END IF;
    
    END\
    delimiter ;

    2、循环语句

    while循环

    delimiter \
    CREATE PROCEDURE proc_while ()
    BEGIN
    
        DECLARE num INT ;
        SET num = 0 ;
        WHILE num < 10 DO
            SELECT
                num ;
            SET num = num + 1 ;
        END WHILE ;
    
    END\
    delimiter ;

    repeat循环

    delimiter \
    CREATE PROCEDURE proc_repeat ()
    BEGIN
    
        DECLARE i INT ;
        SET i = 0 ;
        repeat
            select i;
            set i = i + 1;
            until i >= 5
        end repeat;
    
    END\
    delimiter ;

    loop循环

    iterate loop_label退出循环

    BEGIN
        
        declare i int default 0;
        loop_label: loop
            
            set i=i+1;
            if i<8 then
                iterate loop_label;
            end if;
            if i>=10 then
                leave loop_label;
            end if;
            select i;
        end loop loop_label;
    
    END

    3、动态执行SQL语句

    动态执行SQL语句,也就是执行一个存储过程来动态执行SQL语句

    举例:有这样一张表

    写一个存储过程无参,获取表里id大于11的数据

    PREPARE prod FROM存储过程里将字符串解析为sql语句执行,后面跟字符串类型的sql语句

    EXECUTE prod USING替换sql语句中的占位符,后面跟要替换占位符的、占位符变量,(sql语句中的占位符是?号)

    delimiter $$
    DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除
    CREATE PROCEDURE proc_sql () -- 创建proc_sql存储过程
    BEGIN
        declare p1 int;  -- 设置p1变量
        set p1 = 11;     -- 赋值p1变量等于11
        set @p1 = p1;    -- 赋值字符串占位符变量等于p1
    
        PREPARE prod FROM 'select * from tb2 where nid > ?';  -- 解析字符串为sql语句
        EXECUTE prod USING @p1;   -- 执行sql语句,并且用占位符变量替换sql语句中的?号
        DEALLOCATE prepare prod;  -- 释放解析和执行sql语句
    
    END $$
    delimiter ;

    执行存储过程,动态执行sql语句

    CALL proc_sql();  -- 执行存储过程,动态执行sql语句

    写一个存储过程有参,动态传参获取数据

    delimiter $$
    DROP PROCEDURE IF EXISTS proc_sql $$ -- 判断proc_sql存储过程存在删除
    CREATE PROCEDURE proc_sql (          -- 创建proc_sql存储过程
        in zfchsql CHAR(90),       --  zfchsql接收字符串最大90字符,接收sql语句
        in shuzi INT(20)           --  shuzi接收整数类型,最大20字符,接收一个id数
    ) 
    BEGIN
            -- 因为解析字符串为sql语句,和替换sql语句的占位符,需要用户变量,也就是有@的变量,所以需要重新赋值成用户变量
            SET @zfchsql = zfchsql;
            SET @shuzi = shuzi;
    
        PREPARE prod FROM @zfchsql;  -- 将接收到的字符串解析为sql语句
        EXECUTE prod USING @shuzi;   -- 将接收到的整数,替换sql语句中的?号占位符
        DEALLOCATE prepare prod;  -- 释放解析和执行的sql语句
    
    END $$
    delimiter ;

    传入参数动态执行sql语句

    CALL proc_sql('select * from usr where id > ?',5);  -- 传入参数动态执行sql语句

    重点:动态执行sql语句,可以防止sql注入,

    CALL proc_sql('select * from usr -- where id > ?',5);  -- 传入参数动态执行sql语句

  • 相关阅读:
    Github上优秀的.NET Core开源项目的集合
    阿里云服务器CentOS7.5 部署RabbitMQ
    Centos7开放及查看端口
    虚拟机CentOS7.0 部署Redis 5.0.8 集群
    CentOS7 服务检查命令
    CentOS7 常用命令集合
    pyflink小试牛刀
    python mysql pymysql where 当多条件查询,动态出现某些查询条件为空,就不作为条件查询的情况
    centOS6.2 最小安装下的无线网络配置
    Linux命令提示符的配置
  • 原文地址:https://www.cnblogs.com/adc8868/p/7028827.html
Copyright © 2020-2023  润新知