2

スクリプトでこのループを実行する方法を見つけようとしています。

<cfquery>
<cfloop from="1" to="#arrayLen(myData)#" index="i">
<!--- update query with different paramaters --->
</cfloop>
</cfquery>

このようにループの外で実行できますが、遅いです:

for(i=1; i LTE arrayLen(myData); i++)
{
    q = new Query();
    q.setSql(" UPDATE SQL HERE ");
    q.addParam(name="id", value=i);
    q.Execute().GetResult();
}

SQLの外側ではなく、SQLの中でそれを行いたいです。

更新: これがコードです。分かりやすくするために、一部削除してみました。

ユーザーがデータを入力するフォームがあり、これが呼び出されます。

for(i=1; i LTE listlen(arguments.myStruct.myfield1); i++)   {           
    myfield1 = listgetAt(arguments.myStruct.myfield1,i);

    for(j=1; j LTE arguments.myStruct.count; j++) {
        maxvalue = form["max" & j];
        myType = form["myType" & j];
        id = myfield1;

        local.queryService = new Query();
        local.queryService.setSql
        ("          
            UPDATE  mytypes
            SET     maxvalue = :maxvalue,
                    myType = :myType
            WHERE   mytypeID = :id
        ");
        local.queryService.addParam(name="id", value=id);
        local.queryService.addParam(name="maxvalue", value=maxvalue, cfsqltype="cf_sql_integer");
        local.queryService.addParam(name="myType", value=myType, cfsqltype="cf_sql_integer");
        local.queryService.Execute().GetResult();
    }
}
4

3 に答える 3

1

Adam の回答を読み直した後、元の更新クエリを確認する必要があることに同意します。あなたの目標が何であるかは 100% わかりませんが、これが私の「推測」です。複数のレコードを異なる値で更新する場合は、次のようになります。

   UPDATE Table Col = 'xxx' WHERE ID = 1 ;
   UPDATE Table Col = 'yyy' WHERE ID = 2 ;
   ...

.. 文字列を作成し、ループ内にパラメータを追加できます。以下の Adam の例の適応を参照してください。機能させるには、データソースで「複数のクエリを許可する」設定を有効にする必要があることに注意してください。execute()また、データの整合性を維持するために、必ず呼び出しをトランザクションにラップしてください。

EDIT更新に基づいて前の例を変更しました:

<cfscript>
    // initialize these before any looping
    q = new Query();
    q.setDatasource("yourDSNHere");

    sqlArray = [];

    for(i=1; i LTE listlen(arguments.myStruct.myfield1); i++)   {           
        id = listgetAt(arguments.myStruct.myfield1,i);

        for(j=1; j LTE arguments.myStruct.count; j++) {
           // extract input values
           maxValue = form["max" & j];
           myType = form["myType" & j];

           // append a new statement
           arrayAppend(sqlArray, "UPDATE  mytypes 
                                  SET     maxvalue  = ?
                                        , myType = ? 
                                  WHERE myTypeID= ? "
                         );

           // add in the parameter values
           q.addParam(value="#maxValue#", cfSqlType="cf_sql_integer");
           q.addParam(value="#myType#", cfSqlType="cf_sql_integer");
           q.addParam(value="#id#", cfSqlType="cf_sql_integer");
    }

    // finally convert to single SQL string and run it
    q.setSQL( arrayToList(sqlArray, ";") );
    q.execute();
</cfscript>
于 2012-10-22T20:13:04.647 に答える
0

あなたが実際に何を求めているのかを伝えるのは難しいですが、これがその答えかもしれません?

<cfscript>
// dunno what your data is, but you need a col and a value so let's pretend you have those
myData = [
    {col="col1", value="one"},
    {col="col2", value="two"},
    {col="col3", value="three"}
];      


q = new Query(datasource="scratch_mysql");

sql = "UPDATE tbl_test2 SET ";
for (i=1; i <= arrayLen(myData); i++){
    q.addParam(value=myData[i].value);  // you might want a type here as well?
    sql &= " #myData[i].col# = ?";
    if (i < arrayLen(myData)){  
        sql &= ",";
    }
}
sql &= " WHERE id=1";

q.setSql(sql);
q.execute();
</cfscript>

あなたの質問がより明確になるまで、私はあなたに反対票を投じます。それは明確にする必要がある最初の<cfquery>ビットです: あなたが今何をしているのか. それがわかれば、スクリプトでそれを行う方法を教えてくれるはずです。

于 2012-10-22T19:16:20.000 に答える
0

ループ内でどのような情報を処理する必要があるかはよくわかりませんが、これを行う 1 つの方法は、更新ステートメントを作成し、それを cfquery 内で出力することです。ただし、これを cfscript で行う別の方法を次に示します。

<cfscript>
myData = ArrayNew(2);

myData[1][1] = "test";

myData[1][2] = "1";

for (row = 1; row LTE ArrayLen(myData); row++) {

    queryService = new query(); 

    queryService.setSQL('UPDATE mytable SET myfield = "#myData[row][1]#" where table_id=#myData[row][2]#');

    result = queryService.execute();
}
</cfscript>
于 2012-10-22T18:36:33.663 に答える