实例解析MySQL中的存储过程及存储过程的调用方法

前端技术 2023/09/08 MYSQL

mysql在5.1之后增加了存储过程的功能, 存储过程运行在mysql内部,语句都已经编译好了,速度比sql更快. 存储过程与mysql相当于shell和linux系统。如果你是程序员的话,那我告诉你存储过程实际上是一个方法,你只要调用这个方法,并且输入它设置好的参数就可以获取或者执行你想要的操作了. 看了如下存储过程实例,你会发现mysql存储过程和shell很像.
下面存储过程内容为:调用存储过程,并且传入用户名,密码参数。存储过程会将这她们存储到process_test表里面.看实例

一,创建数据库

mysql>create database db_proc;

二,创建表

mysql>CREATE TABLE `proc_test` (
 `id` tinyint(4) NOT NULL AUTO_INCREMENT, #ID,自动增长
 `username` varchar(20) NOT NULL, #用户名
 `password` varchar(20) NOT NULL, #密码
 PRIMARY KEY (`id`) #主键
 ) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8; #设置表引擎和字符集

三、创建存储过程

create procedure mytest(in name varchar(20),in pwd varchar(20))#定义传入的参数
 begin
 insert into proc_test(username,password) values(name,pwd);
#把传进来的参数name和pwd插入表中,别忘记分号
 end; #注意这个分号别忘记了

create procedure mytest(in name varchar(20),in pwd varchar(20))#定义传入的参数
 begin
 insert into proc_test(username,password) values(name,pwd);
#把传进来的参数name和pwd插入表中,别忘记分号
 end; #注意这个分号别忘记了

四、测试调用存储过程
用法:call 存储过程名称(传入的参数)
call proc_test(\"绝心是凉白开\",\"www.phpstudy.net\")
username为”绝心是凉白开“传入数据库中,密码”www.phpstudy.net“

五、查看数据库中有无加入的数据

select * from proc_test where username=‘绝心是凉白开\';#如果有内容说明成功了

六、删除存储过程

drop procdure 存储过程名;

七、通用分页存储过程代码及调用

DROP PROCEDURE IF EXISTS pr_pager; 
CREATE PROCEDURE pr_pager( 
  IN   p_table_name    VARCHAR(1024),    /*表名*/ 
  IN   p_fields      VARCHAR(1024),    /*查询字段*/ 
  IN   p_page_size     INT,         /*每页记录数*/ 
  IN   p_page_now     INT,         /*当前页*/ 
  IN   p_order_string   VARCHAR(128),     /*排序条件(包含ORDER关键字,可为空)*/  
  IN   p_where_string   VARCHAR(1024),    /*WHERE条件(包含WHERE关键字,可为空)*/   
  OUT  p_out_rows     INT          /*输出记录总数*/   
) 
NOT DETERMINISTIC 
SQL SECURITY DEFINER 
COMMENT \'分页存储过程\' 
   
BEGIN 
 
  /*定义变量*/ 
  DECLARE m_begin_row INT DEFAULT 0; 
  DECLARE m_limit_string CHAR(64); 
 
  /*构造语句*/   
  SET m_begin_row = (p_page_now - 1) * p_page_size; 
  SET m_limit_string = CONCAT(\' LIMIT \', m_begin_row, \', \', p_page_size); 
   
  SET @COUNT_STRING = CONCAT(\'SELECT COUNT(*) INTO @ROWS_TOTAL FROM \', p_table_name, \' \', p_where_string); 
  SET @MAIN_STRING = CONCAT(\'SELECT \', p_fields, \' FROM \', p_table_name, \' \', p_where_string, \' \', p_order_string, m_limit_string); 
 
  /*预处理*/ 
  PREPARE count_stmt FROM @COUNT_STRING; 
  EXECUTE count_stmt; 
  DEALLOCATE PREPARE count_stmt; 
  SET p_out_rows = @ROWS_TOTAL; 
 
  PREPARE main_stmt FROM @MAIN_STRING; 
  EXECUTE main_stmt; 
  DEALLOCATE PREPARE main_stmt; 
   
END; 

1.取记录调用:

call pr_pager(\'表名\', \'*\', 25, 1, \'\', \'\', @count_rows); 
call pr_pager(\'user\', \'*\', 15, 2, \'\', \'where id>3\', @count_rows); 
call pr_pager(\'user\', \'*\', 15, 1, \'group by password order by id desc\', \'\', @count_rows); 

2.调用1后再取条数调用:

select @count_rows;  
select @MAIN_STRING //select sql 
select @COUNT_STRING //seelct count sql 

支持多表级联 ,分组 :

复制代码 代码如下:

call pr_pager(\'job j left join enter_job ej on j.job_no=ej.job_no\',\'j.*,ej.*\',\'25\',\'1\',\'group by ej.put_away_user order by ej.put_away_user desc\',\'where j.job_table=\"enter\"\',@p_out_rows);

本文地址:https://www.stayed.cn/item/20974

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。