2012-08-13 106 views
0

我希望將FromDate和ToDate傳遞給一個過程,然後按如下方式更新和插入值。 studentstudLoad表每個都有3個字段:id,name和insertDate。在oracle中比較日期合併

create or replace procedure incload(f_date date,t_date date) is 
begin 
    merge into studload sl 
    using student s 
     on (s.studid=sl.studid) 
    when matched then 
     update set sl.studname=s.studname, sl.insertdate= trunc(sysdate); 
    when not matched then 
     insert (sl.studid,sl.studname,sl.insertdate) 
     values (s.studid,s.studname,trunc(sysdate)) 
     where s.insertdate > f_date; 
end; 

日期事情給我帶來麻煩。我哪裏錯了?

編輯,包括錯誤

ERROR at line 12: PLS-00103: Encountered the symbol "END" 

1. create or replace procedure incLoad(f_date date,t_date date) is 
2. begin 
3. merge into studLoad sl 
+1

什麼「約會事情」特別是你遇到麻煩? – 2012-08-13 17:20:22

+0

當我刪除代碼中的sl.insertdate = trunc(sysdate)和trunc(sysdate)時,該過程被創建(但它當然不符合我的要求) – z22 2012-08-13 17:23:04

+3

一般來說,如果您遇到錯誤,發佈錯誤而不是讓我們猜測。我假設你正在得到一個編譯錯誤,因爲你試圖在'INSERT ... VALUES'語句中指定一個'WHERE'子句,這是無效的語法。這也將有助於準確解釋您的要求 - 我們不知道您認爲什麼是「正確的」。 – 2012-08-13 17:25:51

回答

1

了我mistake-括號內的地方;在更新後不需要,即正確的代碼是:

create or replace procedure incLoad(f_date date,t_date date) is 
begin 
merge into studLoad sl 
using student s 
on (s.studID=sl.studID) 
when matched then 
update set sl.studName=s.studName, sl.insertDate=trunc(sysdate) where s.insertDate > f_date // no semi-colon 
WHEN NOT MATCHED 
THEN 
INSERT (sl.studID,sl.studName,sl.insertDate) 
VALUES (s.studID,s.studName,trunc(sysdate)) where s.insertDate > f_date; 
end; 
-1

附上像

where (s.insertdate>f_date); 
+0

這沒有任何措施來解決OP的錯誤。表達式周圍的圓括號純粹是可選的... – 2012-08-15 13:44:20

+0

@ NWest-圓括號是可選的,但沒有錯!並且不能證明你拒絕投票迴應(除非你是SO的指定Oracle警察) – Annjawn 2012-08-15 14:58:10

+0

OP遇到的錯誤是'ERROR在第12行:PLS-00103:遇到符號「END」。添加括號如何回答OP的問題?它只是給可能剛剛學習語言的人帶來困惑。 – 2012-08-15 15:30:38