Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySql Cursor - Creating a procedure

i'm trying to create a cursor for the first time. I have looked at the documentation, i understand the concept, but i can't seem to get it to even be declared...

I'm using:

  • MySql 5.1.41
  • SqlYog as a manager
  • (running locally on a xampp instalation)

Even when copy pasting the example found in http://dev.mysql.com/doc/refman/5.1/en/cursors.html

    CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  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 = 1;

  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;

I get errors right away: Error Code : 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

and a bunch of others following,

this doesn't make any sense to me, can any kind soul help me please?

Thank you

So i got the sample query to work (thanks to ajreal), with resetting the DELIMITER. But when i run my query:

DELIMITER##
CREATE PROCEDURE RetiraPoints()
BEGIN
    DECLARE userid BIGINT;  
    DECLARE done INT DEFAULT 0;
    DECLARE cur CURSOR FOR SELECT uid FROM viewpoints;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    read_loop: LOOP 
    FETCH cur INTO userid;
        IF done THEN
            LEAVE read_loop;
        END IF;
        INSERT INTO points (iduser, points, pointcat) VALUES (uid, -1, 1), (userid, -1, 2), (userid, -1, 3), (userid, -1, 4), (userid, -1, 5), (userid, -1, 6);
    END LOOP;
    CLOSE cur;
END;##

i get: Error Code : 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE done INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT uid FROM viewpoints; ' at line 1

my god, this is hard...

like image 683
André Alçada Padez Avatar asked Jan 06 '11 13:01

André Alçada Padez


People also ask

Can we use cursor in MySQL stored procedure?

MySQL supports cursors inside stored programs. The syntax is as in embedded SQL. Cursors have these properties: Asensitive: The server may or may not make a copy of its result table.

How do I create a procedure in MySQL?

Create a simple stored procedure. DELIMITER ; To create the MySQL Stored Procedure, open the MySQL workbench Connect to the MySQL Database copy-paste the code in the query editor window click on Execute. You can view the procedure under stored procedures.

What should I declare in MySQL cursor?

Using the DECLARE statement you can declare a cursor and associate It with the SELECT statement which fetches the desired records from a table. This SELECT statement associated with a cursor does not allow INTO clause. Once you declare a cursor you can retrieve records from it using the FETCH statement.


1 Answers

You forget to reset the delimiter to NOT ;

delimiter ##
...
end##

need to put a space right after delimiter

And the ending END does not require ;

like image 119
ajreal Avatar answered Oct 13 '22 16:10

ajreal