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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章