0

今夜の最後の質問です。まだ Coldfusion8 と MySQL を使用しています。

それぞれ価格 A、B、C の製品を含むテーブルがあります。すべての価格 (A_min、A_max、B_min、B_max、C_min、C_max) で A、B、C の最小値と最大値を取得する必要があります。

ストアド プロシージャを作成し、次のように A、B、C をループすると考えました。

  <cfloop list="A,B,C" index="what" delimiters=",">
    <cfstoredproc procedure="proc_search_select_minmax" datasource="dtb">
        <cfprocparam type="in" value="#what#" cfsqltype="cf_sql_varchar" maxlength="15">
        <cfprocparam type="in" value="#variables.xxx#" cfsqltype="cf_sql_varchar" maxlength="13">
        <cfprocparam type="in" value="#variables.yyy#" cfsqltype="cf_sql_varchar" maxlength="13">
        <cfprocparam type="in" value="#variables.zzz#" cfsqltype="cf_sql_text" maxlength="4">
        <cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_min">
        <cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_max">   
     </cfstoredproc>
  </cfloop>

したがって、A、B、および C に対してこれを 3 回実行し、ループから変数 A_min、A_max、B_min... を取得するというアイデアがありました。

しかし、MySQL 内で次のように宣言している out-parameters に問題があります。

 CREATE ... PROCEDURE `proc_search_select_minmax`(..., OUT `outputMin` DECIMAL(12,2), OUT `outputMax` DECIMAL(12,2))

 .... 
 SET outputMin = min(what);
 SET outputMax = max(what);

コールドフュージョン エラーは次のように述べています。

Error Executing Database Query
@
<cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_min">
<cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_max">

質問:
出力パラメータに MySQL 内部と同じ名前を付ける必要がありますか? それとも正しい順序で十分ですか?
さらに重要なことに、このように出力変数を動的に設定できますか? そうでない場合、ストアド プロシージャを 3 回別々に呼び出す以外に方法はありますか?

4

3 に答える 3

2

これを行う変数を返す方法が好きではありませんでした。便利ですが、しばしば困難です (注文などによって異なります)。

あなたに2つの提案があります。

まず、出力をデータセットにします。ストアド プロシージャで、最小値と最大値の 2 つの列を持つ一時テーブル (#myMinMax など) を作成します。<cfstoredprocresult..>

次に、ループを実行し、「タイプ」列を含むデータセット全体を返すストアド プロシージャを作成する可能性があります。そのため、(A のように) 最小 (10 のように) および最大 ( 100 のように) ... A に 1 行、B に 1 行、C に 1 行。

于 2012-06-12T22:02:27.370 に答える
0

出力パラメータについてはMarkに同意します。単一の値の場合、どちらの方向にも進むことができます。ただし、それを超えると、結果セットを返す方が簡単です。

データベースクエリの実行中にエラーが発生しました

そうは言っても、コードは以下のCF8/MySQL5のサンプルプロシージャで正常に機能します。部分的なエラーメッセージに基づいて、本当の問題はプロシージャの構文エラーであると思われます。データベースで直接テストしましたか?

<cfloop>
    <cfstoredproc ...>
        ....
    </cfstoredproc>
</cfloop>
<cfoutput>
    #a_min# #a_max# <br />
    #b_min# #b_max# <br />
    #c_min# #c_max# <br />
</cfoutput>


CREATE PROCEDURE `test`.`proc_search_select_minmax` (
     what varchar(50)
     , xxx varchar(50)
     , yyy varchar(50)
     , zzz varchar(50)
     , OUT outputMin decimal(12,2)
     , OUT outputMax decimal(12,2)
 )
BEGIN

      SET outputMin = 1;
      SET outputMax = 20;
END 
于 2012-06-14T07:39:19.637 に答える
0

SQL Server では、dbvarname 属性に @ 記号を使用して変数を設定します。

<cfprocparam cfsqltype="cf_sql_integer" 
    value="#LOCAL.User_ID#" 
    dbvarname="@User_ID">

試してみてください。

更新 ~ CF ドキュメントを確認したところですが、上記のアドバイスは役に立ちません

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_14.html

dbvarname 属性の動作が変更されました。すべてのドライバーで無視されるようになりました。ColdFusion は JDBC 2.2 を使用し、名前付きパラメーターをサポートしていません。

于 2012-06-12T20:17:41.150 に答える