2017-05-01 83 views
0

我使用來自兩個不同帖子的建議將以下代碼拼湊在一起,並且碰壁了。我的代碼的最終目標是從當年的10月1日至9月30日查找記錄,而不會提示用戶輸入或不必在兩者之間硬編碼日期範圍。在運行代碼時,我目前收到以下錯誤「綁定變量」End_Year「未聲明」。Toad For Oracle:綁定變量「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 
+0

':var_name'是一個綁定變量::告訴編譯器期望用戶輸入。更改您的var_names以刪除:假定定義的end_year和Begin_year變量不是hb_invoicing_All中的列名稱,否則還要重命名這些變量。喜歡'var_Begin_year' http://stackoverflow.com/questions/1597806/what-is-wrong-with-this-pl-sql-bind-variable-is-not-declared – xQbert

回答

0

有幾個東西是不對您的查詢,首先是給aliasinto條款。您還必須封裝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塊中。

+0

這種方式適合我需要的工作。謝謝! – SolerPower

+0

不客氣。 – Utsav

0

正如其他人所提到的那樣 - 您不需要任何plsql塊 - 只需一個sql查詢。

現在關於你的主要目標

我對這段代碼的最終目標是要找到從去年 年至當年9月30日的10月1日的記錄不提示用戶的 輸入或進行硬聲明

鑑於之間的代碼中的日期範圍,去年的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 

這僅僅是另一種方法,可能是多一點點「程序員友好'

如果您決定在某一天查看日期,則無需計算trunc(sysdate, 'YEAR')-92(您的方法)中代表9392的含義。