sql >> Database >  >> RDS >> Mysql

Voorbereide uitspraken gebruiken met cursor

Enkele regels:

  1. Alle declaraties moeten op één plaats in een reeks staan.
  2. U kunt geen variabelenamen gebruiken in cursor declaraties .
  3. Handler-declaraties moeten na cursor-declaraties staan.
  4. U kunt geen lokale variabelenamen gebruiken (id ) als gebonden parameters voor voorbereide instructies. Je kunt alleen session . gebruiken variabelen (zeg @_id ).

Om dergelijke problemen op te lossen, kunt u de volgende oplossing gebruiken.

  1. Definieer een tijdelijke tabel met behulp van de invoerparameter voor de SP.
  2. Declareer nu de cursor in dezelfde tabel en gebruik deze.
  3. Laat de aangemaakte tijdelijke tabel vallen.

Het volgende voorbeeld zou op uw tabellen moeten werken.

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 ;

Roep nu de procedure aan met table_id waarde.

call test2( 'Test' );



  1. Mysql maand - jaar vergelijking

  2. Hoe duur zijn JOIN's in SQL? En/of, wat is de afweging tussen prestaties en normalisatie?

  3. MySQL-kill-proces is dat de gebruiker niet genoeg punten heeft PHP

  4. 5 voordelen van proactieve monitoring van databaseprestaties