Import danych z XML

CY
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:24
0

Witam,

stworzyłem xml w którym mam 10 rekordów.
Gdy odpalę:

Kopiuj
-- Tworzenie tabeli KONTA_AD

create table KONTA_AD (
	nr number(3),
	imie varchar2(15),
	nazwisko varchar2(30),
	login varchar2(30),
	typ varchar2(30),
	dzial varchar2(30),
	email varchar2(30),
	data_nadania date,
	nr_upowaznienia varchar2(13)
	);

-- Import danych z pliku XML (import.xml)

DECLARE
pliczek xmltype := xmltype( bfilename('PLIKI_XML','import.xml'), nls_charset_id('AL32UTF8') );
z_nr number(3);	
z_imie varchar2(15);
	z_nazwisko varchar2(30);
	z_login varchar2(30);
	z_typ varchar2(30);
	z_dzial varchar2(30);
	z_email varchar2(30);
	z_data_nadania date;
	z_nr_upowaznienia varchar2(13);
BEGIN
 select zrodlo.nr into z_nr
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns nr varchar2(15) path 'nr'
 ) zrodlo;
 select zrodlo.imie into z_imie
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns imie varchar2(15) path 'imie'
 ) zrodlo;
 select zrodlo.nazwisko into z_nazwisko
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns nazwisko varchar2(30) path 'nazwisko'
 ) zrodlo;
select zrodlo.login into z_login
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns login varchar2(30) path 'login'
 ) zrodlo;
select zrodlo.typ into z_typ
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns typ varchar2(30) path 'typ'
 ) zrodlo;
select zrodlo.dzial into z_dzial
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns dzial varchar2(30) path 'dzial'
 ) zrodlo;
select zrodlo.email into z_email
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns email varchar2(30) path 'email'
 ) zrodlo;
select zrodlo.data_nadania into z_data_nadania
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns data_nadania varchar2(30) path 'data_nadania'
 ) zrodlo;
select zrodlo.nr_upowaznienia into z_nr_upowaznienia
 from xmltable(
  '/KONTA_AD/user'
  passing pliczek
  columns nr_upowaznienia varchar2(30) path 'nr_upowaznienia'
 ) zrodlo;
   insert into KONTA_AD (nr,imie,nazwisko,login,typ,dzial,email,data_nadania,nr_upowaznienia)
  values (z_nr,z_imie,z_nazwisko,z_login,z_typ,z_dzial,z_email,z_data_nadania,z_nr_upowaznienia);
END;

otrzymuje bład:
Error report:
ORA-01422: dokładne pobranie zwraca większą liczbę wierszy niż zamówiono
ORA-06512: przy linia 13
01422. 00000 - "exact fetch returns more than requested number of rows"
*Cause: The number specified in exact fetch is less than the rows returned.
*Action: Rewrite the query or change number of rows requested

Jeśli w pliku XML z którego importuje jest tylko jeden rekord to dane importują się.
Linia 13 to:

Kopiuj
select zrodlo.nr into z_nr
edytowany 1x, ostatnio: cybernetykpl
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

no ale dziwi Cię to? Przecież próbujesz wczytać wszystkie wartości z pola np. /KONTA_AD/user/nr do jednej zmiennej. Masz to po prostu źle napisane. Tu masz przykład: https://community.oracle.com/thread/2182669 lub http://www.gokhanatil.com/2016/08/how-to-import-data-to-oracle-rdbms-from-xml.html


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
CY
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:24
0

Zmieniłem na:

Kopiuj
BEGIN

INSERT INTO KONTA_AD (nr,imie,nazwisko,login,typ,dzial,email,data_nadania,nr_upowaznienia)

WITH t AS (SELECT xmltype(bfilename('PLIKI_XML','import.xml'), nls_charset_id('AL32UTF8')) xmlcol FROM dual)

SELECT
extractValue(value(x),'/KONTA_AD/user') nr,
extractValue(value(x),'/KONTA_AD/user') imie,
extractValue(value(x),'/KONTA_AD/user') nazwisko,
extractValue(value(x),'/KONTA_AD/user') login,
extractValue(value(x),'/KONTA_AD/user') typ,
extractValue(value(x),'/KONTA_AD/user') dzial,
extractValue(value(x),'/KONTA_AD/user') email,
extractValue(value(x),'/KONTA_AD/user') data_nadania,
extractValue(value(x),'/KONTA_AD/user') nr_upowaznienia
FROM t,TABLE(XMLSequence(extract(t.xmlcol,'/KONTA_AD/user'))) x;
END;

ale wstawia we wszystkie pola null.

Nazwa tabeli do której importuje to KONTA_AD, a plik z którego importuje to import.xml

edytowany 2x, ostatnio: cybernetykpl
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

nie możesz zrobić tak jak w linku, który Ci podałem?

Kopiuj
select x1.status_code, 
        x1.status_remarks,
        x2.segment_number, 
        x2.remarks
 from xmltable(
  '/ACCOUNT_HEADER_ACK/HEADER'
  passing acct_doc
  columns header_no      for ordinality,
          status_code    number        path 'STATUS_CODE',
          status_remarks varchar2(100) path 'STATUS_REMARKS'
 )

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
CY
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:24
0
Kopiuj
DECLARE

 acct_doc xmltype := xmltype( bfilename('KONTA_AD','import.xml'), nls_charset_id('AL32UTF8') );

BEGIN

 insert into xxrp_acct_details (nr,imie,nazwisko,login,typ,dzial,email,data_nadania,nr_upowaznienia)
 select x1.nr 
        x1.imie,
        x2.nazwisko, 
        x2.login,
x3. typ,
x3.dzial,
x4.email,
x4.data_nadania,
x5.nr_upowaznienia
 from xmltable(
  '/KONTA_AD/user'
  passing acct_doc
  columns header_no      for ordinality,
          nr    number        path 'nr',
          imie varchar2(20) path 'imie',
          nazwisko varchar2(30) path 'nazwisko',
          login varchar2(30) path 'login',
          typ varchar2(20) path 'typ',
          dzial varchar2(20) path 'dzial',
          data_nadania varchar2(20) path 'data_nadania',
          nr_upowaznienia varchar2(20) path 'nr_upowaznienia'
 ) x1,
 xmltable(
  '$d/KONTA_AD/user[$hn]/DETAIL'
  passing acct_doc as "d",
          x1.header_no as "hn"
  columns nr number        path 'nr',
          imie        varchar2(100) path 'imie'
 ) x2
 ;


Zanim dopisze kolejen pola to czy ok?

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

no nie dobrze:

  1. masz tabele x3, x4, x5? Pole login masz w tabeli x2 czy x1?
  2. w pierwszym poście nic nie było o /KONTA_AD/user[$hn]/DETAIL pewny jesteś, że też ma być?
    Generalnie widać, że nie bardzo wiesz co robisz. Przecież to
Kopiuj
select x1.nr 
        x1.imie,
        x2.nazwisko, 
        x2.login,
x3. typ,
x3.dzial,
x4.email,
x4.data_nadania,
x5.nr_upowaznienia
 from xmltable(
  '/KONTA_AD/user'
  passing acct_doc
  columns header_no      for ordinality,
          nr    number        path 'nr',
          imie varchar2(20) path 'imie',
          nazwisko varchar2(30) path 'nazwisko',
          login varchar2(30) path 'login',
          typ varchar2(20) path 'typ',
          dzial varchar2(20) path 'dzial',
          data_nadania varchar2(20) path 'data_nadania',
          nr_upowaznienia varchar2(20) path 'nr_upowaznienia'
 ) x1

jest najnormalniejszy w świecie select tylko nie z tabeli a z XMLa. A reszta to już nic innego jak insert z selecta. To są przecież podstawy (poza znalezieniem jak zrobić select z XMLa a nie z tabeli ale to masz)


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
CY
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:24
0

Poradziłem sobie już z importem i eksportem, ale mam dwa problemy:

  1. Przy eksporcie do pliku używam:
Kopiuj
spool /home/oracle/Desktop/PLIKI_XML/test.xml;

które umieszczone jest przed select... i wtedy do pliku oprócz wyniku wrzuca mi treść zapytania select.

Treść select:

Kopiuj
SELECT XMLELEMENT ("USER",
                   XMLELEMENT ("IMIE", IMIE),
                   XMLELEMENT ("NAZWISKO", NAZWISKO),
                   XMLELEMENT ("DZIAL", DZIAL),
		   XMLELEMENT ("LOGIN", LOGIN),
                   XMLELEMENT ("TYP", TYP),
  		   XMLELEMENT ("EMAIL", EMAIL),
		   XMLELEMENT ("DATA_NADANIA", DATA_NADANIA),
XMLELEMENT ("DATA_COFNIECIA", DATA_COFNIECIA)
) AS KONTA_AD
FROM KONTA_AD JOIN UPOWAZNIENIA ON
(KONTA_AD.NR_UPOWAZNIENIA=UPOWAZNIENIA.NR_UPOWAZNIENIA)
WHERE TYP='UZYTKOWNIK DOMENY'
ORDER BY NAZWISKO;
  1. W pliku brak
Kopiuj
<?xml version="1.0" ?>

reszta jest OK

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)