2012-08-13 103 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