Toad For Oracle:绑定变量“End_Year”未声明

时间:2017-05-01 14:56:40

标签: sql oracle toad

我使用来自几个不同帖子的建议将以下代码拼凑在一起并且已经碰壁了。我对此代码的最终目标是查找从去年10月1日到当年9月30日的记录,而不会提示用户输入或必须在两个语句之间硬编码日期范围。我正在运行代码时收到以下错误“绑定变量”End_Year“未声明”。

    declare
begin_Year date;
begin
 select trunc(sysdate, 'YEAR')-92 FY_begin_year
  Into begin_Year
  from Dual;
 end;

 declare
 End_Year date;
 begin
select  add_months(trunc(sysdate, 'YEAR'), 12)-93 FY_end_year
into End_Year
from dual;
end;

SELECT inv.company as company
               , inv.customer_id as cust
               , inv.address_id
               ,inv.invdate
               , SUM(inv.sales) as sales
               , SUM(inv.cost) as costs 
               FROM ifsinfo.hb_invoicing_all inv 
            WHERE inv.site IN ('06','01')
                AND TO_DATE(inv.invdate) between :begin_Year and :End_Year
            GROUP BY inv.company
               , inv.customer_id
               , inv.address_id 
               , inv.invdate

2 个答案:

答案 0 :(得分:0)

您的查询有几个问题,首先是将alias赋予into子句。此外,您必须将所有语句封装在1 PLSQL块中。

您还要对选择查询做什么。你在其他地方显示输出吗?

最简单的方法是直接使用下面的查询,而不是使用2个不同的变量。

SELECT inv.company as company
   , inv.customer_id as cust
   , inv.address_id
   ,inv.invdate
   , SUM(inv.sales) as sales
   , SUM(inv.cost) as costs 
   FROM ifsinfo.hb_invoicing_all inv 
WHERE inv.site IN ('06','01')
    AND TO_DATE(inv.invdate) 
    between  
        trunc(sysdate, 'YEAR')-92  
        and 
        add_months(trunc(sysdate, 'YEAR'), 12)-93
GROUP BY inv.company
   , inv.customer_id
   , inv.address_id 
   , inv.invdate

如果您必须使用变量,请将它们放在同一个plsql块中。

答案 1 :(得分:0)

正如其他人所说 - 您不需要任何plsql阻止 - 只需sql个查询。

现在关于你的主要目标

  

此代码的最终目标是从最后一个10月1日开始查找记录   当年9月30日当年没有提示用户   输入或必须在声明之间硬编码日期范围

鉴于去年10月1日可以找到

to_date('01/10/'|| (to_number(to_char(sysdate,'YYYY'))-1),'dd/mm/rrrr')

和  当年9月30日

to_date('30/09/'|| to_char(sysdate,'YYYY'),'dd/mm/rrrr')

您的查询变为

SELECT inv.company as company
   , inv.customer_id as cust
   , inv.address_id
   ,inv.invdate
   , SUM(inv.sales) as sales
   , SUM(inv.cost) as costs 
   FROM ifsinfo.hb_invoicing_all inv 
WHERE inv.site IN ('06','01')
    AND TO_DATE(inv.invdate) 
    between  
        to_date('01/10/'|| (to_number(to_char(sysdate,'YYYY'))-1),'dd/mm/rrrr')  
        and 
        to_date('30/09/'|| to_char(sysdate,'YYYY'),'dd/mm/rrrr')
GROUP BY inv.company
   , inv.customer_id
   , inv.address_id 
   , inv.invdate

这只是另一种方法,可能更多'程序员友好'

如果您决定在某一天查看日期,则无需计算9392trunc(sysdate, 'YEAR')-92所代表的内容(您的方法)。