2017-01-24 6 views
0

Я запускаю код, который должен анализировать xml и добавлять его в мою таблицу. XML-код загружается из переменной «s». Пример моего XML является:Oracle поднимает ORA-01722: неверный номер во время слияния с вложенным xmltable

<?xml version="1.0" encoding="utf-8"?><response> 
<item> 
    <id>7294478</id> 
    <type>ad</type> 
    <stats list="true"> 
    <period> 
    <day>2012-12-26</day> 
    <spent>132.00</spent> 
    <impressions>93315</impressions> 
    <clicks>4</clicks> 
    <reach>38039</reach> 
    </period> 
    <period> 
    <day>2012-12-27</day> 
    <impressions>7237</impressions> 
    <reach>4332</reach> 
    </period> 
    <period> 
    <day>2012-12-28</day> 
    <impressions>571</impressions> 
    <reach>452</reach> 
    </period> 
    </stats> 
</item> 
</response> 

Это часть кода я пытаюсь запустить:

MERGE INTO VK_AD_STATS r 
       USING (SELECT hmn.STATS_ID,     
          hmn.STATS_type,  
          items.STATS_day,  
          items.STATS_spent,    
          items.STATS_impressions, 
          items.STATS_clicks, 
          items.STATS_reach, 
          items.STATS_video_views, 
          items.STATS_video_views_half, 
          items.STATS_video_views_full,    
          items.STATS_video_clicks_site,   
          items.STATS_join_rate 
       FROM XMLTABLE('response/item' passing (SELECT xmltype(s) resp FROM dual) 
         COLUMNS STATS_ID NUMBER     path '/item/id', 
            STATS_type VARCHAR2(2000)   path '/item/type', 
            STATS_XML xmltype     path '/item/stats/period' 
           )hmn , 
         XMLTABLE('period' passing hmn.STATS_XML 
         COLUMNS  STATS_day VARCHAR2(2000) path '/period/day',  
            STATS_spent NUMBER path '/period/spent',    
            STATS_impressions NUMBER path '/period/impressions', 
            STATS_clicks NUMBER path '/period/clicks', 
            STATS_reach NUMBER path '/period/reach', 
            STATS_video_views NUMBER path '/period/video_views', 
            STATS_video_views_half NUMBER path '/period/video_views_half', 
            STATS_video_views_full NUMBER path '/period/video_views_full',    
            STATS_video_clicks_site NUMBER path '/period/_video_clicks_site ',   
            STATS_join_rate NUMBER path '/period/join_rate' 
           ) items) proc 
       ON (r.STATS_ID = proc.STATS_ID and r.STATS_day = proc.STATS_day) 
       WHEN MATCHED THEN UPDATE SET r.STATS_type = proc.STATS_type, 
              r.STATS_spent = proc.STATS_spent, 
              r.STATS_impressions = proc.STATS_impressions, 
              r.STATS_clicks = proc.STATS_clicks, 
              r.STATS_reach = proc.STATS_reach, 
              r.STATS_video_views = proc.STATS_video_views, 
              r.STATS_video_views_half = proc.STATS_video_views_half, 
              r.STATS_video_views_full = proc.STATS_video_views_full, 
              r.STATS_video_clicks_site = proc.STATS_video_clicks_site, 
              r.STATS_join_rate = proc.STATS_join_rate 
       WHEN NOT MATCHED THEN INSERT (r.STATS_ID, 
                r.STATS_type, 
                r.STATS_day, 
                r.STATS_spent, 
                r.STATS_impressions, 
                r.STATS_clicks, 
                r.STATS_reach, 
                r.STATS_video_views, 
                r.STATS_video_views_half, 
                r.STATS_video_views_full, 
                r.STATS_video_clicks_site, 
                r.STATS_join_rate 
               ) 
             VALUES (proc.STATS_ID, 
                proc.STATS_type, 
                proc.STATS_day, 
                proc.STATS_spent, 
                proc.STATS_impressions, 
                proc.STATS_clicks, 
                proc.STATS_reach, 
                proc.STATS_video_views, 
                proc.STATS_video_views_half, 
                proc.STATS_video_views_full, 
                proc.STATS_video_clicks_site, 
                proc.STATS_join_rate 
            ); 
       COMMIT;  

Но возникает ORA-01722: недопустимый номер

ответ

1

Ваша проблема не XML связаны вообще - это:

<spent>132.00</spent> 

не разобрать, как число, если ваши настройки NLS использовать ,, как десятичный разделитель.

Измените настройки NLS, чтобы использовать . как десятичный разделитель, например. запустив этот блок PL/SQL:

begin 
    DBMS_SESSION.SET_NLS ('NLS_LANGUAGE' ,'AMERICAN'); 
    DBMS_SESSION.SET_NLS ('NLS_TERRITORY','AMERICA'); 
end; 

и ваш код должен работать.

+0

ТНХ, можно получить проводит в VARCHAR и чем преобразовать его в число. Я не могу изменить настройки, потому что я не администратор на сервере. классический 'to_number (STATS_SPENT)' не работает – user3206705

+0

Вам не нужно, чтобы администратор менял настройки NLS (поскольку они предназначены только для вашей сессии, а не для всей БД). Во всяком случае, использование 'to_number' с' NLS_NUMERIC_CHARACTERS', предложенное MT0 в их ответе, возможно, проще. –

2

Извлечение отработанной колонки в виде текста, а затем преобразовать его с указанием NLS_NUMERIC_CHARCTERS использовать в качестве десятичного разделителя:

SELECT hmn.STATS_ID,    
     hmn.STATS_type, 
     items.STATS_day, 
     TO_NUMBER(
     items.STATS_spent, 
     '99999999999999999999D99', 
     'NLS_NUMERIC_CHARACTERS='',.''' 
     ) AS stats_spent, 
     items.STATS_impressions, 
     items.STATS_clicks, 
     items.STATS_reach, 
     items.STATS_video_views, 
     items.STATS_video_views_half, 
     items.STATS_video_views_full, 
     items.STATS_video_clicks_site, 
     items.STATS_join_rate 
FROM XMLTABLE(
     '/response/item' 
     PASSING XMLTYPE(s) 
     COLUMNS STATS_ID NUMBER   path '/item/id', 
       STATS_type VARCHAR2(2000) path '/item/type', 
       STATS_XML xmltype   path '/item/stats/period' 
     ) hmn, 
     XMLTABLE(
     '/period' 
     PASSING hmn.STATS_XML 
     COLUMNS STATS_day    VARCHAR2(2000) path '/period/day', 
       STATS_spent    VARCHAR2(23) path '/period/spent', 
       STATS_impressions  NUMBER path '/period/impressions', 
       STATS_clicks   NUMBER path '/period/clicks', 
       STATS_reach    NUMBER path '/period/reach', 
       STATS_video_views  NUMBER path '/period/video_views', 
       STATS_video_views_half NUMBER path '/period/video_views_half', 
       STATS_video_views_full NUMBER path '/period/video_views_full', 
       STATS_video_clicks_site NUMBER path '/period/_video_clicks_site', 
       STATS_join_rate   NUMBER path '/period/join_rate' 
       ) items 

 Смежные вопросы

  • Нет связанных вопросов^_^