Avatar billede hhaaagensen Nybegynder
03. april 2007 - 11:19 Der er 15 kommentarer og
1 løsning

implementere plsql i java metode

Jeg har en metode i plsql der henter en csv fil fra basen og splitter den ud i en tabel med de rigtig værdier, denne metode vil jeg meget gerne kunne kalde i en metode i java så det er noget der sker automatisk.. nogen der ved hvordan ??

Min sql:

CREATE OR REPLACE procedure split_upload_to_fakturalines(pUploadId in number) is -- udload = csv
  wClob clob; -- ny clob variabel
  wStr varchar2(4000);
  wStartPos number:=1; -- sætter start pos til 1
  wStr1 varchar2(1000); -- første streng
  wStr2 varchar2(1000); -- anden streng
  wStr3 varchar2(1000); -- tredje streng
  wStr4 varchar2(1000); -- fjerde streng
begin
  delete fakturalinier; -- starter med at slette alt i fakturalinier
  select binaryfile into wClob from uploads where uploadid=pUploadId; --her kan man ændre pUploadId til at pege på filen?.
--
  loop -- her klipper man strenge op ved at søge efter enter chr(13)||chr(10) og anden gang trækker man den tidligere streng fra så man kun har den nye.
      -- den deler det op i delstrenge ved at søge efter det næste ;. rtrim er at den fjerner "" fra felterne.
    wStr:=substr(wClob,wStartPos,instr(wClob, chr(13)||chr(10), wStartPos, 1)-wStartPos);
    if ltrim(rtrim(wStr))!=';;;' and substr(wStr,1,6) !=  '"Kunde' then
      wStr1:=substr(wStr,1,instr(wStr,';')-1);
      wStr2:=substr(wStr,instr(wStr,';',1,1)+1,instr(wStr,';',1,2)-instr(wStr,';',1,1)-2);
      wStr3:=substr(wStr,instr(wStr,';',1,2)+1,instr(wStr,';',1,3)-instr(wStr,';',1,2)-2);
      wStr4:=substr(wStr,instr(wStr,';',1,3)+1);
      insert into fakturalinier(kunde_nr,kunde_navn,reference,beløb)
                        values(rtrim(ltrim(wStr1,'"'),'"')
                              ,rtrim(ltrim(wStr2,'"'),'"')
                              ,rtrim(ltrim(wStr3,'"'),'"')
                              ,rtrim(ltrim(replace(wStr4,'.',','),'"'),'"'));
    end if;
    wStartPos:=instr(wClob, chr(13)||chr(10), wStartpos+1, 1)+2;
    exit when instr(wClob, chr(13)||chr(10), wStartpos+1, 1)=0;
  end loop;
  commit;
end;

mvh Henrik
Avatar billede arne_v Ekspert
03. april 2007 - 15:29 #1
du vil kalde en Oracle Procedure fra Java ?

i JDBC bruger man CallableStatement til at kalde procedures med
Avatar billede hhaaagensen Nybegynder
03. april 2007 - 15:38 #2
hej arne v,

jeg har ingen anelse om hvordan jeg skal kringle dette problem og har ikk prøvet at bruge CallableStatement før så ved ikk hvad det er... skal bare ha det løst hurtigst muligt... overvejer lidt at bruge en StringTokenizer i stedet.. men så er det forfra og ved heller ikk hvordan jeg så skal stille det op...
Avatar billede arne_v Ekspert
03. april 2007 - 15:57 #3
hvis du kender PreparedStatement saa er det cirka det samme !

        CallableStatement cstmt = con.prepareCall("{CALL split_upload_to_fakturalines(?)}");
        cstmt.setDate(1, uploadid);
        cstmt.execute();
Avatar billede hhaaagensen Nybegynder
03. april 2007 - 16:04 #4
tjekker lige om det virker og så poster jeg en kommentar om et svar...
Avatar billede hhaaagensen Nybegynder
03. april 2007 - 16:11 #5
hmm hvor placerer jeg så min sql i mit system...??
Avatar billede arne_v Ekspert
03. april 2007 - 16:37 #6
du har din stored procedure i din Oracle database ikke ?
Avatar billede hhaaagensen Nybegynder
03. april 2007 - 16:44 #7
min csv fil ligger i en Oracle database hvis det er det du mener??
Avatar billede hhaaagensen Nybegynder
03. april 2007 - 16:48 #8
jeg bruger javazoom's uploadbean til at smide den i basen og lige efter jeg har gjort det vil jeg gerne kunne få den til at splitte den ud i en tabel automatisk...
Avatar billede arne_v Ekspert
04. april 2007 - 04:02 #9
men den SP du har i spørgsmålet - ligger den i din Oracle database nu ?
Avatar billede hhaaagensen Nybegynder
04. april 2007 - 08:18 #10
SP = Stored Pocedure?? Jeg bruger en Jsp side der har browse felt hvor jeg henter en fil og den kalder sig selv og gemmer min csv fil i en Oracle database som en hel fil uden at splitte den op...
Avatar billede hhaaagensen Nybegynder
04. april 2007 - 09:15 #11
den (split_upload_to_fakturalines) ligger inde i procedures under min connection.
Avatar billede hhaaagensen Nybegynder
04. april 2007 - 09:35 #12
Ok dit forslag:

CallableStatement cstmt = con.prepareCall("{CALL split_upload_to_fakturalines(?)}");
        cstmt.setDate(1, uploadid);
        cstmt.execute();

Hvad skal jeg sætte uploadid som? den vil ha en java.sql.Date.

setDate kræver en Streng og en date og du vil gi den en int og en variabel??

Og hvad med fakturalines(?) hvad skal ? erstattes med eller skal det bare være der??
Avatar billede arne_v Ekspert
08. april 2007 - 02:08 #13
cstmt.setDate(1, uploadid);

skal være

cstmt.setInt(1, uploadid);

jeg har copy pastet fra et eksempel med en Date
Avatar billede arne_v Ekspert
08. april 2007 - 02:09 #14
? er en place holder

cstmt.setInt(1, uploadid);

sætter uploadid ind for 1. spørgsmålstegn
Avatar billede hhaaagensen Nybegynder
08. april 2007 - 12:13 #15
nice work jeg har fået det til at virke.. super hjælp arne v... smid et svar for point....
Avatar billede arne_v Ekspert
08. april 2007 - 16:11 #16
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester