7

proc1 と proc2 という 2 つのプロシージャがあります。ある mysql プロシージャを別のプロシージャ内で呼び出しています。

proc1 では、proc2 の値を proc1 一時テーブルに挿入したいと考えています。proc2 は 2 つの列を返しますが、proc1 一時テーブルには 1 つの列のみを挿入したいと考えています。

Proc2 の出力は次のとおりです。

Hrs(Timestamp)    Status
09:30             IN,OUT,IN,OUT 
04:30             IN,OUT
07:30             IN,OUT,IN,OUT
04:25             IN,OUT

Proc1 コード

CREATE PROCEDURE Proc1()
BEGIN
   DROP TABLE IF EXISTS TempWorkedHrs ;
   CREATE TEMPORARY TABLE TempWorkedHrs(WorkedHrs TIMESTAMP); 

   INSERT INTO TempWorkedHrs(WorkedHrs)
   CALL Proc2(); 

   SELECT SUM(WorkedHrs) INTO @TotalHrs
     FROM TempWorkedHrs;        
END //

proc1 の一時テーブルに値を挿入する場合、proc2 の 2 番目の列は重要ではありません。

Q1. プロシージャから返された特定の列を一時テーブルに挿入する方法は? 私の場合、proc2 の最初の列です。

4

2 に答える 2

4

簡単な答え: これは不可能です。

長い回答: これは不可能ですが、同じ効果を得るための回避策があります。

オプション 1: 一時テーブルにダミー列を追加します。内部からすべての列をProc2一時テーブルに挿入します。次に、ダミー列をドロップします。汚れた。

オプション 2: パラメータを に追加します。aProc2BOOLEANおそらく適切な選択です。パラメータ値に応じて、挿入する列の数を増やしたり減らしたりします。汚れが少ない。

オプション 3: 本当にProc2手続きが必要ですか? 言い換えれば、データを選択する前に、本当にデータ (より一般的には環境) を変更するのでしょうか? つまり、この場合はビューの方が適しているのではないでしょうか。

[編集]

James Holderness のポインターのおかげで、ストアド プロシージャには戻り値がない (それを回避する方法がない) ことに気付いていない可能性があることに気付きました。「Proc2データを返す」とは、実際には「読み返すデータにProc2書き込む」ことを意味していると思いました。可能であれば、このアプローチは避けてください (オプション 1. または 2. のいずれかが汚いです)。おそらくここにビューが必要です。TempWorkedHrsProc1

于 2013-06-27T23:49:46.957 に答える
0

これは良い方法ではありませんが、トリガーを使用して手順を実行できます。

于 2013-07-04T02:25:52.060 に答える