0

我正在尝试在 oracle sql 中建立一个拍卖行进行练习。我想为每个项目制作 DBMS 作业,因为当 sysdate 等于拍卖结束时,它会触发并出售该项目。

我有这个程序“出售”,可以出售新物品。最后我有这个:(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”过程。在创建作业时不是在 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