超市有很多产品。当其中一个产品达到零时,需要将自动电子邮件发送给经理,表明该产品缺货。
我已经完成了电子邮件部分(通过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;
程序编译,但胜利运行它。它给出一个错误“所选程序处于无效运行状态。重新编译程序并重试”
答案 0 :(得分: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将每五分钟运行一次上面的股票检查:
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非常复杂,即复杂但有很好的文档记录。 Find out more.