1

スーパーにはたくさんの商品があります。これらの製品の 1 つが数量ゼロになった場合、この製品が在庫切れであることを示す自動メールをマネージャーに送信する必要があります。

私は電子メールの部分を行いました(SQL Developerを介して電子メールを送信します)。ここで、製品の数量を追跡し続けるためのループを設定する必要があります。このループはどのように呼ばれますか? .

APC? 私はこれを試しました。しかし、それは私のために働いていません

create or replace
procedure check_stock_qty
begin      
for r in ( select product_name,product_id from super_market 
where pro_qty = 0 )  
loop       
UTL_MAIL.send(sender => 'blabla@me.com',
        recipients => 'blabla@me.com',
         subject => 'Test Mail',
         message => ( r.product_name ),
      mime_type => 'text; charset=us-ascii');  

end loop; 
end;
------------------------
BEGIN    

dbms_scheduler.create_job (job_name => 'stock check',
job_type        => 'PLSQL_BLOCK',        
job_action      => 'BEGIN check_stock_qty; END;',    
start_date      => SYSTIMESTAMP,       
repeat_interval => 'freq=minutely; interval=5; bysecond=0;',    
end_date        => NULL,         
enabled    => TRUE,
END;

プロシージャはコンパイルされましたが、それを実行してください。「選択したプログラムは、実行するには無効な状態にあります。プログラムを再コンパイルして、もう一度やり直してください」というエラーが表示されます。

4

1 に答える 1

2

これを行う最善の方法は、データベース ジョブを使用して PRODUCTS テーブルを定期的にチェックすることです。

まず、ストアド プロシージャが必要です。このようなもの:

create or replace procedure check_stock_qty
begin
     for r in ( select product_name from products
                where qty = 0 )
     loop
         your_email_proc_here ( r.product_name );
     end loop;
end;

次に、これを定期的に実行するように設定します。Oracle 11g を使用しているため、これを行うには DBMS_SCHEDULER API を使用する必要があります。この calll は、上記の株式チェッカーを 5 分ごとに実行します。

BEGIN
    dbms_scheduler.create_job (
        job_name        => 'stock check',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN check_stock_qty; END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'freq=minutely; interval=5; bysecond=0;',
        end_date        => NULL,
        enabled         => TRUE,
END;
/

DBMS_SCHEDULER は非常に高度で複雑ですが、十分に文書化されています。 詳細をご覧ください。

于 2012-05-21T14:10:40.580 に答える