Avatar billede keysersoze Guru
29. marts 2004 - 17:22 Der er 15 kommentarer og
6 løsninger

Oracle til xml

Jeg skal have dannet en xml-fil ud fra nogle data i en oracle-database - og xml-filen skal fodres med data ca en gang i timen... dette burde jeg jo kunne lave vha ASP og et scheduled task, men findes der ikke en let og elegant måde man kan gøre det på i oracle?

XML-filen skal ligge på server X og Oracle kører på server Y - og i første omgang er det kun data fra én tabel, men kan det gøres ret simpelt skal det udviddes og så kan der komme mange tabeller med ind.

Så kan jeg gøre noget let - eller skal jeg hive noget ASP op ad skuffen?
Avatar billede Slettet bruger
29. marts 2004 - 17:54 #1
Det simpleste ville være at lave det i SQL*Plus.
Hvis du ikke har installeret Oracle-klienten på server X, kan du
måske køre det på server Y og spoole til fil på drev, mappet fra X?

Du kunne så have en danXML.sql fil:

spool dual.xml
prompt <xml ....>
prompt <dual>
select '<dummy>' || dummy || '</dummy>'
from dual;
prompt </dual>
spool off
Avatar billede keysersoze Guru
29. marts 2004 - 18:40 #2
Hvis jeg gør ovenstående så skal jeg stadig sætte det op som et job - right?

Hvis nu min tabel hedder "sejedata" og der i den er 3 kolonner "id", "navn" og "placering" og det kun er dem med placering = 2 der skal ud - hvad så? Hele resultatet skal selvfølgelig ned i XML-filen, men navnene på rækkerne skal ikke være id, navn og placering som i basen men i stedet "tal", "tekst" og "side" - hvad så?

(skal nok afsætte flere point hvis det kræves)
Avatar billede Slettet bruger
29. marts 2004 - 22:43 #3
Du skal vel altid sætte et job op. Det kan du selvfølgelig gøre ved at bruge Oracles DBMS_JOB-pakke. Men var det ikke nemmere at bruge Windows scheduled tasks til at kalde en bat-fil?

Din bat-fil skulle så kalde sqlplus:

sqlplus system/manager @danXML.sql

og danXML.sql skulle være noget lignende:

spool dual.xml
prompt <xml ....>
prompt <sejedata>
select '<tal>' || id || '</tal>'
  || '<tekst>' || navn || '</tekst>'
  || '<side>2</side>'
from sejedata
where placering=2;
prompt </sejedata>
spool off
Avatar billede Slettet bruger
29. marts 2004 - 22:44 #4
og der skal lige tilføjes en afsluttende linie:

exit

til danXML.sql
Avatar billede keysersoze Guru
29. marts 2004 - 23:25 #5
exit skal indsættes lige efter spool off - right?

jeg prøver lige ovenstående og ser hvad jeg kan få til at køre :)

hvis nu jeg så skulle hive "plac_navn" ud af tabellen "placering" som kan joines med id = placering så er det vel bare SQL-sætningen der skal ændres i?
Avatar billede Slettet bruger
30. marts 2004 - 07:18 #6
Ja - exit lige efter spool off-linien.

Hvis "plac_navn" ligger i tabellen placering, skal du vel ikke joine med noget, det er jo allerede placering du selecter ra.
Avatar billede keysersoze Guru
30. marts 2004 - 09:16 #7
det var også et dårligt eksempel.

Jeg sidder lige og kigger på de data der ligger i databasen og der kan jeg se at der er ét felt hvor der skal udskrives noget andet til XML-filen i forhold til indholdet i basen. Fx kan der stå "1_u" i basen, men ved udskrivning skal der skrives "7"... kan man foretage sådanne konverteringer?
Avatar billede Slettet bruger
30. marts 2004 - 17:07 #8
Du kan bruge

select replace ( felt1, '1_u', '7' )
from tabel1;
Avatar billede keysersoze Guru
30. marts 2004 - 17:13 #9
hmm - sidder lige og leger med det... det starter fint nok SQLplus op men den kommer med en ORA-12560: TNS:Protikoladaptor-fejl og derefter spørger den om brugernavn og password selvom jeg har ændret dette i bat-filen?
Avatar billede Slettet bruger
30. marts 2004 - 23:59 #10
Sidder du på Oracle-serveren? Har du startet databasen? Har du startet Oracle-listener?

Så kan du ...

1. Sætte ORACLE_SID:
  'SET ORACLE_SID=<sid>'
og derpå kalde SQL*PLUS

eller

2. angive navn på Service i SQL*Plus-kald:
  'sqlplus system/manager@tnsname @danXML.sql'

Du kan finde SID ved at gå ind i Tjenester (services) og finde tjenesten OracleService<sid> (den skal jo så også lige være startet).

Du kan finde tnsname ved at finde %ORACLE_HOME%\network\admin\tnsnames.ora-filen og finde den entry, der matcher din SID.

Du kan checke om der er hul igennem ved at køre 'tnsping'
Avatar billede Slettet bruger
31. marts 2004 - 06:48 #11
Forresten:

Du skal nok have en linie med

  SET HEADING OFF

øverst i din sql.
Avatar billede keysersoze Guru
31. marts 2004 - 11:47 #12
Så - nu får jeg lavet min fil... måtte dog lige lave lidt ændringer og tilføjelser for at alt kørte som det skulle :)

Jeg har dog ét problem - og det er at der i bunden skrives "XXX rækker er valgt." og det skal den jo helst ikke?
Avatar billede Slettet bruger
31. marts 2004 - 17:39 #13
Tilføj en linie

SET FEEDBACK OFF

Hvad var grunden til dit ORA-12560 problem?
Avatar billede keysersoze Guru
31. marts 2004 - 17:53 #14
Har fornyligt gået fra version 8 til 9 - og den sammenhæng skiftede vi også navnet på SID... det havde jeg bare glemt :)

Alt ser ud til at køre perfekt nu - så du har gjort alt hvad der er svaret på og lidt til og det er jo dejligt :)

Der er dog lang vej endnu, for dette var en simpel XML og derudover er der problemer med en for lang "nedetid" idet en gammel XML-fil overskrives med nye data etc... men dem må jeg tage hen ad vejen. Du skal i hvert fald have stor tak!

er du forresten på MSN eller ICQ?
Avatar billede Slettet bruger
31. marts 2004 - 18:05 #15
Rart at det lykkedes.

Og nej, desværre, jeg er ikke på msn eller ICQ.
Avatar billede keysersoze Guru
02. april 2004 - 16:59 #16
jeg lægger lige lidt ekstra point i inden jeg lukker...

og med det samme en sidste ting;

Når jeg henter data ud fra et varchar2 felt så kan den maks skrive 80 tegn pr. linie i XML-filen. Er der så flere tegn i mit varchar2-felt deler den teksten op i flere linier og det gør, at når jeg kigger på xml-filen så laver den et ekstra mellem der hvor der er linieskift og de ekstra linieskift kan være midt inde i et ord og det ser jo ikke så godt ud...

Kan man på nogen måde sætte en ubegrænset længde på linierne?
Avatar billede keysersoze Guru
02. april 2004 - 17:03 #17
nå - jeg kan vist ikke forhøje point-tal som i "gamle" dag... så det bliver til et nyt spm. lidt senere :)
Avatar billede Slettet bruger
03. april 2004 - 17:49 #18
Du kan bruge

SET LONG 500

hvis SQL*Plus først skal wrappe ved 500 karakterer på en linie.

Du kan bruge

SET TRIMSPOOL ON

til at undgå at SQL*Plus tilføjer blanke tegn (padder dine linier til længde 80)

Brug

SET PAGESIZE 0

til at undgå pauser, breaks, titler og alt andet.

Muligvis skal du bruge

SET WRAP OFF

for helt at undgå linieskift.

SET WRAP OFF
Avatar billede keysersoze Guru
06. april 2004 - 10:06 #19
nu har jeg prøvet med det hele - men ingen af tingene hjælper :(

bruger jeg SET WRAP OFF kommer der dog en synlig effekt, men så får jeg et XML-dokument der er totalt uoverskueligt så den kan jeg ikke bruge :o/

andre idéer?
Avatar billede keysersoze Guru
06. april 2004 - 15:06 #20
SET LINESIZE 4000
SET TERMOUT OFF

Så er det vist løst 100% :)
Avatar billede keysersoze Guru
09. april 2004 - 00:30 #21
http://www.eksperten.dk/spm/487441

Jeg er vanvittig glad for din hjælp - håber du kan stå til rådighed hvis jeg senere støder ind i problemer vedrørende Oracle/SQLplus :oD
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
Computerworld tilbyder specialiserede kurser i database-management

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