💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
```sql # 定义存储过程的语法 CREATE PROCEDURE process_name(params_list) [COMMENT 'string'] [LANGUAGE SQL] [DETERMINISTIC | NOT DETERMINISTIC] [CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA] [SQL SECURITY {DEFINER | INVOKER}] BEGIN -- 业务逻辑代码, -- 如果这里只有一条SQL语句,则可以省略BEGIN与END END; - process_name:自定义的存储过程名称,建议避免与MySQL中的函数重名 - params_list:参数列表,参数之间用 , 隔开 - 一个参数由三部分组成:【参数模式 参数名 参数类型】,如 in params varchar(255) - 参数名:建议不要与表中的列名同名 - 参数模式: - in:该参数可以作为输入,也就是该参数需要调用方传入值 - out:该参数可以作为输出,也就是该参数可以作为返回值 - inout:该参数既可以作为输入又可以作为输出, 也就是该参数既需要传入值,又可以返回值 - 参数类型:如varchar(255) 长度可省略 - COMMENT'string':用于对存储过程的描述,其中string为描述内容,comment为关键字 - LANGUAGE SQL:指明编写这个存储过程的语言为SQL语言 - DETERMINISTIC:表示存储过程对同样的输入参数产生相同的结果 - NOT DETERMINISTIC:表示存储过程对同样的输入参数产生不相同的结果(默认) - CONTAINS SQL:表示存储过程包含读或写数据的SQL语句(默认) - NO SQL:表示存储过程不包含任何SQL语句 - READS SQL DATA:表示存储过程只包含读数据的SQL语句 - MODIFIES SQL DATA:表示存储过程只包含写数据的SQL语句 - SQL SECURITY:表示存储过程的调用是用存储过程的定义者的许可(definer,默认)来执行, 还是用调用者的许可(invoker)来执行 ``` ```sql # 案例演示准备数据 drop table if exists `user`; create table `user`( `id` int(11) primary key not null auto_increment, `username` varchar(255) not null, `password` varchar(255) not null )engine=INNODB default charset=utf8; insert into `user`(`id`, `username`, `password`) values(1, '张三', 'zhangsan'); insert into `user`(`id`, `username`, `password`) values(2, '李四', 'lisi'); ``` **演示1:向表插入一条数据** ```sql --结束符号默认为 ; ,存储过程内使用 ; 结束一个语句 --在命令行模式下,为了便于区分可以自定义一个结束符号 $ delimiter $ create procedure proce_user01() begin insert into user(`id`,`username`, `password`) values(3, '王五', 'wangwu'); end $ # 调用存储过程 mysql> call proce_user01() $ mysql> select * from user $ +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | 张三 | zhangsan | | 2 | 李四 | lisi | | 3 | 王五 | wangwu | +----+----------+----------+ ``` **演示2:`in`与`out`参数模式** ```sql # 定义存储过程 delimiter $ create procedure proce_user02(in inValue varchar(255), out outValue varchar(255)) begin select username into outValue from user where password=inValue; end $ # 调用存储过程 call proce_user02('zhangsan', @outVal) $ mysql> select @outval $ +---------+ | @outval | +---------+ | 张三 | +---------+ ``` **演示3:`inout`参数** ```sql # 定义存储过程 delimiter $ create procedure proce_user03(inout ioValue varchar(255)) begin -- 声明局部变量 tempVal declare tempVal varchar(255) default null; set tempVal = ioValue; set ioValue = 'newIoValue'; select tempVal; end $ # 调用存储过程 set @ioVal = 'oldIoValue' $ mysql> call proce_user03(@ioVal) $ +------------+ | tempVal | +------------+ | oldIoValue | +------------+ mysql> select @ioVal $ +------------+ | @ioVal | +------------+ | newIoValue | +------------+ ``` **演示4:登录验证** ```sql # 定义存储过程 create procedure proce_login_user(in uname varchar(255), in pass varchar(255), out result int) begin select count(1) into result from `user` where password=pass and username=uname; end $ # 调用存储过程 set @uname='王五' $ set @pass='wangwu' $ call proce_login_user(@uname, @pass, @result) $ mysql> select @result $ +---------+ | @result | +---------+ | 1 | +---------+ ```