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

Brug af forberedte udsagn med markør

Nogle regler:

  1. Alle erklæringer skal være ét sted i en rækkefølge.
  2. Du kan ikke bruge variabelnavne i markør erklæringer .
  3. Behandlererklæringer skal stå efter markørerklæringer.
  4. Du kan ikke bruge lokale variabelnavne (id ) som bundne parametre for forberedte udsagn. Du kan kun bruge session variabler (f.eks. @_id ).

For at overvinde sådanne problemer kan du vedtage følgende løsning.

  1. Definer en midlertidig tabel ved hjælp af inputparameteren til SP.
  2. Deklarer nu markøren på den samme tabel og brug den.
  3. Slip den oprettede midlertidige tabel.

Følgende eksempel burde fungere på dine borde.

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 ;

Kald nu proceduren med table_id værdi.

call test2( 'Test' );



  1. Java Date Hibernate afskæringstidspunkt

  2. Mysql 1050-fejltabel eksisterer allerede, mens den faktisk ikke gør det

  3. Serveren sendte tegnsæt (255) ukendt for klienten, men tegnsættene matcher

  4. Sådan rettes fejl:MySQL lukning uventet på Xampp på grund af plugin 'Aria'