2016-09-29 4 views

答えて

0

cfqueryタグごとに複数のクエリを作成することはできません。基本的に、これはColdFusionでMySQLのレコードをコピーするためのものです。誰かがこれをさらに単純化できるなら、私はそれを感謝します。

<cfquery datasource="#request.datasource#"> 
     DROP TABLE IF EXISTS temp 
    </cfquery> 
    <cfquery result="copied" datasource="#request.datasource#"> 
     CREATE TABLE temp ENGINE=MEMORY 
     SELECT * FROM mytable WHERE id= <cfqueryparam value="#id_im_looking_for#"> 
    </cfquery> 

    <cfquery result="copied" datasource="#request.datasource#"> 
    INSERT INTO mytable SELECT NULL, name, description, NOW() FROM temp 
    </cfquery> 

    <cfquery datasource="#request.datasource#"> 
    DROP TABLE temp 
    </cfquery> 

少し冗長です。

+0

多くのロジックは、通常、ストアドプロシージャでより適切にラップされます。別のクエリを使用する必要がある場合は、テンポラリテーブルがセッションベースであることに注意してください(CFセッションと同じではありません)。そのため、同じセッションまたはdb接続を維持するために、照会をcftransactionにラップする必要があります。 [私が述べたように](http://stackoverflow.com/a/39987760/104223)、それは一時テーブルのようではないようです。 – Leigh

0

JDBC driverを使用すると、セキュリティ上の理由から、複数のステートメントの実行がデフォルトで無効になっています。 DSNの「接続設定」にallowMultiQueries=trueを追加することで、DSNで有効にすることができます。この設定を有効にすると、データベースがSQLインジェクションの特定のフォームに公開されることに注意してください。したがって、すべてのクエリパラメータにcfqueryparamを必ず使用してください。

allowMultiQueries

の使用を許可します ';' 1つの文(真/偽)

「偽」に、デフォルトの間に複数の のクエリを区切るためには、あなたが一時テーブルを必要とする理由がわからない、と述べました。単純なINSERT/SELECTはこのトリックを行うべきです。同じ表に挿入して選択することはできません。最終結果が制約に違反しない限り

INSERT INTO mytable (Name, Description, SomeDateCol) 
SELECT name, description, NOW() 
FROM mytable 
WHERE id = <cfqueryparam value="#id_im_looking_for#" cfsqltype="cf_sql_YourTypeHere"> 
関連する問題