0

私は現在、特定のアイテムに適切な割引を与えるプロシージャ内にカーソルを作成する必要がある PL/SQL 問題に取り組んでいます (価格 >= $100 の場合は 10%、価格 >= $10 の場合は 5%)。プロシージャを呼び出す必要がある場合、注文番号、顧客の名、姓、および特定の注文番号の割引後のアイテムの総純コストを表示する必要があります (この場合、注文番号を表示する必要があります)。 2)。この情報を表示することはできません。

これまでのところ、カーソルを使用してプロシージャを作成するためのコードを次に示します。

CREATE OR REPLACE PROCEDURE ComputeOrderTotal
(no_id IN orders.o_id%TYPE,
cfirst IN customer.c_first%TYPE,
clast IN customer.c_last%TYPE,
TotalNetCost OUT orders.ordertotal%TYPE) IS

CURSOR OrderCursor IS
  SELECT order_line.inv_id, inv_price, ol_quantity, inv_price*ol_quantity AS ExtPrice,
  CASE
    WHEN inv_price*ol_quantity >= 100 THEN 0.9*(inv_price*ol_quantity)
    WHEN inv_price*ol_quantity >= 10 THEN 0.95*(inv_price*ol_quantity)
    ELSE
    inv_price*ol_quantity
    END AS NetCost
  FROM inventory, order_line, orders, customer
  WHERE orders.o_id = customer.c_id;
OrderRow OrderCursor%ROWTYPE;

BEGIN
OPEN OrderCursor;
LOOP 
  FETCH OrderCursor INTO OrderRow;
  EXIT WHEN OrderCursor%NOTFOUND;
    TotalNetCost :=TotalNetCost + OrderRow.NetCost;  

END LOOP; 


DBMS_OUTPUT.PUT_LINE('Order Number:  ' || no_id || 'First Name: ' || cfirst  || 'Last Name:  ' ||
clast || 'Total Net Cost: ' || TO_CHAR(TotalNetCost, '$0999.99'));

END;

そして、これがプロシージャを呼び出すための私のコードです。

DECLARE
no_id orders.o_id%TYPE;
cfirst customer.c_first%TYPE;
clast customer.c_last%TYPE;
TotalNetCost orders.ordertotal%TYPE;

BEGIN
ComputeOrderTotal(2, cfirst, clast, TotalNetCost);    
END;

助けてくれてありがとう!

4

2 に答える 2

0

プロシージャを呼び出すコードの先頭にこの行を追加します。

セッションを変更して、serveroutput をオンに設定します。

于 2013-08-05T01:40:08.207 に答える
0

よくわかりませんが、2番目の条件が最初の条件と矛盾するため、条件が問題になる可能性があります. たとえば、110 は最初の条件を満たしますが、2 番目の条件も満たします。

WHEN inv_price*ol_quantity >= 100 THEN 0.9*(inv_price*ol_quantity)
WHEN inv_price*ol_quantity >= 10 THEN 0.95*(inv_price*ol_quantity)

2 番目の条件を <100 および >=10 に変更することをお勧めします

于 2013-08-05T00:35:14.303 に答える