Я запускаю код, который должен анализировать 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: недопустимый номер
ТНХ, можно получить проводит в VARCHAR и чем преобразовать его в число. Я не могу изменить настройки, потому что я не администратор на сервере. классический 'to_number (STATS_SPENT)' не работает – user3206705
Вам не нужно, чтобы администратор менял настройки NLS (поскольку они предназначены только для вашей сессии, а не для всей БД). Во всяком случае, использование 'to_number' с' NLS_NUMERIC_CHARACTERS', предложенное MT0 в их ответе, возможно, проще. –