SQL存储函数

时间:2011-08-25 08:20:04

标签: sql oracle

我要编写一个存储函数来检索去年交付的给定产品的项目数,并编写一个SQL Select语句,该语句使用该函数来显示产品号和名称+没有交付的项目在去年所有产品。

请帮帮我

谢谢

2 个答案:

答案 0 :(得分:3)

据推测,你的问题是由学校或大学的任务引起的。至少我希望是这样,因为为此目的使用函数是不好的做法。由于SQL和PL / SQL引擎之间的不断切换,并且因为它逐行查询交付而不是使用set操作,因此性能很差。

简单的纯SQL语句执行得更好。我选择使用外部联接,因为您可能希望包含去年没有任何活动的产品。

select p.product_id
       , p.product_name
       , count(d.delivery_id) as sales_this_year 
from products p
    left outer join deliveries d
         on (p.product_id = d.product_id)
where d.dispatch_date >= add_months(sysdate, -12)
group by p.product_id, p.product_name
/

我将“去年”解释为过去12个月,因此使用了ADD_MONTHS()函数。不同的解释会有一个像这样的WHERE子句:

where d.dispatch_date between to_date('01-JAN-2010') and to_date('31-DEC-2010')

即上一个日历年;或许:

where d.dispatch_date >= trunc(sysdate, 'YYYY')

就是这个日历年。

答案 1 :(得分:2)

我想你有一个交货表和一个产品表。

create or replace function prod_delivered_cnt (p_prod_id in number) as
  v_res number;
begin
  select count(*) into v_res 
  from delivery_table d 
  where d.prod_id = p_prod_id 
  and d.date < to_date('2011', 'yyyy');
  return v_res;
end prod_delivered_cnt;

select p.prod_num, p.prod_name, prod_delivered_cnt(p.id) as cnt 
from product_table p;