一、变量
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