💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
cursor 游标 Cursor游标用来声明一个数据集 游标的声明必须在变量和条件声明之后,在handler声明之前 ``` CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE a CHAR(16); DECLARE b, c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur1; OPEN cur2; read_loop: LOOP FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF done THEN LEAVE read_loop; END IF; IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END LOOP; CLOSE cur1; CLOSE cur2; END; ``` 解释: - [ ] Cursor close语句用来关闭之前打开的游标,如果关闭一个未打开的游标,则MySQL会报错。如果在存储过程和函数中未使用此语句关闭已经打开的游标,则游标会在声明的begin…end语句块执行完之后自动关闭 - [ ] Cursor declare语句用来声明一个游标和指定游标对应的数据集合,通常数据集合是一个select语句 - [ ] Cursor fetch语句用来获取游标指定数据集的下一行数据并将各个字段值赋予后面的变量 - [ ] 数据集中的字段需要和INTO语句中定义的变量一一对应 - [ ] 数据集中的数据都fetch完之后,则返回NOT FOUND - [ ] Open cursor语句用来打开一个之前已经声明好的游标 - [ ] Declare condition语句命名特定的错误条件,而该特定错误可以在declare…handler中指定处理方法 - [ ] declare condition_name condition for condition_value - [ ] Condition_value指定特定的错误条件,可以有以下两种形式 - [x] Mysql_err_code表示MySQL error code的整数 - [x] SQLSTATE sqlstate_value表示MySQL中用5位字符串表达的语句状态 ``` DECLARE {EXIT | CONTINUE} HANDLER FOR {error-number | SQLSTATE error-string | condition} SQL statement ``` - [ ] Handler Type (CONTINUE,EXIT)//处理类型 继续或退出 - [ ] Handler condition (SQLSTATE,MYSQL ERROR,CONDITION)//触发条件 - [ ] Handler actions(错误触发的操作) - [ ] Handler_action子句声明当执行完statement语句之后应该怎么办 - [ ] Continue代表继续执行该存储过程或函数 - [ ] Exit代表退出声明此handler的begin…end语句块 Condition_value的值有以下几种: - [x] Mysql_err_code表示MySQL error code的整数 - [x] SQLSTATE sqlstate_value表示MySQL中用5位字符串表达的语句状态 - [x] Condition_name表示之前在declare…condition语句中声明的名字 - [x] SQLWARNING表示所有的警告信息,即SQLSTATE中01打头的所有错误 - [x] NOT FOUND表示查完或者查不到数据,即SQLSTATE中02打头的所有错误 - [x] SQLEXCEPTION表示所有的错误信息 当condition发生但没有声明handler时,则存储过程和函数依照如下规则处理 - [ ] 发生SQLEXCEPTION错误,则执行exit退出 - [ ] 发生SQLWARNING警告,则执行contine继续执行 - [ ] 发生NOT FOUND情况,则执行continue继续执行 比如SQLSTATE ‘23000’表示主键冲突错误 ``` mysql> CREATE TABLE t (s1 INT, PRIMARY KEY (s1)); Query OK, 0 rows affected (0.00 sec) mysql> delimiter // mysql> CREATE PROCEDURE handlerdemo () -> BEGIN -> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; -> SET @x = 1; -> INSERT INTO test.t VALUES (1); -> SET @x = 2; -> INSERT INTO test.t VALUES (1); -> SET @x = 3; -> END; -> // Mysql> delimiter ; mysql> CALL handlerdemo(); mysql> SELECT @x; +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec) ```