sql >> Base de Datos >  >> RDS >> Mysql

Uso de declaraciones preparadas con cursor

Algunas reglas:

  1. Todas las declaraciones deben estar en un lugar en una secuencia.
  2. No puede usar nombres de variables en las declaraciones del cursor .
  3. Las declaraciones de controlador deben estar después de las declaraciones de cursor.
  4. No puede usar nombres de variables locales (id ) como parámetros enlazados para sentencias preparadas. Solo puedes usar session variables (diga @_id ).

Para superar tales problemas, puede adoptar la siguiente solución.

  1. Defina una tabla temporal usando el parámetro de entrada al SP.
  2. Ahora declara el cursor en la misma tabla y úsalo.
  3. Elimine la tabla temporal creada.

El siguiente ejemplo debería funcionar en sus tablas.

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 ;

Ahora llame al procedimiento con table_id valor.

call test2( 'Test' );