2

プリペアドステートメントがトリガー内で許可されていないことは理解していますが、他にどのようにやりたいことができるかわからないので、代替案/回避策をいただければ幸いです。

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;

Col1つまり、何が起こっているのでしょうか。行が挿入され、その行、、、、Col2およびから3つの値が取得されますnew.Col3new.Col3は別のテーブルから行を取得するために使用され、次に、Col2必要な値がある3番目のテーブルを検索するために使用されます。 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

私が欲しい結果は1a-9cからです。

トリガーの列名を修正できるようにテーブルスキーマを変更することを検討しましたが、他のコードビットで問題が発生するため、これは最後の手段になります。

4

2 に答える 2

3

プリペアドステートメントと動的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;
于 2012-11-28T18:01:28.927 に答える
-3

以下のようにプリペアドステートメントを使用してみてください。

 PREPARE myStmt FROM 
 'concat( insert into table4 values (', 
          'select ',
          a,
          ' from table3 where yq=',
          c,
          ' and xz=',
          b, 
          '))';
 EXECUTE myStmt;
于 2012-11-28T17:27:56.383 に答える