資料庫學習之儲存過程及函式。
阿新 • • 發佈:2019-01-24
一、變數
1、定義:DECLARE var_name type[DEFAULT value]
例如,定義一個DATE型別的變數last_month_start:
DECLARE last_month_start DATE
2、變數的賦值:
變數可以直接賦值或者通過查詢賦值。
(1)、直接賦值使用SET,可以賦常量或者賦表示式:
SET var_name = expr
例如:
SET last_month_start = DATE_SUB(CURRENT_DATE(),INTERVAL 1 MONTH)
(2)、查詢賦值:
select col_name into var_name ...
例如:
select vc_infoid into infoid where vc_name='E·T'
二、定義條件與處理
1、條件定義;DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE[VALUE] sqlstate_value
|mysql_error_code
2、條件處理
DECLARE hander_type HANDLER FOR condition_value[...] sp_statement
hander_type:
CONTUNUE
|exit
|undo
condition_value:
SQLSTATE[VALUE] sqlstate_value
|condition_name
|SQLWARING
|NOT FOUND
|SQLEXCEPTION
|mysql_error_code
例如:
主鍵衝突(23000 error):
->BEGIN
-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
-> SET @x = 1;
-> INSERT INTO ACTOR(ACTOR_ID) VALUES (201);
-> SET @x = 2;
-> INSERT INTO ACTOR(ACTOR_ID) VALUES (1);
-> SET @x = 3;
->END;
三、例項
該例子功能:向資料庫插入資料,通過唯一索引去重。如果根據唯一索引判定該資料已經存在資料庫中,那麼,就對這條資料進行更新,反之,該條資料沒有在資料庫裡,則插入。 程式碼:
BEGIN
DECLARE v_num INT DEFAULT 0;
DECLARE id INT(10) UNSIGNED;
SET id = IF(LENGTH(TRIM(id))>0,CAST(id AS SIGNED),NULL);
INSERT INTO info_card ( #向一張名為info_card的表中的一下欄位插入資料(括號裡的欄位)
enterprise_name,company_url,contact,contact_tel,
address,main_business,pic_url,product_md5,product,
title_md5,img_title,img_product)
VALUES
(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) #將這些資料賦值給以上的欄位
on duplicate key update #如果通過唯一索引被識別為已存在的資料,那麼就做更新,更新的資料為%s
enterprise_name = %s,
company_url = %s,
contact = %s,
contact_tel = %s,
address = %s,
main_business = %s,
pic_url = %s,
product_md5 = %s,
product = %s,
title_md5 = %s,
img_title = %s,
img_product = %s
END