1

저는 여러 테이블에서 많은 데이터를 검토하고 분석하는 저장 함수가 있습니다. 대부분의 테이블은 정적이지만 커서를 데이터 위에 반복하도록 선언 할 수 있습니다. 미리 알려지지 않은 테이블, 특히 언어 집합 테이블 (예 : language_en, 등)이 있습니다. 즉, 저장된 함수가 쓰여졌을 때, 나는이 테이블 중 어느 테이블이 존재하는지 알지 못한다.저장 프로 시저 내에서 준비된 문의 쿼리 결과를 반복하십시오.

저장된 함수 자체에서, 나는이 작업을 수행 할 수 있습니다

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;