2015-09-03 55 views
1

我正在使用PLSQL創建一個基於查詢另一個表來更新表的過程,並且我正在使用一個循環來達到此目的。爲了測試,我暫時擱置了程序代碼,並試圖使以下腳本正常工作。但它會根據微小的調整繼續拋出錯誤,包括「遇到符號」文件結尾「」或「無效SQL語句」。我哪裏錯了?PL/SQL腳本拋出錯誤

DECLARE CURSOR cur IS 
    SELECT * FROM Summary; 
BEGIN 
FOR rec in cur 
LOOP 
UPDATE Award 
SET monthly_sales = (
    SELECT COUNT(*) 
    FROM Sales 
    WHERE employee_id = rec.employee_id 
    AND to_char(Sales.SALES_DATE,'YY/MM')=to_char(SYSDATE,'YY/MM') 
) 
WHERE Summary.employee_id = rec.employee_id 
END LOOP 
END; 
/
+0

使用'AND trunc(Sales.SALES_DATE,'month ')= trunc(SYSDATE,'month')',那麼'to_char'在格式字符串中有兩位數的年份。如果您的銷售表曾經包含超過100年的數據,您可能會從一個多世紀的數據中獲益,儘管此錯誤需要很長時間才能顯現。 – Sentinel

+0

對於@boneist點,您可以在純SQL中執行此操作,這將比循環中的逐行更新更快。 – Wolf

回答

5

除了缺少分號即哨兵指出,您的where子句是不正確的:

WHERE Summary.employee_id = rec.employee_id; 

也許你的意思是:

WHERE award.employee_id = rec.employee_id; 

因爲您正在更新AWARD表?

但是,我會質疑爲什麼你使用逐行(又名慢速)方法,當你可以輕鬆地在單個語句中做到這一點?也許像下面的東西會給你正確的結果(未經測試,因爲你沒有給出創建腳本或輸入數據樣例等):

merge into award tgt 
using (select sls.employee_id, 
       count(*) monthly_sales 
     from sales sls 
     where trunc(sls.sales_date,'mm') = trunc(sysdate, 'mm') 
     and sls.employee_id in (select employee_id from summary) 
     group by sls.employee_id) src 
    on (tgt.employee_id = src.employee_id) 
when matched then 
update set tgt.monthly_sales = src.monthly_sales; 
4

您在線路12月底失蹤分號和13:

DECLARE CURSOR cur IS 
    SELECT * FROM Summary; 
BEGIN 
    FOR rec in cur 
    LOOP 
    UPDATE Award 
    SET monthly_sales = (
     SELECT COUNT(*) 
     FROM Sales 
     WHERE employee_id = rec.employee_id 
     AND trunc(Sales.SALES_DATE,'month') = trunc(SYSDATE,'month') 
    ) 
    WHERE Summary.employee_id = rec.employee_id; 
    END LOOP; 
END; 
/