ОШИБКА при обработке XML в запросе Oracle - PullRequest
0 голосов
/ 18 июня 2020

Эта проблема связана с другой проблемой, которую я опубликовал вчера oracle процедура для перечисления имен таблиц и соответствующего количества

Я получаю сообщение об ошибке XML при выполнении запроса ниже :

CREATE OR REPLACE VIEW V_CHECK_RECORDS_BUL AS
SELECT TABLE_NAME,
       case 
       when S.TABLE_NAME_BUL in ('GD_MSTR_FLAT_CLAIM_POL','GD_MSTR_ERROR') then
       TO_NUMBER(
           EXTRACTVALUE( XMLTYPE(
                   DBMS_XMLGEN.GETXML('select count(*) c from ' || U.TABLE_NAME ||'where oe_name="BUL"')
               ), '/ROWSET/ROW/C')) 
        else
       TO_NUMBER(
           EXTRACTVALUE( XMLTYPE(
                   DBMS_XMLGEN.GETXML('select count(*) c from ' || U.TABLE_NAME)
               ), '/ROWSET/ROW/C')) 
        end as
        NUM_ROWS
  FROM USER_TABLES U JOIN GD_TABLE_ORDER S ON S.TABLE_NAME_BUL = U.TABLE_NAME  order by S.order_id;

ОШИБКА:

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

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

1 Ответ

0 голосов
/ 18 июня 2020

Ошибка связана с отсутствием пробела во внутреннем запросе; но ваши цитаты тоже неверны; это:

U.TABLE_NAME ||'where oe_name="BUL"')

должно быть

U.TABLE_NAME ||' where oe_name=''BUL''')
----------------^

Если у вас есть строковый литерал, содержащий одинарную кавычку, вам нужно экранировать это с помощью другой одиночной кавычки; две одинарные кавычки ('') не то же самое, что одна двойная кавычка (").

Кроме того, extractvalue устарел. Вместо этого вы можете сделать то же самое с xmlquery:

TO_NUMBER(
  XMLQUERY(
    '/ROWSET/ROW/C/text()'
    PASSING XMLTYPE(
      DBMS_XMLGEN.GETXML(
        'select count(*) c from "' || U.TABLE_NAME || '" where oe_name=''BUL'''
      )
    )
    RETURNING CONTENT
  )
)

Я обычно использую двойные кавычки вокруг имен объектов для такого рода вещей на тот случай, если когда-нибудь придется иметь дело со смешанным регистром (кавычки) идентификаторы.

Таким образом, вместе получается:

create or replace view v_check_records_bul as
select table_name,
       case 
       when s.table_name_bul in ('GD_MSTR_FLAT_CLAIM_POL','GD_MSTR_ERROR') then
         to_number(
           xmlquery(
             '/ROWSET/ROW/C/text()'
             passing xmltype(
               dbms_xmlgen.getxml(
                 'select count(*) c from "' || u.table_name || '" where oe_name=''BUL'''
               )
             )
             returning content
           )
         )
       else
         to_number(
           xmlquery(
             '/ROWSET/ROW/C/text()'
             passing xmltype(
               dbms_xmlgen.getxml(
                 'select count(*) c from "' || u.table_name || '"'
               )
             )
             returning content
           )
         )
       end as num_rows
from user_tables u
join gd_table_order s on s.table_name_bul = u.table_name;

Я пропустил предложение order by, поскольку оно действительно относится к запросам к представлению, а не как часть определение представления - хотя вам придется включить его в качестве столбца в представление, если вы хотите использовать его для последующего заказа.

db <> fiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...