本事菜鸟一枚,感谢张大佬的不放弃,这里把之前写的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;