mysql> create table payment(staff_id int not null ,
    ->                  amount int not null);                        //建表
Query OK, 0 rows affected (1.68 sec)
mysql> INSERT INTO PAYMENT VALUES(1,213);                             //插值
Query OK, 1 row affected (0.08 sec)mysql> INSERT INTO PAYMENT VALUES(2,213.2312);
Query OK, 1 row affected (0.03 sec)mysql> INSERT INTO PAYMENT VALUES(3,12);
Query OK, 1 row affected (0.06 sec)mysql> INSERT INTO PAYMENT VALUES(4,11);
Query OK, 1 row affected (0.03 sec)mysql> INSERT INTO PAYMENT VALUES(5,21);
Query OK, 1 row affected (0.03 sec)mysql> INSERT INTO PAYMENT VALUES(6,31);
Query OK, 1 row affected (0.03 sec)mysql> DELIMITER !!                                            //建立过程PAYMENT_STAT
mysql> 
mysql>                                               //使不同的staff_id值的amount累加mysql> CREATE PROCEDURE PAYMENT_STAT()
    -> BEGIN
    ->  DECLARE I_STAFF_ID INT;
    ->  DECLARE D_AMOUNT DECIMAL(5,2);
    -> DECLARE CUR_PAYMENT CURSOR FOR SELECT STAFF_ID,AMOUNT FROM PAYMEN
    ->  DECLARE EXIT HANDLER FOR NOT FOUND CLOSE CUR_PAYMENT;
    ->
    -> SET @X1=0;
    -> SET @X2=0;
    ->
    -> OPEN CUR_PAYMENT ;
    ->
    -> OPEN CUR_PAYMENT ;
    ->
    -> REPEAT
    ->  FETCH CUR_PAYMENT INTO I_STAFF_ID ,D_AMOUNT ;
    ->          IF I_STAFF_ID =2 THEN
    ->          SET @X1=@X1+D_AMOUNT ;
    ->          ELSE
    ->          SET @X2=@X2+D_AMOUNT ;
    ->          END IF;
    -> UNTIL 0 END REPEAT ;
    -> CLOSE CUR_PAYMENT ;
    ->
    -> END;
    -> !!
Query OK, 0 rows affected (0.42 sec)
mysql> DELIMITER ;
mysql> CALL PAYMENT_STAT();
ERROR 1325 (24000): Cursor is already open     、//为什么会这样呢mysql> SELECT @X1,@X2;                                               也没有结果输出+------+------+
| @X1  | @X2  |
+------+------+
|    0 |    0 |
+------+------+
1 row in set (0.08 sec)

解决方案 »

  1.   

    RROR 1325 (24000): Cursor is already open 、//为什么会这样呢
    翻译成中文,游标已经打开
    -> OPEN CUR_PAYMENT ;
      ->
      -> OPEN CUR_PAYMENT ;你不是打开了两次?
      

  2.   

    另外你的repeat循环最多执行一次就会终止。
    ->  BEGIN
      -> declare  done  default 1;
        DECLARE I_STAFF_ID INT;
      -> DECLARE D_AMOUNT DECIMAL(5,2);
      -> DECLARE CUR_PAYMENT CURSOR FOR SELECT STAFF_ID,AMOUNT FROM PAYMEN
      -> DECLARE EXIT HANDLER FOR NOT FOUND set done =0;
      ->
      -> SET @X1=0;
      -> SET @X2=0;
      ->
      -> OPEN CUR_PAYMENT ;
      ->
      -> OPEN CUR_PAYMENT ;
      ->
      -> REPEAT
      -> FETCH CUR_PAYMENT INTO I_STAFF_ID ,D_AMOUNT ;
      -> IF I_STAFF_ID =2 THEN
      -> SET @X1=@X1+D_AMOUNT ;
      -> ELSE
      -> SET @X2=@X2+D_AMOUNT ;
      -> END IF;
      -> UNTIL done END REPEAT ;
      -> CLOSE CUR_PAYMENT ;
      ->
      -> END;
      -> !!感觉这样比较好点,你以前的那个第一次循环后到until,直接给0不久跳出了