2016-12-06 8 views
0
DECLARE 
    CURSOR cursor IS SELECT SHIP_ID, DATE_ARRIVE, QTY_EXPECTED, DESCRIPTION, QTY_HAND, ITEM_RATE, (QTY_EXPECTED * ITEM_RATE), ((QTY_EXPECTED * ITEM_RATE) + (QTY_HAND * ITEM_RATE)),((QTY_EXPECTED * ITEM_RATE) + (QTY_HAND * ITEM_RATE)) 
    FROM SHIPPINGTABLE; 
    S_SHIPID SHIPPINGTABLE.SHIP_ID%TYPE; 
    S_DATEARRIVE SHIPPINGTABLE.DATE_ARRIVE%TYPE; 
    S_QTYEXPECTED SHIPPINGTABLE.QTY_EXPECTED%TYPE; 
    S_DESCRIPTION SHIPPINGTABLE.DESCRIPTION%TYPE; 
    S_QTYHAND SHIPPINGTABLE.QTY_HAND%TYPE; 
    S_ITEMRATE SHIPPINGTABLE.ITEM_RATE%TYPE; 
    S_SHIPMENTVALUE NUMBER(10); 
    S_TOTALVALUE NUMBER(10); 
    S_GRANDTOTAL NUMBER(10) := 0; 
BEGIN 
    OPEN cursor; 
     LOOP 
     FETCH CURSOR INTO S_SHIPID, S_DATEARRIVE, S_QTYEXPECTED, S_DESCRIPTION, S_QTYHAND, S_ITEMRATE, S_SHIPMENTVALUE, S_TOTALVALUE, S_GRANDTOTAL; 
     EXIT WHEN cursor%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE('Shipment ' || S_SHIPID || ' is expected to arrive on '|| S_DATEARRIVE); 
     DBMS_OUTPUT.PUT_LINE('Description: ' || S_DESCRIPTION); 
     DBMS_OUTPUT.PUT_LINE('Shipment value: ' || S_SHIPMENTVALUE); 
     DBMS_OUTPUT.PUT_LINE('Quantity on hand: ' || S_QTYHAND); 
     DBMS_OUTPUT.PUT_LINE('Total product value: ' || S_TOTALVALUE); 
     DBMS_OUTPUT.PUT_LINE(CHR(10)); 
     S_GRANDTOTAL := S_TOTALVALUE + S_GRANDTOTAL; 
     END LOOP; 
     DBMS_OUTPUT.PUT_LINE(S_GRANDTOTAL); 
     CLOSE cursor; 
END; 
/

私は総計を計算しようとしています。今すぐ出力は次のようになります。ループ中に自己に値を追加

Shipment 211 is expected to arrive on 15-Nov-07 
Description: Season Tents 
Shipment value: 12500. 
Quantity on hand: 3 
Total product value: 14000 

これは正しいです。また、S_GRANDTOTALも出力されますが、最後の項目を追加するだけで、前の項目の合計が追加されません。私もSQLでこれを行う方法はありますが

variable += variable

ような何かを行うことができますJavaで知っていますか?

答えて

1

Javaの[variable1 + = variable2]に相当するPL/SQLは[variable1:= variable1 + variable2]です。ですから一見すると、あなたの[S_GRANDTOTAL:= S_TOTALVALUE + S_GRANDTOTAL]が正しいように見えます。ただし、SQL文では、GRANDTOTALのソース派生はTOTAL_VALUE [((QTY_EXPECTED * ITEM_RATE)+(QTY_HAND * ITEM_RATE))]のものと同じです。最後のフィールド定義をSQLステートメントから削除し、[[INTO] S_GRANDTOTAL]エレメントをカーソルフェッチステートメントから削除します。あなたのコードは意図どおりに動作すると思います。 TOTAL_VALUEはS_GRAND_TOTAL変数にゼロから最終値までの間に加算され、レポートの最後に表示されます。

あなたはSQL文の中で派生フィールドのエイリアスを作成するかどうそれは役立つだろう、すなわち:SHIPMENT_VALUE、((QTY_EXPECTED * ITEM_RATE AS をSHIP_ID、DATE_ARRIVE、QTY_EXPECTED、DESCRIPTION、QTY_HAND、ITEM_RATE、(QTY_EXPECTED * ITEM_RATE)を選択)+(QTY_HAND * ITEM_RATE))AS TOTAL_VALUE

このような

A PL/SQLカーソルループはそれがテーブルが数百万行または数十億が含まれている場合、それはその膝にあなたのシステムをもたらすでしょう、で、スケーラブルではないと/またはシステム上でこれ以外にも高いアクティビティがあります。
このため、フロントエンドでレポートツールを使用し、バックエンドに単一のSQL(PL/SQLカーソルループではない)文を使用することをお勧めします。ツールで複数レベルの詳細、集計、ロールアップを実行します。

+0

ありがとうございました。私はスケーラビリティがないかもしれないと理解していますが、それは単なる宿題にすぎないので、心配する必要はありません。 – Josh

+2

あなたが学校を離れて職業に就き(ブートキャンプ外で戦場に出ると)、あなたは訓練を受けているように演技します。直面する問題を超えて、そこに存在するすべての要素、条件、リソース、制約(技術的、組織的、官僚的)を備えた生産環境で、これが実際にどのように機能するか、常に考えてみてください。 – Howard007

+0

乾杯と幸運! – Howard007

関連する問題