현재 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 매번
네, @droptable을 확인했는데 올바른 l_table_name을 가지고 있지 않습니다. 단지 l_table_name 변수 자체를 출력하면 정확합니다. –
DEALLOCATE없이 시도 했습니까? 그 결과는 무엇입니까? 적절한 stmt1을 얻으려면 먼저 stmt2를 올바르게 생성해야하기 때문에 모든 DEALLOCATE를 제거하십시오. 그래서 모든 DEALLOCATE를 제거하고 시도하십시오. – Pradeeshnarayan