本事菜鳥一枚,感謝張大佬的不放棄,這裏把之前寫的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;