powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PL/SQL и XML
14 сообщений из 14, страница 1 из 1
PL/SQL и XML
    #40052186
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
У меня есть XML файл:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
<?xml version="1.0" encoding="UTF-8"?>

<INSURANCE>

  <CAR>

    <ID>1</ID>

    <LAST_NAME>Вася</LAST_NAME>

    <FIRST_NAME>Пупкин</FIRST_NAME>

    <PERSON_AGE>40</PERSON_AGE>

    <CAR_CLASS>D</CAR_CLASS>

    <CAR_NUMBER>DDD445588Z</CAR_NUMBER>

    <INSURANCE_PRICE>9000.0</INSURANCE_PRICE>

    <START_DATE>2021-03-09</START_DATE>

    <END_DATE>2022-03-09</END_DATE>

  </CAR>

  <CAR>

    <ID>2</ID>

    <LAST_NAME>Роман</LAST_NAME>

    <FIRST_NAME>Иванов</FIRST_NAME>

    <PERSON_AGE>21</PERSON_AGE>

    <CAR_CLASS>F</CAR_CLASS>

    <CAR_NUMBER>444UUU03</CAR_NUMBER>

    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>

    <START_DATE>2021-03-09</START_DATE>

    <END_DATE>2022-03-09</END_DATE>

  </CAR>
</INSURANCE>



Я его импортировал в БД Oracle с помощью кода (не уверен насколько правильный код):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table XML_LD(ID NUMBER,
                    FILE_PATH VARCHAR2(200 BYTE),
                    FILE_NAME VARCHAR2(40 BYTE),
                    FILE_DT DATE,
                    FILE_TYPE VARCHAR2(40 BYTE),
                    CREATED_DT TIMESTAMP(6),
                    LAST_UPDATED_DT TIMESTAMP(6),
                    DOC xmltype)
                    XMLTYPE DOC  STORE AS SECUREFILE CLOB;
                    
                    INSERT INTO XML_LD VALUES( 1,
                                       'C:\Workspace\ExportToXML',
                                        'export.xml',
                                        SYSDATE,
                                        'xml',
                                        SYSDATE,
                                        SYSDATE,
                                        XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
                                    <Map>
                                    <Object uri="x-wc://e29f9e65f5ad7794:wt.part.WHOMaster:PROG1" metaFilePath="hrcy.xml.meta" contentPath="hrcy.xml"/>
                                   </Map>'));



Теперь пытаюсь прочесть export.xml из таблицы XML_LD:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT EXTRACTVALUE (VALUE (abc),
                 '/@ID')
      xml_id,
   EXTRACTVALUE (VALUE (abc),
                 '/@FIRST_NAME')
      FIRST_NAME,
   EXTRACTVALUE (VALUE (abc),
                 '/@LAST_NAME')
      LAST_NAME
 FROM XML_LD,
   TABLE (
      XMLSEQUENCE (
         EXTRACT (
            DOC,
            '/INSURANCE/CAR'))) abc
 WHERE file_name = 'export.xml';


Но запрос ничего не возвращает.
Не могли бы помочь с кодами? Где и что я не так делаю?
Спасибо большое.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052189
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конечном итоге мне нужно импортировать данные из XML в таблицу from_xml_table и должно получиться:

Код: plsql
1.
2.
3.
4.
5.
SELECT * FROM from_xml_table;

ID | FIRST_NAME | LAST NAME
1     Вася    Пупкин
2     Роман  Иванов
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052343
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
WITH SAMPLE AS (
                SELECT XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<INSURANCE>
  <CAR>
    <ID>1</ID>
    <LAST_NAME>Vasya</LAST_NAME>
    <FIRST_NAME>Pupkin</FIRST_NAME>
    <PERSON_AGE>40</PERSON_AGE>
    <CAR_CLASS>D</CAR_CLASS>
    <CAR_NUMBER>DDD445588Z</CAR_NUMBER>
    <INSURANCE_PRICE>9000.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>2</ID>
    <LAST_NAME>Roman</LAST_NAME>
    <FIRST_NAME>Ivanov</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
</INSURANCE>') XMLDOC FROM DUAL
)
SELECT  X.*
  FROM  SAMPLE,
        XMLTABLE(
                 '/INSURANCE/CAR'
                 PASSING XMLDOC
                 COLUMNS
                   FIRST_NAME VARCHAR2(10) PATH 'FIRST_NAME',
                   LAST_NAME  VARCHAR2(10) PATH 'LAST_NAME'
                ) X
/

FIRST_NAME LAST_NAME
---------- ----------
Pupkin     Vasya
Ivanov     Roman

SQL>



SY.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052357
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

А что если xml файл динамичный и данные каждый раз меняются?
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052358
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

А что если xml файл динамичный и данные каждый раз меняются?


Данные или структура (XSD)?

SY.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052359
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

Т.е не всегда две секции
<CAR></CAR>
<CAR></CAR>
Каждый раз меняется.. Их может быть 50 иногда 30 иногда 100.
Тогда код ниже не подходит:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
WITH SAMPLE AS (
                SELECT XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<INSURANCE>
  <CAR>
    <ID>1</ID>
    <LAST_NAME>Vasya</LAST_NAME>
    <FIRST_NAME>Pupkin</FIRST_NAME>
    <PERSON_AGE>40</PERSON_AGE>
    <CAR_CLASS>D</CAR_CLASS>
    <CAR_NUMBER>DDD445588Z</CAR_NUMBER>
    <INSURANCE_PRICE>9000.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>2</ID>
    <LAST_NAME>Roman</LAST_NAME>
    <FIRST_NAME>Ivanov</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
</INSURANCE>') XMLDOC FROM DUAL
)
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052361
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

Т. е:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
WITH SAMPLE AS (
                SELECT XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<INSURANCE>
  <CAR>
    <ID>1</ID>
    <LAST_NAME>Vasya</LAST_NAME>
    <FIRST_NAME>Pupkin</FIRST_NAME>
    <PERSON_AGE>40</PERSON_AGE>
    <CAR_CLASS>D</CAR_CLASS>
    <CAR_NUMBER>DDD445588Z</CAR_NUMBER>
    <INSURANCE_PRICE>9000.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>2</ID>
    <LAST_NAME>Roman</LAST_NAME>
    <FIRST_NAME>Ivanov</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
..... 
..... 
<CAR>
    <ID>100</ID>
    <LAST_NAME>Jim</LAST_NAME>
    <FIRST_NAME>Jackson</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
</INSURANCE>') XMLDOC FROM DUAL
)


XML файл внешний, лежит на диске, мне надо его прочитать, парсить и положить в таблицу со столбцами
Id, first_name, last_name, age, insurance_price, start_date, end_date
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052367
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

XML файл внешний, лежит на диске, мне надо его прочитать, парсить и положить в таблицу со столбцами
Id, first_name, last_name, age, insurance_price, start_date, end_date


На диске где? На клиенте или на самой базе?

SY.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052371
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid
LiQuid,

Т.е не всегда две секции


Ты слово sample поищи в словаре. SELECTу который я привел побоку сколько тегов CAR в XML:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
WITH SAMPLE AS (
                SELECT XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<INSURANCE>
  <CAR>
    <ID>1</ID>
    <LAST_NAME>Vasya</LAST_NAME>
    <FIRST_NAME>Pupkin</FIRST_NAME>
    <PERSON_AGE>40</PERSON_AGE>
    <CAR_CLASS>D</CAR_CLASS>
    <CAR_NUMBER>DDD445588Z</CAR_NUMBER>
    <INSURANCE_PRICE>9000.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>2</ID>
    <LAST_NAME>Roman</LAST_NAME>
    <FIRST_NAME>Ivanov</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>100</ID>
    <LAST_NAME>Jim</LAST_NAME>
    <FIRST_NAME>Jackson</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <LAST_NAME>LiQuid</LAST_NAME>
    <FIRST_NAME>Brain</FIRST_NAME>
  </CAR>
</INSURANCE>') XMLDOC FROM DUAL
)
SELECT  X.*
  FROM  SAMPLE,
        XMLTABLE(
                 '/INSURANCE/CAR'
                 PASSING XMLDOC
                 COLUMNS
                   FIRST_NAME VARCHAR2(10) PATH 'FIRST_NAME',
                   LAST_NAME  VARCHAR2(10) PATH 'LAST_NAME'
                ) X
/

FIRST_NAME LAST_NAME
---------- ----------
Pupkin     Vasya
Ivanov     Roman
Jackson    Jim
Brain      LiQuid

SQL>



SY.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052381
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
На жестком диске, где установлен Oracle.
C:\XML folder\export.xml

Если явно указать в коде:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
WITH SAMPLE AS (
                SELECT XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<INSURANCE>
  <CAR>
    <ID>1</ID>
    <LAST_NAME>Vasya</LAST_NAME>
    <FIRST_NAME>Pupkin</FIRST_NAME>
    <PERSON_AGE>40</PERSON_AGE>
    <CAR_CLASS>D</CAR_CLASS>
    <CAR_NUMBER>DDD445588Z</CAR_NUMBER>
    <INSURANCE_PRICE>9000.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>2</ID>
    <LAST_NAME>Roman</LAST_NAME>
    <FIRST_NAME>Ivanov</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <ID>100</ID>
    <LAST_NAME>Jim</LAST_NAME>
    <FIRST_NAME>Jackson</FIRST_NAME>
    <PERSON_AGE>21</PERSON_AGE>
    <CAR_CLASS>F</CAR_CLASS>
    <CAR_NUMBER>444UUU03</CAR_NUMBER>
    <INSURANCE_PRICE>11500.0</INSURANCE_PRICE>
    <START_DATE>2021-03-09</START_DATE>
    <END_DATE>2022-03-09</END_DATE>
  </CAR>
  <CAR>
    <LAST_NAME>LiQuid</LAST_NAME>
    <FIRST_NAME>Brain</FIRST_NAME>
  </CAR>
</INSURANCE>') XMLDOC FROM DUAL
)
SELECT  X.*
  FROM  SAMPLE,
        XMLTABLE(
                 '/INSURANCE/CAR'
                 PASSING XMLDOC
                 COLUMNS
                   FIRST_NAME VARCHAR2(10) PATH 'FIRST_NAME',
                   LAST_NAME  VARCHAR2(10) PATH 'LAST_NAME'
                ) X



То да, а если файл лежит на диске С и код должен вычитать с файла и залить таблицу в БД данными?
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052391
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Так же подскажите пожалуйста, как правильно передать данные переменных FIRST_NAME, LAST_NAME в таблицу?
Ваш код вытаскивает данные через SELECT и я вижу их на консоли, мне нужно где то в коде добавить:
INSERT INTO xml_tmp VALUES (FIRST_NAME, LAST_NAME);
только не знаю где именно вставить INSERT.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052400
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid
SY,
На жестком диске, где установлен Oracle.
C:\XML folder\export.xml



Ну так создай external table:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE TBL_EXTERNAL
(
 XMLDOC CLOB
)
ORGANIZATION EXTERNAL
 ( TYPE ORACLE_LOADER
   DEFAULT DIRECTORY TEMP
   ACCESS PARAMETERS 
    ( RECORDS DELIMITED BY X'0' 
   FIELDS TERMINATED BY ',' 
   (
    XMLDOC CHAR(100000000)
   )  
     )
   LOCATION ('export.xml')
 )
REJECT LIMIT UNLIMITED
/



Теперь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
INSERT
  INTO FROM_XML_TABLE
  SELECT  X.*
    FROM  TBL_EXTERNAL,
          XMLTABLE(
                   '/INSURANCE/CAR'
                   PASSING XMLTYPE(XMLDOC)
                   COLUMNS
                     ID FOR ORDINALITY,
                     FIRST_NAME VARCHAR2(10) PATH 'FIRST_NAME',
                     LAST_NAME  VARCHAR2(10) PATH 'LAST_NAME'
                  ) X
/

4 rows created.

SQL> SELECT  *
  2    FROM  FROM_XML_TABLE
  3  /

        ID FIRST_NAME LAST_NAME
---------- ---------- ----------
         1 Pupkin     Vasya
         2 Ivanov     Roman
         3 Jackson    Jim
         4 Brain      LiQuid

SQL>



SY.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052407
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкидывает ошибку:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE TBL_EXTERNAL
(
 XMLDOC CLOB
)
ORGANIZATION EXTERNAL
 ( TYPE ORACLE_LOADER
   DEFAULT DIRECTORY TEMP
   ACCESS PARAMETERS 
    ( RECORDS DELIMITED BY X'0' 
   FIELDS TERMINATED BY ',' 
   (
    XMLDOC CHAR(100000000)
   )  
     )
   LOCATION ('C:\XML folder\export.xml')
 )
REJECT LIMIT UNLIMITED



Код: sql
1.
2.
3.
4.
5.
6.
Error report -
ORA-06564: object TEMP does not exist
06564. 00000 -  "object %s does not exist"
*Cause:    The named object could not be found.  Either it does not exist
           or you do not have permission to access it.
*Action:   Create the object or get permission to access it.


Я сижу в БД под System, с полными правами.
...
Рейтинг: 0 / 0
PL/SQL и XML
    #40052418
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
Спасибо Вам большое. Получилось:

Код: plsql
1.
CREATE OR REPLACE DIRECTORY TEMP AS 'C:\XML folder';
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PL/SQL и XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]