0

練習用に oracle sql でオークションハウスを設定しようとしています。各アイテムの DBMS ジョブを作成したいのは、sysdate がオークションの終了と同じになると、オークションが開始され、アイテムが販売されるためです。

新しいアイテムを売りに出すこのプロシージャ「sell」があります。そして最後にこれがあります:(identはアイテムのIDです)Ittは正しいアカウントにお金を置く関数を呼び出します。

CREATE PROCEDURE sell()
...
    begin
             dbms_scheduler.create_job 
        (  
          job_name      =>  'Item_Job'||to_char(ident),  
          job_type      =>  'PLSQL_BLOCK',  
          job_action    =>  'pay_the_seller('||to_char(ident)||');',  
          start_date    =>  pEnd_date,  
          enabled       =>  TRUE,  
          auto_drop     =>  TRUE,  
        end;
END;

問題は、'pay_the_seller' proc を実行しているように見えることです。start_date ではなく、ジョブが作成された時点。

たとえば、アイテムの開始入札額が 1 の場合、ジョブが起動すると、その間に入札額を変更したにもかかわらず、アカウントに 1 が追加されます。

編集: 「pay_the_seller()」プロシージャでは、ジョブの作成時に SELECT ステートメントが実行されますが、UPDATE は実行されません。

SELECT をすぐに実行しないようにするにはどうすればよいですか?

CREATE OR REPLACE PROCEDURE pay_the_seller(
  pItem_id auctions.item_id%TYPE)
AS
  seller_name accounts.username%TYPE;
  price auctions.price1%TYPE;
  buyer_name accounts.username%TYPE;
BEGIN
  SELECT seller INTO seller_name FROM auctions WHERE item_id = pItem_id;
  SELECT price1 INTO price FROM AUCTIONS WHERE item_id = pItem_id;
  SELECT buyer INTO buyer_name FROM auctions WHERE item_id = pItem_id;

  UPDATE accounts SET balance = balance + price WHERE username = seller_name;
END pay_the_seller;
4

0 に答える 0