Ora 19202 возникла ошибка при обработке xml

Electroflower

Shiningemerald

384 / 117 / 22

Регистрация: 05.01.2012

Сообщений: 951

1

07.02.2019, 12:40. Показов 7895. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день, ребят!
Задача простая как 2*2, но вот возникли трудности.
Нужно вытащить значение узла id_request.

Oracle 11 SQL
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
CREATE OR REPLACE PROCEDURE test_s
IS
 
     param clob;     
     id_request NUMBER;
     id_req VARCHAR2(10);
 
BEGIN    
 
   param := '<s:Envelope >
                <s:Body >
                    <SendRequestResponse>
                        <SendRequestResult>
                            <Code>200</Code>
                            <Text>OK</Text>
                            <id_request>35464962</id_request>
                            <size>0</size>
                        </SendRequestResult>
                    </SendRequestResponse>
                </s:Body>
            </s:Envelope>';
            
   IF param IS NOT NULL THEN     
 
      
     FOR c IN (SELECT COLUMN_VALUE AS x FROM TABLE(XMLSEQUENCE(XMLType(param).EXTRACT('s:Envelope/s:Body/SendRequestResult/id_request')))) LOOP
     id_req := c.x.EXTRACT('/id_request/text()').getStringVal();
     END LOOP;
       
    --вывод id_req
 
      END IF;
 
END;
/
 
ни в какую не берет значение, пишет следующую ошибку:
 
ORA-31011: сбой разбора XML
ORA-19202: Возникла ошибка при обработке XML 
LPX-00601: Invalid token IN: 's:Envelope/s:Body/SendRequestResult/id_request'



0



Anvano

340 / 236 / 113

Регистрация: 12.05.2016

Сообщений: 642

07.02.2019, 14:11

2

патамушта используете неймспейс , а он не описан у вас

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DECLARE
  l_xml  XMLTYPE;  
  l_req  NUMBER;
BEGIN
  l_xml  := XMLTYPE('<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
                <s:Body >
                    <SendRequestResponse>
                        <SendRequestResult>
                            <Code>200</Code>
                            <Text>OK</Text>
                            <id_request>35464962</id_request>
                            <size>0</size>
                        </SendRequestResult>
                    </SendRequestResponse>
                </s:Body>
            </s:Envelope>');
 
  l_req := l_xml.extract('//SendRequestResult/id_request/text()').getNUmberVal();
  
  dbms_output.put_line(l_req); 
 
END;



1



Shiningemerald

384 / 117 / 22

Регистрация: 05.01.2012

Сообщений: 951

07.02.2019, 14:37

 [ТС]

3

Anvano, неймспейсы у соапа были прописаны, почему-то сюда не вставились…
Ваш вариант тоже не работает



0



orion2014

93 / 71 / 33

Регистрация: 02.08.2015

Сообщений: 202

07.02.2019, 17:11

4

Здравствуйте!
А если так попробовать:

Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE
     r VARCHAR2(8);
     v_xml xmltype := xmltype('<?xml version="1.0"?>
                      <Head xmlns:s="http://www.library.com">
                       <s:Envelope>
                        <s:Body>
                         <SendRequestResponse>
                          <SendRequestResult>
                           <Code>200</Code>
                           <Text>OK</Text>
                           <id_request>35464962</id_request>
                           </SendRequestResult>
                          </SendRequestResponse>
                         </s:Body>
                        </s:Envelope></Head>');
BEGIN
   SELECT EXTRACTVALUE(VALUE(t), 'id_request') INTO r
   FROM TABLE(XMLSEQUENCE(v_xml.EXTRACT('Head/*:Envelope/*:Body/SendRequestResponse/SendRequestResult/id_request'))) t;
   dbms_output.put_line(r);
END;



1



Electroflower

Shiningemerald

384 / 117 / 22

Регистрация: 05.01.2012

Сообщений: 951

07.02.2019, 17:22

 [ТС]

5

Ребят, если кто знает как разобрать используя другие способы, то прошу помощи
Пробую еще вот так, но почему-то значение между тегами всегда NULL, что-то я неправильно делаю:

Oracle 11 SQL
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
CREATE OR REPLACE PROCEDURE test_s
IS
    num NUMBER;
    i_clob CLOB;
    msg_clob CLOB; 
    domdoc dbms_xmldom.DOMDocument;
    nlist DBMS_XMLDOM.DOMNODELIST;
    nlist2 DBMS_XMLDOM.DOMNODELIST;
    node dbms_xmldom.domnode;
    node_in dbms_xmldom.domnode;
    v_id_out NUMBER; 
    id_req NUMBER;
    node_name VARCHAR2(100);
    prsr dbms_xmlparser.Parser;
 
BEGIN      
       i_clob := '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
                    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <SendRequestResponse>
                            <SendRequestResult>
                                <Code>200</Code>
                                <Text>OK</Text>
                                <id_request>35464962</id_request>
                                <size>0</size>
                            </SendRequestResult>
                        </SendRequestResponse>
                    </s:Body>
                </s:Envelope>';                 
               
       -- Декодируем спец символы XML в сообщении SOAP
       msg_clob := DBMS_XMLGEN.CONVERT(i_clob, DBMS_XMLGEN.ENTITY_DECODE);     
       -- Преобразуем в домдокумент
       IF msg_clob IS NOT NULL AND dbms_lob.getlength(msg_clob)>0 THEN
       prsr := dbms_xmlparser.newParser;
       dbms_xmlparser.parseClob(prsr, msg_clob);
       domdoc := dbms_xmlparser.getDocument(prsr);
       dbms_xmlparser.freeParser(prsr);
       ELSE
       domdoc := dbms_xmldom.newDOMDocument;
       END IF;
       -- Считываем тег с текстом сообщения
       nlist := DBMS_XMLDOM.GETELEMENTSBYTAGNAME(domdoc, 'id_request');
       num := DBMS_XMLDOM.GETLENGTH(nlist);
       node := dbms_xmldom.item(nlist, 0);
       node_name := dbms_xmldom.getNodeName(node);
       id_req := dbms_xmldom.getNodeValue(node);
       
       
            
        IF msg_clob IS NOT NULL THEN    
     
      --тут вывод
           
   
      END IF;
 
END;
/



0



Anvano

340 / 236 / 113

Регистрация: 12.05.2016

Сообщений: 642

07.02.2019, 22:20

6

Лучший ответ Сообщение было отмечено Electroflower как решение

Решение

Цитата
Сообщение от Electroflower
Посмотреть сообщение

Ваш вариант тоже не работает

Версия Оракла какая? С этого, в принципе, надо было начать вообще.

Только что еще раз проверил свой вариант — всё прекрасно работает.

Непонятно, зачем городить огород из DBMS_XMLGEN если и обычный XMLTYPE прекрасно работает.
Вот ваш последний скрипт без тонны велосипедов:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DECLARE
    i_clob CLOB;
    l_xml  XMLTYPE;
    id_req NUMBER;
BEGIN      
     i_clob := '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
                  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                      <SendRequestResponse>
                          <SendRequestResult>
                              <Code>200</Code>
                              <Text>OK</Text>
                              <id_request>35464962</id_request>
                              <size>0</size>
                          </SendRequestResult>
                      </SendRequestResponse>
                  </s:Body>
              </s:Envelope>';                 
       
     l_xml := XMLTYPE(i_clob); 
       
     id_req := l_xml.extract('//SendRequestResult/id_request/text()').getNUmberVal();
               
     dbms_output.put_line('id_req='||id_req); 
END;

Выводит:

id_req=35464962

Т.е. всё прекрасно вытаскивается и работает.



1



Shiningemerald

384 / 117 / 22

Регистрация: 05.01.2012

Сообщений: 951

08.02.2019, 09:19

 [ТС]

7

Anvano, orion2014, спасибо вам, все работает, это просто моя невнимательность…



0



Electroflower

Shiningemerald

384 / 117 / 22

Регистрация: 05.01.2012

Сообщений: 951

11.02.2019, 09:37

 [ТС]

8

orion2014, Anvano, а еще такой вопрос хочется задать, может вы знаете
есть строчка

Oracle 11 SQL
1
l_xml := XMLTYPE(i_clob);

а если туда поместить большой CLOB, почему-то вылетает в исключение..



0



Anvano

340 / 236 / 113

Регистрация: 12.05.2016

Сообщений: 642

11.02.2019, 21:52

9

А что хоть за исключение? Вообще с большими clob обычно проблем нет, но есть ограничение у оракла не больше 64 килобайт на одну ноду в XML.

Поэтому если у вас XML вида

XML
1
2
3
4
5
<rowset>
    <row id="1">1</row>
    <row id="2">1</row>
    <row id="3">1</row>
</rowset>

и этих самых строк больше чем на 64 кб — то надо разбивать на куски, одним махом не получится засосать это в XMLTYPE

Хотя в какой-то из 11 версий вроде повысили лимит до 2 Гб



1



Shiningemerald

384 / 117 / 22

Регистрация: 05.01.2012

Сообщений: 951

12.02.2019, 09:05

 [ТС]

10

Anvano, видимо, дело вот в этом: XML Identifier Length Limit – Oracle XML DB supports only XML identifiers that are 4000 characters long
А у меня там под 2 000 000 символов…



0



340 / 236 / 113

Регистрация: 12.05.2016

Сообщений: 642

13.02.2019, 01:42

11

XML Identifier это не общая длина XML документа, а фактически «название одного тега» , т.е. название тега не может быть больше 4000 символов.

У вас прям теги называются по 200000 символов?
Так что написали бы лучше, текст ошибки, которую получаете.

Вряд-ли вы получили именно эту ошибку, либо XML совсем некорректный сформировали.



1



I am trying to use new APEX JSON APIs in my code and when I try to generate JSON with large data and nesting, I am getting error as stated in my question. I have tried following code

SET SERVEROUTPUT ON
DECLARE
   l_cursor SYS_REFCURSOR;
BEGIN

  OPEN l_cursor FOR
    SELECT K.KB_ID "KB_ID",
           K.TITLE "TITLE",
           K.CONTENT "CONTENT",
           K.KEYWORDS "KEYWORDS",
           CURSOR(SELECT F.FILE_ID AS "FILE_ID",
                         F.FILE_NAME AS "FILE_NAME",
                         F.FILE_URL AS "FILE_URL"
                  FROM MY_FILES F
                  WHERE F.TYPE_PK = K.KB_ID AND F.TYPE='ITV_KB') AS "Files"
    FROM ITV_KB_ML_V K
    WHERE K.ENABLED = 1;

 APEX_JSON.initialize_clob_output;

 APEX_JSON.open_object;
 APEX_JSON.write('KNOWLEDGE_DATA', l_cursor);
 APEX_JSON.close_object;

 DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output);
 APEX_JSON.free_output;
END;

I am getting error at APEX_JSON.write('KNOWLEDGE_DATA',l_cursor) and my CONTENT column has large data, if I comment CONTENT then it works fine. Please suggest what I can use to generate JSON with large data in ORACLE APEX.

Надо обернуть всю логику по разбору XML в функцию, которая обработает исключения и запишет полную информацию об ошибках, например, в таблицу. Как-то так:

create table parseErrors (guid raw (16), errm varchar2 (4000), created timestamp);

create or replace function myXmlParser (docGuid raw, doc clob) return varchar2 is
    procedure saveParseError (guid raw, errm varchar2) is 
    pragma autonomous_transaction;
    begin 
        insert into parseErrors values (guid, errm, systimestamp);
        commit;
    end ;
begin
    -- **здесь необходимая логика, в которой может возникнуть ошибка**
    return xmlType (doc).getStringVal (); 
exception when others then 
    saveParseError (docGuid, sqlerrm||chr(10)||sys.dbms_utility.format_error_backtrace());
    return 'errorneous';
end myXmlParser;
/

Выборка для теста (вместо sys_guid() должна быть колонка с GUID из запроса):

select myXmlParser (sys_guid(), '<row>some data</row>') from dual union all
select myXmlParser (sys_guid(), '</row>illegal XML syntax</row>') from dual
;

выведет:

RESULT    
------------------------
<row>some data</row>   
errorneous     

Kакие были ошибки:

set lines 999
col errm for a40 wrapp
select * from parseErrors;

GUID                             ERRM                                     CREATED                     
-------------------------------- ---------------------------------------- -----------------------------
7106268B980F02D3E0530A01A8C04FBB ORA-31011: XML parsing failed            2018-07-15 12:32:41,204757000
                                 ORA-06512: at "SYS.XMLTYPE", line 272                                 
                                 ORA-06512: at "DB.MYXMLPARSER", line 10                               

PS В вопросе мало информации по локализации причины ошибки, но думаю ссылки на похожие топики тут и тут будут полезны.

Пожалуйста, мне нужна помощь в извлечении данных из сложного XML в строки в оракуле. я попробовал извлечь значение, но он дает ошибку:

Ошибка синтаксического анализа xml ora-31011

Ошибка ora-19202 при обработке xml

под выходным xml:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <s:Body>
      <GetEmploymentStatusMultipleResponse xmlns="http://MSB.Services.Integration.External.ServicesContracts.GOSI.IGOSIService">
         <GetEmploymentStatusMultipleResult xmlns:b="http://MSB.Services.Integration.External.DataContracts.GOSI.MultipleEmploymentStatusStructure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <b:EmploymentStatusStructure xmlns:c="http://MSB.Services.Integration.External.DataContracts.GOSI.EmploymentStatusStructure">
               <c:EmploymentStatusStructure>
                  <c:Contributor xmlns:d="http://MSB.Services.Integration.External.DataContracts.GOSI.ContributorStructure">
                     <d:ContributorID xmlns:e="http://MSB.Services.Integration.External.DataContracts.GOSI.NationalIdentifierSummaryStructure">
                        <e:NationalID>1086828181</e:NationalID>
                     </d:ContributorID>
                  </c:Contributor>
                  <c:ContributorName xmlns:d="http://MSB.Services.Integration.External.DataContracts.GOSI.PersonNameDetailsStructure">
                     <d:Item xmlns:e="http://MSB.Services.Integration.External.DataContracts.GOSI.PersonNameBodyStructure">
                        <e:Title i:nil="true" xmlns:f="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
                        <e:Prefix i:nil="true" xmlns:f="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
                        <e:FirstName>test1</e:FirstName>
                        <e:SecondName>test2</e:SecondName>
                        <e:ThirdName>test3</e:ThirdName>
                        <e:FourthName i:nil="true"/>
                        <e:LastName>test4</e:LastName>
                        <e:Suffix i:nil="true" xmlns:f="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
                     </d:Item>
                     <d:Language>AR</d:Language>
                  </c:ContributorName>
                  <c:ContributorStatus>2</c:ContributorStatus>
               </c:EmploymentStatusStructure>
            </b:EmploymentStatusStructure>
         </GetEmploymentStatusMultipleResult>
      </GetEmploymentStatusMultipleResponse>
   </s:Body>
 </s:Envelope>

#oracle #plsql

#Oracle #plsql

Вопрос:

Привет, я пытаюсь выполнить этот запрос, но получаю эту ошибку

Запрос 1

 select OWNER,table_name, 
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||owner||'.'||table_name)),'/ROWSET/ROW/C')) as count
from all_tables
 

Работает нормально

Запрос 2 — Включены дополнительные столбцы (sample_size, last_analyzed)

 select OWNER,table_name, 
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||owner||'.'||table_name)),'/ROWSET/ROW/C')) as count,
       sample_size, last_analyzed 
from all_tables
 

Ошибка — ?

 ORA-19202: Error occurred in XML processing
ORA-00933: SQL command not properly ended
ORA-06512: at "SYS.DBMS_XMLGEN", line 176
ORA-06512: at line 1
19202. 00000 -  "Error occurred in XML processing%s"
*Cause:    An error occurred when processing the XML function
*Action:   Check the given error message and fix the appropriate problem
 

Запрос 2 — Проблема в чем может быть проблема?— Объяснение и разрешение

Комментарии:

1. Не используйте all_tables, поскольку он содержит все таблицы, на которые у вас есть права. Даже если вставить только прямо в таблицу. Таким образом, вы можете использовать таблицу метаданных для получения привилегий и найти таблицы, в которых у вашего пользователя есть select grants own tablea

2. @ Popeye итак, в какой таблице мне нужно искать?

3. from all_tables where Owner = you or you have select grant on table . USER_TAB_PRIVS

4. Проблема с привилегиями должна вызвать ORA-01031. Я думаю, что у вас есть имя таблицы со специальным символом в нем. Попробуйте select * from all_tables where regexp_instr(table_name, '[^[:alnum:]$_]')>0;

5. Альтернативно, запустите select 'select 1 from '||owner||'.'||table_name as q from all_tables , скопируйте / вставьте выходные данные и запустите его как скрипт, чтобы увидеть, какое имя таблицы вызывает проблему.

Понравилась статья? Поделить с друзьями:
  • Ora 12560 tns ошибка адаптера протокола как исправить
  • Ora 12546 tns permission denied ошибка
  • Ora 12545 ошибка
  • Ora 12537 ошибка
  • Ora 12535 ошибка