сливане в oracle сравняване на дати

Искам да предам FromDate и ToDate в процедура и след това да актуализирам и вмъкна стойности, както следва. Таблиците student и studLoad имат по 3 полета: id, name и insertDate.

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

person z22    schedule 13.08.2012    source източник
comment
С коя конкретно дата изпитвате проблеми?   -  person Jordan Parmer    schedule 13.08.2012
comment
когато премахна sl.insertdate= trunc(sysdate) и trunc(sysdate) в кода, процедурата се създава (но, разбира се, не отговаря на изискванията ми)   -  person z22    schedule 13.08.2012
comment
Като цяло, ако получавате грешка, е изключително полезно да публикувате грешката, вместо да ни карате да гадаем. Предполагам, че получавате грешка при компилиране, защото се опитвате да посочите WHERE клауза в INSERT ... VALUES израз, който не е валиден синтаксис. Също така би било полезно да обясните точно какви са вашите изисквания - нямаме представа какво смятате за правилно.   -  person Justin Cave    schedule 13.08.2012
comment
ах, моя грешка, моля, прегледайте редактираната ми публикация, за да разберете грешката. не е с клаузата where, а с частта за дата   -  person z22    schedule 13.08.2012


Отговори (2)


разбрах грешката си- ; не е необходим след актуализацията, т.е. правилният код е:

 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;
person z22    schedule 13.08.2012

Оградете къде в скоби като

where (s.insertdate>f_date);
person AnBisw    schedule 13.08.2012
comment
Това не прави нищо за коригиране на грешката на OP. Скобите около израз са чисто незадължителни... - person N West; 15.08.2012
comment
@NWest- Скобите не са задължителни, но не са грешни! и не оправдава гласуването ви против отговора (освен ако не сте назначен Oracle Police тук на SO) - person AnBisw; 15.08.2012
comment
Грешката, която OP срещна, е ERROR at line 12: PLS-00103: Encountered the symbol "END". Как добавянето на скоби отговаря на въпроса на OP? Това просто въвежда объркване за някой, който може просто да учи езика. - person N West; 15.08.2012
comment
Опитвахме се да отстраним проблема (заедно с OP). Заявката е наред и според грешката беше очевидно, че някъде липсва символ и затова се опитвах да разреша това. Не знам защо би объркало някого (и освен това е структуриран начин за писане на код, който би бил по-четлив). Също така, FYI - не съм казал, че отговорът тук ще реши проблема ви в моя отговор. Нека просто кажем, че искахте да гласувате против публикацията и да я наречете ден. - person AnBisw; 15.08.2012