FireDAC を介して接続する IB データベースを実行しています。
次の動的クエリが機能します。
INSERT INTO RELATIONS (C_ID, M_ID, A_ID)
SELECT c.C_ID, 0, a.A_ID
FROM CATEGORIES c, ACTIONS a
WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION
A_INDEX
RELATIONS (整数)に列を追加します。この列では、パラメーターを指定したいので、次のようにします。
INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)
SELECT c.C_ID, 0, a.A_ID, :A_INDEX
FROM CATEGORIES c, ACTIONS a
WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION
ただし、これは機能しません。何らかの理由で、クエリを実行すると、CATEGORY
param の変換エラーがあると不平を言います。
これは、このクエリ操作の完全なコードです。
procedure Test;
var
Query: TFDQuery;
begin
Query := TFDQuery.Create(nil);
try
Query.Connection := DBDataModule.dbMain;
Query.ResourceOptions.ParamCreate := False;
Query.SQL.BeginUpdate;
Query.SQL.Add('INSERT INTO RELATIONS (C_ID, M_ID, A_ID, A_INDEX)');
Query.SQL.Add('SELECT c.C_ID, 0, a.A_ID,:A_INDEX');
Query.SQL.Add('FROM CATEGORIES c, ACTIONS a');
Query.SQL.Add('WHERE c.NAME = :CATEGORY AND a.NAME = :ACTION');
Query.SQL.EndUpdate;
Query.Params.CreateParam(TFieldType.ftInteger, 'A_INDEX', ptInput);
Query.Params.CreateParam(TFieldType.ftFixedWideChar, 'CATEGORY', ptInput);
Query.Params.CreateParam(TFieldType.ftFixedWideChar, 'ACTION', ptInput);
Query.ParamByName('CATEGORY').Size := 255;
Query.ParamByName('ACTION').Size := 255;
Query.Prepare;
Query.ParamByName('A_INDEX').Value := 0;
Query.ParamByName('CATEGORY').Value := 'Foo';
Query.ParamByName('ACTION').Value := 'Foo';
Query.ExecSQL; // <-- Exception
finally
Query.Free;
end;
end;
私はまだSQL、データベース、FireDACについて学んでいるので、selectステートメントに直接値を入力できる理由が本当にわかりませんが、paramはダメです。
A_INDEX
最初のクエリを使用して、列にパラメーターを動的に挿入するにはどうすればよいでしょうか?