Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vorbereitete Anweisungen mit dem Cursor verwenden

Einige Regeln:

  1. Alle Deklarationen müssen an einer Stelle in einer Sequenz stehen.
  2. Sie können keine Variablennamen in Cursor-Deklarationen verwenden .
  3. Handler-Deklarationen müssen nach Cursor-Deklarationen stehen.
  4. Sie können keine lokalen Variablennamen verwenden (id ) als gebundene Parameter für vorbereitete Anweisungen. Sie können nur session verwenden Variablen (zB @_id ).

Um solche Probleme zu überwinden, können Sie die folgende Lösung übernehmen.

  1. Definieren Sie eine temporäre Tabelle mit dem Eingabeparameter für den SP.
  2. Deklarieren Sie jetzt den Cursor auf derselben Tabelle und verwenden Sie ihn.
  3. Löschen Sie die erstellte temporäre Tabelle.

Das folgende Beispiel sollte auf Ihren Tabellen funktionieren.

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 ;

Rufen Sie nun die Prozedur mit table_id auf Wert.

call test2( 'Test' );