2012-08-02 3 views
0

현재 DB의 userNames 목록을 반복하고 있습니다. 다음과 같이 :MYSQL 준비 문을 작성하고 하나의 저장 프로 시저에서 재설정하는 방법

DECLARE 
    cur1 CURSOR FOR 
     select user_name 
      from users 
      where user_type = 'SP' 
      and active = 'Y'; 

OPEN cur1; 

read_loop : LOOP 
FETCH cur1 INTO userName; 

이제 각 userName에 대해 데이터가있는 테이블을 생성합니다. 내가 가진 더 내가 원하는 내가 각 사용자에 대해 생성 테이블에 삽입 된 데이터를 구축 PREPARE 문

set l_table_name = concat("tmp_rec_",userName); 

    set l_select_cnt = concat("SELECT count(1) into @l_cnt 
           from information_schema.tables 
           where table_schema = 'greptlat_db' 
           and table_name = '", l_table_name, "'"); 
    PREPARE stmt2 FROM @l_select_cnt; 
    EXECUTE stmt2; 
    DEALLOCATE PREPARE stmt2; 

    if l_cnt > 0 then 
     set droptable = concat("drop table ", l_table_name); 

     PREPARE stmt1 FROM @droptable; 
     EXECUTE stmt1; 
     DEALLOCATE PREPARE stmt1; 
    END IF; 

: 물론, 위의 LOOP 내, 내가 가진 여러 같은 문을 준비합니다.

이제는 LOOP에 있기 때문에 각 사용자마다 PREPARE 문이 전역이라는 것을 읽었습니다. 즉, 위의 코드 "PREPARE stmt1 FROM @droptable"은 stmt1이 각 사용자에 대해 LOOP를 통해 지정 되어도 변경되지 않는다는 것을 의미합니다. 내가 그것을 할당하더라도, 그것은 여전히 ​​그 저장 프로 시저에 남아 있습니다.

루프가 다시 시작될 때마다 어떻게이 stmt1, stmt2, stmt3 ... 등을 재설정 할 수 있습니까?

기본적으로 l_table_name는 LOOP가 통과 때마다 변경됩니다,하지만 stmt1 나던 변경 .. 나는 그것이 일반적으로 새로운 l_table_name 매번

답변

0

를 사용하는 명령문이 새로운 문 앞에 암시 적으로 할당이 해제 준비되도록 변경 stmt1 필요 준비되어 있습니다. DEALLOCATE PREPARE stmt1;을 제거하면 결과가 어떻게됩니까? 각 루프에서 '@droptable'값을 확인 했습니까?

+0

네, @droptable을 확인했는데 올바른 l_table_name을 가지고 있지 않습니다. 단지 l_table_name 변수 자체를 출력하면 정확합니다. –

+0

DEALLOCATE없이 시도 했습니까? 그 결과는 무엇입니까? 적절한 stmt1을 얻으려면 먼저 stmt2를 올바르게 생성해야하기 때문에 모든 DEALLOCATE를 제거하십시오. 그래서 모든 DEALLOCATE를 제거하고 시도하십시오. – Pradeeshnarayan

관련 문제