Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tworzenie kursora za pomocą Dynamic SQL w MySQL

Nie jest dozwolone DEFINE cur CURSOR FOR ready_statement, musisz zdefiniować poprawną instrukcję SQL. Dobrą wiadomością jest to, że możesz zdefiniować kursor na widoku, który można później dynamicznie utworzyć. Na przykład...

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instrukcja SQL ignoruje parametr gdzie

  2. GeoDjango i MySQL:punkty nie mogą być NULL, jakiej innej pustej wartości powinienem użyć?

  3. Jak działają PEŁNOTEKSTOWE INDEKSY w wielu kolumnach?

  4. Uzyskaj dostęp do MySQL MAMP z terminala

  5. Tajemnica MySQL:wartość null nie różni się od łańcucha innego niż null