Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Korzystanie z przygotowanych wyciągów z kursorem

Niektóre zasady:

  1. Wszystkie deklaracje muszą znajdować się w jednym miejscu w sekwencji.
  2. Nie możesz używać nazw zmiennych w deklaracjach kursora .
  3. Deklaracje obsługi muszą znajdować się po deklaracjach kursora.
  4. Nie możesz używać nazw zmiennych lokalnych (id ) jako parametry powiązane dla przygotowanych instrukcji. Możesz używać tylko session zmienne (powiedz @_id ).

Aby przezwyciężyć takie problemy, możesz zastosować następujące rozwiązanie.

  1. Zdefiniuj tabelę tymczasową za pomocą parametru wejściowego do SP.
  2. Teraz zadeklaruj kursor w tej samej tabeli i użyj go.
  3. Upuść utworzoną tabelę tymczasową.

Poniższy przykład powinien zadziałać na twoich stołach.

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 ;

Teraz wywołaj procedurę z table_id wartość.

call test2( 'Test' );



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. W jaki sposób podgrupy mogą mieć wygenerowaną kolumnę przyrostu dodaną w zapytaniu sql?

  2. MySQL porządkuje zakres dat od początku, a resztę porządkuje według innych kryteriów

  3. Dlaczego warto korzystać z frameworków? Przekonaj mnie, że powinienem wymyślić Zend Framework i go używać

  4. Otrzymuję NotImplementedError, gdy próbuję zrobić przygotowaną instrukcję za pomocą złącza mysql python

  5. Dostosowanie do domyślnego ustawienia strefy czasowej w RDS