mysql存储过程

本事菜鸟一枚,感谢张大佬的不放弃,这里把之前写的mysql存储过程的代码搞过来,做个小笔记,不能浪费张大佬的苦心

此过程是查询所有新闻表的信息(表结构相同) ,做搜索结果页 包含分页

model:

 /**
     * 分页获取搜索信息
     */
    public function getSearchListByTab($title,$offsets,$rows){
        $stmt = Yii::$app->db->createCommand
        ('call  search_title_bytab(:title,:offsets,:rows)');
        $stmt ->bindValue(":title",$title);
        $stmt ->bindValue(":offsets",$offsets);
        $stmt ->bindValue(":rows",$rows);
        $result = $stmt ->queryAll();
        return $result;
    }

存储过程:

BEGIN

	-- DROP TABLE IF EXISTS `newsTanle`;
	CREATE TEMPORARY TABLE if not exists tmp_table (
	`news_id` int(11) NOT NULL ,
  `news_title` varchar(100) NOT NULL,
  `subtitle` varchar(100) NOT NULL,
  `summary` varchar(200) NOT NULL ,
  `news_content` text NOT NULL,
  `industry_id` int(11) NOT NULL DEFAULT '0',
  `reprint_address` varchar(100) NOT NULL DEFAULT '' ,
  `source` varchar(100) NOT NULL DEFAULT '' ,
  `news_type` int(4) NOT NULL DEFAULT '0',
  `img_address` varchar(100) DEFAULT '',
  `img_min` varchar(100) DEFAULT '' ,
  `create_time` int(11) NOT NULL DEFAULT '0',
  `update_time` int(11) NOT NULL DEFAULT '0' ,
  `creator_id` int(11) NOT NULL DEFAULT '0' ,
  `reviewer_id` int(11) NOT NULL DEFAULT '0',
  `approval_status` tinyint(4) NOT NULL DEFAULT '0' ,
  `is_del` tinyint(4) NOT NULL DEFAULT '0',
  `remark` varchar(100) DEFAULT '' ,
  `type_id` int(11) NOT NULL DEFAULT '0' ,
  `news_nature` tinyint(4) NOT NULL DEFAULT '0',
  `release_source` tinyint(4) NOT NULL DEFAULT '0',
  `pv` int NOT NULL DEFAULT '0'
	);  

	CREATE TEMPORARY TABLE if not exists tmp_count_table (
	`counts` int(11) NOT NULL  DEFAULT '0'
	);  


	SET @tableStr ="gold,stock,silver,futures,energy,bank,forex,collection,spot,policy,jewelry,luxury,exposure,blockchain";
	SET @countTable = LENGTH(@tableStr) - LENGTH(REPLACE(@tableStr, ',', '')) + 1;
	-- SELECT @countTable ;

	SET @WhereStr = CONCAT(" \'%",title, "%\' "," ORDER BY create_time DESC;");

	SET @SQLStr = " SELECT * FROM ";  -- gold WHERE is_del = 0 AND approval_status = 1 AND news_title LIKE

	SET @CSQL= "";
	SET @i=1;
	WHILE @i <= @countTable DO

	SET @CSQL = CONCAT("INSERT INTO tmp_table ",@SQLStr,CONCAT("news_",substring_index(substring_index(@tableStr,',', @i), ',', -1))," WHERE is_del = 0 AND approval_status = 1 AND news_title LIKE",@WhereStr);

	PREPARE stmt FROM @CSQL;
	EXECUTE stmt;  
	DEALLOCATE PREPARE stmt;

	SET @i = @i+1;
	END WHILE;

  INSERT INTO tmp_count_table SELECT count(*) FROM tmp_table ;

	-- SELECT *FROM tmp_table ;
IF(rows>0) THEN
	SELECT *FROM tmp_table LEFT JOIN tmp_count_table on true limit offsets,rows;
ELSE
	SELECT *FROM tmp_table LEFT JOIN tmp_count_table on true;
END IF;
	-- SELECT *FROM tmp_count_table;

	DROP TABLE tmp_table;
	DROP TABLE tmp_count_table;


END

语法:

DELIMITER // 声明语句结束符,用于区分; 
CEATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程 
BEGIN …. END 存储过程开始和结束符号 
SET @p_in=1 变量赋值 
DECLARE l_int int unsigned default 4000000; 变量定义

命令行下案例:

mysql> DELIMITER // 
mysql> CREATE PROCEDURE proc1(OUT s int) 
   -> BEGIN
   -> SELECT COUNT(*) INTO s FROM user; 
   -> END
   -> // 
mysql> DELIMITER ;

注: 
(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔 符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当 前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。 
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用”,”分割开。 
(3)过程体的开始与结束使用BEGIN与END进行标识。 

参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如: 
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形…]) 
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值 
OUT 输出参数:该值可在存储过程内部被改变,并可返回 
INOUT 输入输出参数:调用时指定,并且可被改变和返回

create procedure procedure2(

out p1 decimal(8,2),

out p2 decimal(8,2),

in p3 int

)

begin
select sum(uid) into p1 from user where order_name = p3;
select avg(uid) into p2 from user ;
end ;

从上面sql语句可以看出,p1和p2是用来检索并且传出去的值,而p3则是必须有调用这传入的具体值。

看具体调用过程:

call product();    //无参

call procedure2(@userSum,@userAvg,201708);    //有参

实例:


create procedure ordertotal(
in onumber int,
in taxable boolean,
out ototal decimal(8,2)
) commit 'Obtain order total, optionally adding tax' 
begin
	-- Declare variable for total
	declare total decimal(8,2);
	-- Declare tax percentage
	declare taxrate int default 6;
	
	--Get the order total
	select Sum(item_price*quantity)
	from orderitems
	where order_num = onumber
	into total;
	
	--Is this taxable?
	if taxable then
		--Yes, so add taxrate to the total
		select total+(total/100*taxrate) into total;
	end if;
	
	--Add finally, save to out variable
	select total into ototal;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值