2012-11-28 4 views
2

트리거 내에서 준비된 문이 허용되지 않는다는 것을 알고 있지만 내가 원하는 것을 어떻게 할 수 있는지 알 수 없으므로 모든 대안/해결 방법을 크게 높이 평가할 수 있습니다.트리거 대안 내의 동적 SQL

DELIMITER $$ 

CREATE TRIGGER trigger1 after INSERT on table1 
FOR EACH ROW 
begin 
DECLARE a varchar(30); 
DECLARE b varchar(30); 
DECLARE c varchar(30); 
DECLARE d varchar(30); 
SET a = new.Col1; 
SET b = new.Col2; 
SET c = (select Col4 from table2 where Col3=new.Col3); 
SET d = concat('select ',a,' from table3 where yq=',c,' and xz=',b); 
insert into table4 values (d); 
end 
$$ 

DELIMITER; 

그래서 무슨 일이 일어나고 있는지 : 행이 삽입되고 3 개 값은 해당 행, Col1, Col2new.Col3에서 가져옵니다. new.Col3은 다른 테이블에서 행을 가져 오는 데 사용되며 그 다음 Col2과 함께 사용되어 원하는 값이있는 세 번째 테이블을 검색합니다. Col1은 동적으로 생성 된 d의 열 이름으로되어 있기 때문에 문제가되지만 이것이 작동하지 않습니다. 분명히 지금 내가 돌아오고있는 순간은 d에있는 select 명령문의 문자열입니다.하지만 이것은 허용되지 않기 때문에 명령문을 실행할 수 없습니다. 그래서 동적으로 생성 된 열 이름을 select 문으로 가져올 수 있습니까?

표 1

Col1 | Col2 | Col3 
c | d | x 
a | e | y 
b | e | z 
b | f | x 

표 2

Col3 | Col4 
x | 1 
y | 2 
z | 3 

표 3

a | b | c | xz | yq 
1a | 1b | 1c | d | 1 
2a | 2b | 2c | d | 2 
3a | 3b | 3c | d | 3 
4a | 4b | 4c | e | 1 
5a | 5b | 5c | e | 2 
6a | 6b | 6c | e | 3 
7a | 7b | 7c | f | 1 
8a | 8b | 8c | f | 2 
9a | 9b | 9c | f | 3 

I 원하는 결과는도 1a 내지도 9c.

트리거의 열 이름을 수정할 수 있도록 테이블 스키마를 변경하는 것이 고려되었지만 다른 코드 비트에 문제가 발생할 수 있으므로 최후의 수단이됩니다.

답변

2

당신은 모두 준비된 문 및 동적 SQL의 아이디어를 포기해야하고 단지 고통스럽게 일부 IF..THEN 문을 다하겠습니다은 :

DELIMITER $$ 

CREATE TRIGGER trigger1 after INSERT on table1 
FOR EACH ROW 
begin 
DECLARE a varchar(30); 
DECLARE b varchar(30); 
DECLARE local_c varchar(30); 
DECLARE d varchar(30); 
SET a = new.Col1; 
SET b = new.Col2; 
SET local_c = (select Col4 from table2 where Col3=new.Col3); 
IF local_c = 'a' THEN 
    select a into d from table3 where yq=local_c and xz=b; 
END IF; 
IF local_c = 'b' THEN 
    select b into d from table3 where yq=local_c and xz=b; 
END IF; 
IF local_c = 'c' THEN 
    select c into d from table3 where yq=local_c and xz=b; 
END IF; 
IF ISNULL(d) = 0 THEN 
    insert into table4 values (d); 
END IF; 
end 
$$ 

DELIMITER; 
+0

좋은 생각인데, 그 일에 상당히 의지해야했지만, 그런 식으로 생각하지 않았습니다. – mrmryb

+0

이것은 추악하고, 장황하고 잠재적으로 유지 관리 작업이 많이 걸리지 만 실제로 MySQL의 한계에 비추어이를 수행하는 유일한 방법입니다. –

0

은 다음과 같이 준비된 문을 사용하십시오 :

PREPARE myStmt FROM 
'concat(insert into table4 values (', 
      'select ', 
      a, 
      ' from table3 where yq=', 
      c, 
      ' and xz=', 
      b, 
      '))'; 
EXECUTE myStmt; 
+1

동적 SQL이 외설 ' 방아쇠를 당할 때까지 허용되는 문제입니다. 그 문제를 해결할 방법이 필요합니다. – mrmryb