sql >> Databasteknik >  >> RDS >> Mysql

Använda förberedda uttalanden med markören

Några regler:

  1. Alla deklarationer måste finnas på ett ställe i en sekvens.
  2. Du kan inte använda variabelnamn i markör-deklarationer .
  3. Hanterande deklarationer måste ligga efter markördeklarationer.
  4. Du kan inte använda lokala variabelnamn (id ) som bundna parametrar för förberedda uttalanden. Du kan bara använda session variabler (säg @_id ).

För att övervinna sådana problem kan du använda följande lösning.

  1. Definiera en temporär tabell med ingångsparametern till SP.
  2. Sätt nu markören på samma tabell och använd den.
  3. Släpp den tillfälliga tabellen som skapats.

Följande exempel bör fungera på dina tabeller.

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 ;

Anropa nu proceduren med table_id värde.

call test2( 'Test' );



  1. Sammankopplingsproblem

  2. Hur söker man i en enum i lista med strängar med postgresql-fråga?

  3. Byta från MySQL till PostgreSQL - tips, tricks och gotchas?

  4. Hur man applicerar att ha klausul med Group by i Select Query - SQL Server / TSQL Tutorial Del 131