1

私はストアドファンクションを持っています。そのジョブは、いくつかのテーブルから多くのデータを分析して分析するものです。ほとんどのテーブルは静的であり、データをループするようにカーソルを宣言できますが、あらかじめわかっていないテーブル、具体的には言語セットテーブル(language_enlanguage_frなど)があります。関数が書かれているが、私はこれらのテーブルのどれが存在するのか分からない。保存された関数自体でストアドプロシージャ内で準備されたステートメントクエリの結果をループする

、私はこれを行うことができます。

declare cLang cursor for 
    SELECT table_name FROM information_schema.tables 
    WHERE table_schema=database() and table_name like 'language_%'; 

declare continue handler for not found set exit_loop = true; 

open cLang; 
set exit_loop = false; 
cLang_loop: loop 
    fetch cLang into str; 

    ... 
end loop; 

この方法で、私は、データベースに存在するすべての言語テーブルをループすることができます。それから、私はそれぞれのデータを取得し、分析を繰り返します。明らかに、どのテーブルがあるのか​​わからないので、それぞれのカーソルを宣言することはできません。しかし、私は準備された文を使用することができます:

fetch cLang into tableName; 

set @stmt_text = concat("SELECT t_code, t_string FROM ", str); 
prepare stmt from @stmt_text; 
execute stmt using @scId; 

しかし、今私はどのようにこのクエリの結果をループするのですか?

+0

オプションは、[MariaDB/MySQLの:動的SQLのためのカーソル]を参照してください、動的カーソルことができます(https://falseisnotnull.wordpress.com/2013/01/08/mariadbmysql-cursors- for-dynamic-sql /)を使用します。 – wchiquito

答えて

0

私がやったやり方はこれです。動的カーソルを作成してテーブルを照会するのではなく、定義済みのテンポラリテーブルがあり、そのテーブルにカーソルを宣言します。次に、動的SQLは一時表に挿入され、通常のカーソルがその上を反復します。このような何か:

declare cLang cursor for 
    SELECT table_name FROM information_schema.tables WHERE table_schema=database() and table_name like 'language_%'; 

declare cCode cursor for 
    SELECT t_code, t_string FROM tmp_lang; 

declare continue handler for not found set exit_loop = true; 

open cLang; 
set exit_loop = false; 

cLang_loop: loop 
    fetch cLang into str; 
    if exit_loop then 
     close cLang; 
     leave cLang_loop; 
    else 
     create temporary table tmp_lang (t_code varchar(50), t_string varchar(2000)); 

     set @stmt_text = concat(
      'insert into tmp_lang (t_code, t_string) SELECT t_code, t_string 
      from ', str); 
     prepare stmt from @stmt_text; 
     execute stmt; 

     if (select count(1) from tmp_lang) > 0 then 

      open cCode; 

      cCode_loop: loop 
       fetch cCode into lCode, lString; 
       if exit_loop then 
        close cCode; 
        set exit_loop = false; 
        leave cCode_loop; 
       else 
        -- now I can do whatever I need with the data 
       end if; 
      end loop; 

     end if; 

     deallocate prepare stmt; 
     drop table tmp_lang; 
    end if; 
end loop; 
関連する問題