sql >> Databáze >  >> RDS >> Mysql

Použití připravených příkazů s kurzorem

Některá pravidla:

  1. Všechna deklarace musí být na jednom místě v sekvenci.
  2. V deklaracích kurzoru nelze používat názvy proměnných .
  3. Deklarace obslužného programu musí být za deklaracemi kurzoru.
  4. Nelze použít názvy místních proměnných (id ) jako vázané parametry pro připravené příkazy. Můžete použít pouze session proměnné (řekněme @_id ).

K překonání těchto problémů můžete přijmout následující řešení.

  1. Definujte dočasnou tabulku pomocí vstupního parametru pro SP.
  2. Nyní deklarujte kurzor na stejné tabulce a použijte jej.
  3. Zrušte vytvořenou dočasnou tabulku.

Následující příklad by měl fungovat na vašich stolech.

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 ;

Nyní zavolejte proceduru pomocí table_id hodnota.

call test2( 'Test' );



  1. Zachyťte varování plánu provádění pomocí rozšířených událostí

  2. Jaký ovladač MySQL pro Node.js funguje ve Windows?

  3. Jak NOT LIKE funguje v MySQL

  4. aktivní sumace záznamů v codeigniteru