1

製品テーブルから 3 種類の最小価格と最大価格を取得する Coldfusion8/MySQL のストアド プロシージャを呼び出しています。

一時テーブルを MySQL に戻す際に問題が発生しています。以下のコードは、一時テーブル自体ではなく、最初のfoundMin値のみを返します。

これをMySQL内で実行すると、結果は次のようになります

foundmin 1st price > returned to Coldfusion
foundmax 1st price
foundmin 2nd price
foundmax 2nd price
foundmin 3rd price
foundmax 3rd price
temporary table

したがって、テーブルのみが必要な場合は、すべての個々のテーブル エントリとテーブルを返します。

これが私のコードです:

BEGIN
    DECLARE filterILN  vARCHAR(100);
    DECLARE localILN   vARCHAR(100);
    DECLARE orderILN   vARCHAR(55);
    #search strings
    DECLARE p_e        vARCHAR(55) DEFAULT 'art.preis_ek';
    DECLARE p_a        vARCHAR(55) DEFAULT 'art.preis_aktuell';
    DECLARE p_r        vARCHAR(55) DEFAULT 'art.rabatt';
    DECLARE strLen     INT DEFAULT 4;
    DECLARE strCount   INT DEFAULT 1;
    DECLARE searchFor  vARCHAR(55);
    DECLARE foundMin     DECIMAL(12,2);
    DECLARE foundMax   DECIMAL(12,2);

    # temp table
    DROP TEMPORARY TABLE IF EXISTS MinMax;
    CREATE TEMPORARY TABLE MinMax (
        price  vARCHAR(50) DEFAULT ''
      , minVal DECIMAL(12,2) DEFAULT 0.00      
      , maxVal DECIMAL(12,2) DEFAULT 0.00    
    ) ENGINE=MEMORY;

    # FILTER 1
    IF param_reference_iln = 'A' THEN SET filterILN = 'B'
    ELSEIF param_reference_iln = 'C' THEN SET filterILN = 'D'
    END IF;

    # FILTER 2
    IF param_filter IS NOT NULL AND param_filter != ""
    THEN SET localILN = CONCAT('AND (iln = "', param_filter, '")');
    ELSE SET localILN = '*';
    END IF;

    # FILTER 3
    IF param_preorder = 'ja'
    THEN SET orderILN = CONCAT('AND vororder = "',param_preorder, '"');
    ELSE SET orderILN = '*';
    END IF;

    #loop over strIDs
    getPrice:
      LOOP
        IF ELT(strCount, p_e, p_a, p_r) = 'art.rabatt'
        THEN SET searchFor = 'art.preis_ek - art.preis_aktuell)/art.preis_ek';
        ELSE SET searchFor = ELT(strCount, p_e, p_a, p_r);
        END IF;

        #min
        SELECT MIN(searchFor) AS foundMin
        FROM artikelstammdaten AS art
           WHERE art.aktiv = "ja"
           AND art.bestand != "0"
           AND filterILN
           AND art.modus = CONCAT('OPEN ', param_unlocked_iln)
           AND localILN
           AND orderILN
           LIMIT 1;
        #max
        SELECT MAX(searchFor) AS foundMax
        FROM artikelstammdaten AS art
           WHERE art.aktiv = "ja"
           AND art.bestand != "0"
           AND filterILN       
           AND art.modus = CONCAT('OPEN ', param_unlocked_iln)
           AND localILN
           AND orderILN
           LIMIT 1;

        # insert into temp table
        INSERT INTO MinMax ( price, minVal, maxVal )
        VALUES( ELT(strCount, p_e, p_a, p_r), foundMin, foundMax );

        # increate counter by 1, end if strLen reached
        SET strCount = strCount+1;
        IF strCount = strLen
        THEN LEAVE getPrice;
        END IF;

      END LOOP getPrice;

    #output table
    SELECT * FROM MinMax;

    #destroy
    DROP TABLE MinMax;

END

値は正しく計算され、一時テーブルの本来あるべき場所に挿入されます。唯一の問題は、上記がテーブル エントリとテーブルの両方を返すことです。

質問:
一時テーブルだけを結果セット/構造体として返し、Coldfusion で使用するにはどうすればよいですか?

4

3 に答える 3

2

IMOの本当の問題は、mySQLプロシージャが複数の結果セット(構造体ではない)を返すことです。それは場合によっては便利ですが、あなたの手順は意図せずにそれを行っています。CFコードでこれらの結果を使用していないため、より良い解決策は、それらを削除して1つの結果のみを返すことです。つまり、不要なデータを返すためにリソースを浪費する意味はありません。

プロシージャが複数の結果を返す理由は、ループ内のSELECTステートメントが原因です。それぞれSELECTが個別の結果セット(つまり、クエリオブジェクト)を生成します。SELECT2つのステートメントを削除し、代わりにMIN / MAX値を一時テーブルに直接挿入することで、これらを排除できます。

    INSERT INTO MinMax ( price, minVal, maxVal )
    SELECT ELT(strCount, p_e, p_a, p_r), MIN(searchFor), MAX(searchFor)
    FROM   artikelstammdaten AS art
    WHERE  art.aktiv = "ja"
       AND art.bestand != "0"
       AND filterILN
       AND art.modus = CONCAT('OPEN ', param_unlocked_iln)
       AND localILN
       AND orderILN

次に、プロシージャは単一の結果セットを生成する必要がありますSELECT * FROM MinMax;

于 2012-06-16T20:23:09.260 に答える
0

プロシージャ/関数がテーブル全体を返すメカニズムはないと思います(TABLEはAFAIKタイプではありません)。一方、SELECT * FROM MinMax同じセッション内(同じDB接続で〜)に実行する限り、手順が完了した直後にアプリケーションから実行できます。

于 2012-06-16T11:20:06.387 に答える
0

とった。次のように、Coldfusion で結果セット属性使用する必要があります。

<!--- my stored proc --->
<cfstoredproc procedure="proc_search_select_minmax" datasource="db">
    <cfprocparam type="in" value="#A#" cfsqltype="cf_sql_varchar" maxlength="13">
    <cfprocparam type="in" value="#B#" cfsqltype="cf_sql_varchar" maxlength="13">
    <cfprocparam type="in" value="#C#" cfsqltype="cf_sql_text">
    <cfprocparam type="in" value="#D#" cfsqltype="cf_sql_char" maxlength="4">
    <!--- 7 results (3 min/3 max/temp table, I need to get the 7th resultset --->
    <cfprocresult name="min_max_struct" resultSet=7>
</cfstoredproc>

これでMySQLから構造体を出力できるようになりました!あなたはそれがどこにあるかを知る必要があります...

于 2012-06-16T12:16:01.830 に答える