Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation d'instructions préparées avec le curseur

Quelques règles :

  1. Toutes les déclarations doivent se trouver au même endroit dans une séquence.
  2. Vous ne pouvez pas utiliser de noms de variables dans les déclarations de curseur .
  3. Les déclarations de gestionnaire doivent être après les déclarations de curseur.
  4. Vous ne pouvez pas utiliser de noms de variables locales (id ) en tant que paramètres liés pour les instructions préparées. Vous ne pouvez utiliser que session variables (par exemple @_id ).

Pour surmonter ces problèmes, vous pouvez adopter la solution suivante.

  1. Définissez une table temporaire à l'aide du paramètre d'entrée du SP.
  2. Déclarez maintenant le curseur sur la même table et utilisez-le.
  3. Supprimer la table temporaire créée.

L'exemple suivant devrait fonctionner sur vos tables.

delimiter $$

drop procedure if exists test2$$

create procedure test2( table_id varchar(25) )
begin
  set @temp_query = 'drop temporary table if exists temp_cursor_table';
  prepare pst from @temp_query;
  execute pst;
  drop prepare pst; -- or
  -- deallocate prepare pst;

  set @temp_table_query='create temporary table temp_cursor_table ';
  set @temp_table_query=concat( @temp_table_query, ' select entryId from ' );
  set @temp_table_query=concat( @temp_table_query, table_id );
  set @temp_table_query=concat( @temp_table_query, ' order by entryId' );

  prepare pst from @temp_table_query;
  execute pst;
  drop prepare pst;

  -- now write your actual cursor and update statements
  -- in a separate block
  begin
    declare done int default false;
    declare id int;
    declare id_new int;
    declare stmt1 varchar(1024);
    declare stmt2 varchar(1024);

    declare getid cursor for  
              select entryId from temp_cursor_table order by entryId;
    declare continue handler for not found set done = 1;

    set @id_new = 1; 

    open getid;
    fetch getid into id;
    repeat
      set @sqltext2 := concat( 'update ', table_id );
      set @sqltext2 := concat( @sqltext2, ' set entryId = ? where entryId = ?' );
      set @_id = id;
      prepare stmt2 from @sqltext2;
      execute stmt2 using @new_id, @_id;
      set @id_new = @id_new + 1;
      fetch getid into id;
    until done end repeat;
    close getid;
  end;
end;
$$

delimiter ;

Appelez maintenant la procédure avec table_id évaluer.

call test2( 'Test' );