練習用に 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;