java - Oracle MERGE and prepared statement -


i have backup utility, workig on restore section. table:

create table "sbooks"."dev_corpus"     (    "corpusid" number(9,0) not null enable,      "corpus_name" varchar2(768 byte) not null enable,      "corpuslastsync" date,       primary key ("corpusid") 

in restore class primary key in table, if exists update row, if not insert row.
problem need pass parameters class (they not exist in table), how can this? suggestion? using preparedstatment or what? , how? please give examples or links sources.

more info: using oracle sql developer , java netbeans.

edit: trying in command window:

  merge dev_corpus     using (select corpusid, corpus_name, corpusdesc, corpusimageids, rocf1, rocf2, rocf3, rocc1, rocc2, rocc3, corpusactive, corpusrunfrequency, corpuslastrun, corpuslastsync, rocsettingid, corpusaffinity, corpusterms, corpusdomain dual corpusid = 1000156 , corpus_name = 'sahar' , corpusdesc = 'sahaaaaa' , corpusimageids null , rocf1 null , rocf2 null , rocf3 null , rocc1 null , rocc2 null , rocc3 null , corpusactive null , corpusrunfrequency null , corpuslastrun null , corpuslastsync null , rocsettingid null , corpusaffinity null , corpusterms null , corpusdomain null) incoming    on (a.corpusid = incoming.corpusid )     when matched    update set corpusid = incoming.corpusid , corpus_name = incoming.corpus_name , corpusdesc = incoming.corpusdesc , corpusimageids = incoming.corpusimageids , rocf1 = incoming.rocf1 , rocf2 = incoming.rocf2 , rocf3 = incoming.rocf3 , rocc1 = incoming.rocc1 , rocc2 = incoming.rocc2 , rocc3 = incoming.rocc3 , corpusactive = incoming.corpusactive , corpusrunfrequency = incoming.corpusrunfrequency , corpuslastrun = incoming.corpuslastrun , corpuslastsync = incoming.corpuslastsync , rocsettingid = incoming.rocsettingid , corpusaffinity = incoming.corpusaffinity , corpusterms = incoming.corpusterms , corpusdomain = incoming.corpusdomain    when not matched    insert (corpusid, corpus_name, corpusdesc, corpusimageids, rocf1, rocf2, rocf3, rocc1, rocc2, rocc3, corpusactive, corpusrunfrequency, corpuslastrun, corpuslastsync, rocsettingid, corpusaffinity, corpusterms, corpusdomain)    values (incoming.corpusid, incoming.corpus_name, incoming.corpusdesc, incoming.corpusimageids, incoming.rocf1, incoming.rocf2, incoming.rocf3, incoming.rocc1, incoming.rocc2, incoming.rocc3, incoming.corpusactive, incoming.corpusrunfrequency, incoming.corpuslastrun, incoming.corpuslastsync, incoming.rocsettingid, incoming.corpusaffinity, incoming.corpusterms, incoming.corpusdomain) 

this real table:

create table "sbooks"."dev_corpus"     (    "corpusid" number(9,0) not null enable,      "corpus_name" varchar2(768 byte) not null enable,      "corpusdesc" varchar2(4000 byte),      "corpusimageids" varchar2(768 byte),      "rocf1" float(63),      "rocf2" float(63),      "rocf3" float(63),      "rocc1" float(63),      "rocc2" float(63),      "rocc3" float(63),      "corpusactive" number(3,0),      "corpusrunfrequency" number(3,0),      "corpuslastrun" date,      "corpuslastsync" date,      "rocsettingid" number(3,0),      "corpusaffinity" number(3,0),      "corpusterms" varchar2(4000 byte),      "corpusdomain" number(3,0),       primary key ("corpusid") 

throws me error:

error @ command line:2 column:644 error report: sql error: ora-00904: "corpusdomain": invalid identifier 00904. 00000 -  "%s: invalid identifier" *cause:     *action: 

.

i dont know missing. u have idea?

thanks!

edit2: works in comand win:

merge dev_corpus   using (select 1000156 corpusid, 'sss2' corpus_name, 'sahaaaaaar' corpusdesc, null corpusimageids, null rocf1, null rocf2, null rocf3, null rocc1, null rocc2, null rocc3, null corpusactive, null corpusrunfrequency, null corpuslastrun, null corpuslastsync, null rocsettingid, null corpusaffinity, null corpusterms, null corpusdomain dual) incoming    on (a.corpusid = incoming.corpusid )     when matched    update set corpus_name = incoming.corpus_name , corpusdesc = incoming.corpusdesc , corpusimageids = incoming.corpusimageids , rocf1 = incoming.rocf1 , rocf2 = incoming.rocf2 , rocf3 = incoming.rocf3 , rocc1 = incoming.rocc1 , rocc2 = incoming.rocc2 , rocc3 = incoming.rocc3 , corpusactive = incoming.corpusactive , corpusrunfrequency = incoming.corpusrunfrequency , corpuslastrun = incoming.corpuslastrun , corpuslastsync = incoming.corpuslastsync , rocsettingid = incoming.rocsettingid , corpusaffinity = incoming.corpusaffinity , corpusterms = incoming.corpusterms , corpusdomain = incoming.corpusdomain    when not matched    insert (corpusid, corpus_name, corpusdesc, corpusimageids, rocf1, rocf2, rocf3, rocc1, rocc2, rocc3, corpusactive, corpusrunfrequency, corpuslastrun, corpuslastsync, rocsettingid, corpusaffinity, corpusterms, corpusdomain)    values (incoming.corpusid, incoming.corpus_name, incoming.corpusdesc, incoming.corpusimageids, incoming.rocf1, incoming.rocf2, incoming.rocf3, incoming.rocc1, incoming.rocc2, incoming.rocc3, incoming.corpusactive, incoming.corpusrunfrequency, incoming.corpuslastrun, incoming.corpuslastsync, incoming.rocsettingid, incoming.corpusaffinity, incoming.corpusterms, incoming.corpusdomain) 

but in java class nooot works in update cases, if insert case work. in case of update not throw error freezes untill delete record db, inserts it, no update!. find wrong in code?

preparedstatement = dbconnection.preparestatement("merge dev_corpus " +                               "using (select ? corpusid, ? corpus_name, ? corpusdesc, ? corpusimageids, ? rocf1, ? rocf2, ? rocf3, ? rocc1, ? rocc2, ? rocc3, ? corpusactive, ? corpusrunfrequency, ? corpuslastrun, ? corpuslastsync, ? rocsettingid, ? corpusaffinity, ? corpusterms, ? corpusdomain dual) incoming " +                               "on (a.corpusid = incoming.corpusid ) " +                               "when matched " +                               "update set corpus_name = incoming.corpus_name , corpusdesc = incoming.corpusdesc , corpusimageids = incoming.corpusimageids , rocf1 = incoming.rocf1 , rocf2 = incoming.rocf2 , rocf3 = incoming.rocf3 , rocc1 = incoming.rocc1 , rocc2 = incoming.rocc2 , rocc3 = incoming.rocc3 , corpusactive = incoming.corpusactive , corpusrunfrequency = incoming.corpusrunfrequency , corpuslastrun = incoming.corpuslastrun , corpuslastsync = incoming.corpuslastsync , rocsettingid = incoming.rocsettingid , corpusaffinity = incoming.corpusaffinity , corpusterms = incoming.corpusterms , corpusdomain = incoming.corpusdomain " +                               "when not matched " +                               "insert (corpusid, corpus_name, corpusdesc, corpusimageids, rocf1, rocf2, rocf3, rocc1, rocc2, rocc3, corpusactive, corpusrunfrequency, corpuslastrun, corpuslastsync, rocsettingid, corpusaffinity, corpusterms, corpusdomain) " +                               "values (incoming.corpusid, incoming.corpus_name, incoming.corpusdesc, incoming.corpusimageids, incoming.rocf1, incoming.rocf2, incoming.rocf3, incoming.rocc1, incoming.rocc2, incoming.rocc3, incoming.corpusactive, incoming.corpusrunfrequency, incoming.corpuslastrun, incoming.corpuslastsync, incoming.rocsettingid, incoming.corpusaffinity, incoming.corpusterms, incoming.corpusdomain)"); 

thanks!

if you're using oracle you'll need focus on merge statement - insert ... on duplicate key doesn't work in oracle.

i don't know if problem, there syntax errors in merge posted:

merge dev_corpus using (select * dual (corpusid=?, corpus_name=?, corpuslastsync=?)                                 ^^^^^^^^^^^^^^^^^^^^^^ (1) on (a.corpusid = incoming.corpusid ) when matched update set (a.corpus_name = incoming.corpus_name , a.corpuslastsync = incoming.corpuslastsync )             ^^^^^^^^^^^^^^^^^^ (2) when not matched insert (a.corpusid, a.corpus_name, a.corpuslastsync) values (incoming.corpusid, incoming.corpus_name, incoming.corpuslastsync) 

problem (1): have unclosed parenthesis, plus multiple where conditions should separated and, not comma. here's corrected version, indented doesn't require horizontal scrolling:

using (   select * dual   (corpusid=? , corpus_name=? , corpuslastsync=?)) 

the parentheses surrounding where conditions optional in case, work too:

using (   select * dual   corpusid=? , corpus_name=? , corpuslastsync=?) 

problem (2): parentheses after set, , here need comma instead of and. should (as above, i've indented can read without horizontal scrolling)

update set   a.corpus_name = incoming.corpus_name,   a.corpuslastsync = incoming.corpuslastsync 

that should take care of syntax errors, of course that's no guarantee results expected :)

finally, mentioned in comments, try out in sqlplus or sql developer using test values (not parameters). it'll much, easier debug way. when you've got merge behaving correctly can move java code , parameterize it. best of luck!


addendum updated question

first of all, news you're using sql developer work out! disregard last paragraph above :)

second, includes and corpuslastsync = null. when checking null, need is null, not = null:

... , corpuslastsync null 

finally, i'm pretty sure specific error you're getting latest attempt due aliases on line:

insert (a.corpusid, a.corpus_name, a.corpuslastsync) 

try instead:

insert (corpusid, corpus_name, corpuslastsync) 

oracle knows columns named here belong dev_corpus table, aliased a.


Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -