首页 > 数据库 >SQL的存储过程,语法示例

SQL的存储过程,语法示例

时间:2024-07-03 13:53:50浏览次数:17  
标签:set end 示例 int 游标 语法 SQL total declare

存储过程

类型含义
IN 作为输入,调用时需要传入值
OUT 作为输出,该参数作为返回值
INOUT 既可以输入参数,也可以输出参数

 

语法:
    创建
        create procedure 存储过程名称(
        in 参数名称1 参数数据类型,
        out 参数名称2 参数数据类型,
        inout 参数名称3 参数数据类型
        )
        begin
            ————SQL语句
        end;
    调用
        call 存储过程名称(参数1,@参数名称2)        # in和out
        
        set @参数名称2 = X;
        call 存储过程名称(@参数名称2);        #inout
        select @参数名称2;
    查看
        show create procedure 存储过程名称;
    删除
        drop procedure if exists 存储过程名称; 

用户变量

​ 定义:用户自定义的变量,即用户变量,用户变量不用提前声明,在使用的时候直接用@变量名使用即可。作用域为当前连接

    创建用户变量    
        set @变量名 = 值
        select 字段名 into @变量名 from 表名;    @把字段的值赋给用户变量
    使用用户变量
        select @变量名;

局部变量

定义:局部变量是根据需要定义的在局部生效的变量,访问之前,需要declare声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end块

声明:    
    declare 变量名 变量类型 [default x]; #default为默认值,此时默认值为x
赋值:
    set 变量名 = 值;
    select 字段名 into 变量名 from 表名....;
    
eg:
    create procedure p()
    begin
        declare stu_count int default 0;
        select count(*) into stu_count from student;
        select stu_count;
    end;
    call p();        #把count(*)的值赋给了stu_count

逻辑语句 if else

语法:
    if 条件1 then
        代码1
    elseif 条件2 then        #可选
        代码2
    else                #可选
        代码3
    end if;
    
    如果 符合条件1 则进入代码1,否则如果符合条件2则进入代码2,否则进入代码3
    
eg:
    create procedure p(
    in sc char(10),
    in sc2 char(10)
    )
    begin    
        declare result varchar(10);
        declare sum int;
        select grade into sum from score where sno = sc and cno = sc2; 
        if sum >= 85 then
            set result = '优秀';
        elseif sum>=60 then
            set result = '及格';
        else
            set result = '不及格';
        end if;
        select result;
    end;
    call p('2015001','c02');

分支函数 case

语法1:
    case 表达式
        when when_value1 then statement_list1
        when when_value2 then statement_list3
        ....
        else statement_list
语法2:
    case 
        when 表达式1 then 代码1
        when 表达式2 then 代码2
        .....
        else
            代码3
    end case;
eg:
    create PROCEDURE p2(
    in month int)
    begin
    declare result varchar(10);
    case
        when month>=1 and month<=3 then
            set result = '第一季度';
        when month>=4 and month<=6 then
            set result = '第二季度';
        when month>=7 and month<=9 then
            set result = '第三季度';
        when month>=10 and month<=12 then
            set result = '第四季度';
        else
            set result = '非法参数';
        end case;
        select concat('您输入的月份为:',month,'所属的季度为:',result);
    end;
    call p2(1);

循环

while

满足条件后,再次执行循环体中的sql语句

# 先判断条件,如果条件为true,则执行逻辑,否则,不执行
while 条件 do
    sql逻辑代码
end while;

eg:
    #计算从1累加到n的值,n为传入的参数
    create procedure p3(
    in n int
    )
    begin
        declare total int DEFAULT 0;
        while n>0 do
            set total = total+n;
            set n = n-1;
        end while;
        select total;
    end;
    call p3(3);

repeat

# 先判断条件,当满足条件时退出循环
#先执行一次逻辑,然后判定逻辑是否满足,如果满足则退出,否则继续
repeat
    sql逻辑代码
    until 条件
end repeat;

eg:
    create procedure p4(
    in n int
    )
    begin
        declare total int DEFAULT 0;
        repeat
            set total = total+n;
            set n = n-1;
            until n<0
        end repeat;
        select total;
    end;
    call p4(3);

loop

loop实现简单的循环,如果不在sql逻辑中增加退出循环的条件,可以用其来实现简单的死循环,loop可以配合以下两个语句使用

  1. leave :配合循环使用,退出循环
  2. iterate :必须用在循环中,作用和 C++的continue相同
    语法:
        标记名:loop
            SQL逻辑代码
        end loop 标记名;
        
        leave lable;   #退出指定标记的循环体
        iterate label;  #直接进入下一次循环
        
    eg:
         create procedure p5(
        in n int
        )
        begin
            declare total int DEFAULT 0;
            sum:loop
                if n<=0 then
                    leave sum;
                end if;
                set total = total+n;
                set n = n-1;
            end loop sum;
            select total;
        end;
        call p5(3);
       
       #如果加到奇数的话iterate
           create PROCEDURE p6(
        in n int
        )
        begin
            declare total int DEFAULT 0;
            sum:loop
                if n<=0 then
                    leave sum;
                end if;
    
                if n%2=1 then
                    set n = n-1;
                    ITERATE sum;
                end if;
    
                set total = total+n;
                set n = n-1;
            end loop sum;
            select total;
        end;
        call p6(3);

游标

游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。

声明游标:
        declare 游标名 cursor for 查询语句;
打开游标:                #使用游标之前需要先打开游标
        open 游标名;
获取游标记录:
        fetch 游标名 into 变量;
关闭游标:
        close 游标名; 
        
eg:
    根据传入的参数age,查询students表中,所有学生出生日期小于age的用户姓名和专业,并将用户的姓名和专业插入到一个新表中
    思路:A:声明游标,B:创建表,C:开启游标,D:获取游标中的记录,E:插入数据到新表,F:关闭游标
    create PROCEDURE p7(
    in uage date            #传入出生日期
    )
    begin
        declare usname varchar(100);        #保存符合条件的学生信息的两个局部变量
        declare upro varchar(100);
        
        declare u_cursor cursor for         #声明游标,
        select sname,smajor from students where sbirthday<uage;    #找出 出生日期大于uage的

    #如果存在则删除,这样的话就保证表中只显示比uage大的学生信息
        drop table if exists tb_user;                                                                                                
        create table if not exists tb_user(        #创建表
            id int primary key auto_increment,    #id设置自增主键
            uname varchar(100),
            sdapt varchar(100)
        );
        open u_cursor;                #打开游标
        while true do                #进入while循环
            fetch u_cursor into usname,upro;     # 把游标中的记录存入两个局部变量
            insert into tb_user values(null,usname,upro);    #插入新表
        end while;
        close u_cursor;        #关闭游标
    end;
    call p7('1999-03-1');

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是in类型的。

语法:
    create function 存储函数名(参数列表)
    returns type [characteristic...]
    begin
        SQL语句
        return ...;
    end;
    
    characteristic说明:
                deterministic:相同的输入参数总是产生相同的结果
                no sql         :不包含sql语句
                reads sql data: 包含读取数据的语句,但不包含写入数据的语句

eg:    
    create function fun1(n int)
    returns int deterministic
    begin
        declare total int default 0;
        while n>0 do
            set total = total+n;
            set n = n-1;
        end while;

        return total;
    end;
    select fun1(10);

注意:存储函数必须要有返回值

标签:set,end,示例,int,游标,语法,SQL,total,declare
From: https://www.cnblogs.com/Rui6/p/18281451

相关文章

  • SQL INSERT批量插入方式
    1、常规INSERT写法INSERTINTO...VALUES(...);INSERTINTO表名(`字段1`,`字段2`)VALUES('字段1的值','字段2的值');2、SELECT语句返回值INSERTINSERTINTO...VALUES(...,(select...));INSERTINTO表名1(`字段1`,`字段2`)VALUES(字段1的值,(select查......
  • 使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst
    1.新建项目,下载Nuget安装包创建项目需要注意几点,如果是基于.netframework的项目需要选择相应版本的EF,如果是跨平台则选择EFCore版本。我这里选择的是.netframework版本。红框里面是实现EFCodeFirst需要的包。对应的版本:EntityFramework6.3.0MySql.Data6.8......
  • SQLServer设置端口
    要在SQLServer中设置或更改端口号,可以通过SQLServer配置管理器进行配置。以下是具体步骤:打开SQLServer配置管理器:在Windows上,按Win+R打开“运行”对话框,输入SQLServerManager<version>.msc,例如SQLServerManager13.msc(适用于SQLServer2016)或SQLServe......
  • 邮件通知提醒邮箱设置教程及API代码示例!
    邮件通知的警告功能如何配置?详细教程与API代码示例!无论是业务提醒、账户活动警告,还是个人事务,邮件通知已经成为一种重要的沟通工具。AokSend将详细介绍如何设置邮件通知提醒邮箱,并提供相应的API代码示例,帮助你更高效地管理信息流。邮件通知:选择务提供商常见的有Gmail、Outl......
  • 瑞友天翼应用虚拟化系统SQL注入漏洞
    最近网上公开了一些瑞友天翼应用虚拟化系统的SQL注入漏洞,经过挖掘发现,还存在一些后台SQL注入漏洞。重点关注传入参数可控并且拼接到SQL语句中的代码。​getappicon​首先检测了登录状态,然后将通过GET获取到的参数id直接拼接到SQL语句中。GET/hmrao.php?s=/Admi......
  • 【postgresql】表操作
    创建表(CREATETABLE):CREATETABLEtable_name(column1data_typeconstraint,column2data_typeconstraint,...);插入数据(INSERTINTO):INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,...);查询数据(SELECT):SELECTcol......
  • 前端视角下的Go语法学习:demo-crud 实现增删改查
    今日话题基于go+gin实现增删改查,仅仅只是提供接口不涉及数据库增删改查作者:云层上的光时间:2024年6月22日10时15分14秒主线任务一、项目创建1、创建demo-crud文件夹2、编辑器打开demo-crud项目,提示设置gosdk,这里我设置了1.22.43、声明go.mod文件go......
  • Sql Server日常运维!
    内容来源于网络,如有侵权,请联系我删除。一、基础命令查看当前数据库的版本SELECT@@VERSION;查看服务器部分特殊信息selectSERVERPROPERTY(N'edition')asEdition--数据版本,如企业版、开发版等,SERVERPROPERTY(N'collation')asCollation--数据库字符集......
  • ORM - SqlSugar
    //SqlSugarHelper.DemoDbContext.GenerateModels();varlist=SqlSugarHelper.DemoDbContext.Query<ORMClsLib.dbo.DemoEntity>();varitem=newORMClsLib.dbo.DemoEntity(){operatorName="test",};SqlSugarHelper.DemoDbContext.InsertOrUpdat......
  • sql
    动态列宽整体修改selectt.strtitle,t.intwidthfrombaselistcolumntwheret.lngmenuid=600038forupdate;updatebaselistcolumntsett.intwidth=100wheret.strtitle='状态';改变字段的sqlupdatesysmenutsett.strurl='cashier-payments',t.strmen......