sql >> Database teknologi >  >> RDS >> Mysql

Oprettelse af markør med Dynamic SQL i MySQL

Det er ikke tilladt en DEFINE cur CURSOR FOR preparert_sætning, du skal definere en gyldig SQL-sætning. Den gode nyhed er, at du kan definere markøren på en visning, der dynamisk kan oprettes senere. For eksempel...

DROP PROCEDURE IF EXISTS my_dynamic_proc;
DELIMITER //
CREATE PROCEDURE my_dynamic_proc(tablename varchar(64), fieldname varchar(64), country VARCHAR(64))
BEGIN
    DECLARE adr_value varchar(500);
    DECLARE done BOOLEAN DEFAULT FALSE;
    -- Cursor definition
    DECLARE cur1 CURSOR FOR SELECT address FROM tmp_view_address;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    -- Dynamic view definition and creation
    SET @v = concat('CREATE OR REPLACE VIEW tmp_view_address as SELECT `',fieldname,'` as address FROM ',tablename,' WHERE country_name = "',country,'" group by 1 order by count(1) desc');
    PREPARE stm FROM @v;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
    -- Open cursor
    OPEN cur1;
    read_loop: LOOP
      FETCH cur1 INTO adr_value;
      IF done THEN
        LEAVE read_loop;
      END IF;
      -- Basic output result
      SELECT concat("My address is ",adr_value);
      -- Use every result in a dynamic update
      SET @u = concat('update ',tablename,' set new_field_address = "',adr_value,'" where country_name = "',country,'" and new_field_address is null');
      PREPARE stm FROM @u;
      EXECUTE stm;
      DEALLOCATE PREPARE stm;
  END LOOP;
  CLOSE cur1;
END//
DELIMITER ;


  1. MySQL VARCHAR(255) UTF8 er for lang til nøgle, men maks. længde er 1000 bytes

  2. Mysql fejl 1452 - Kan ikke tilføje eller opdatere en underordnet række:en fremmednøgle begrænsning mislykkes

  3. Hvordan skifter man databaser i psql?

  4. Påvirker rækkefølgen af ​​felter i en WHERE-sætning ydeevne i MySQL?