Ошибка связана с отсутствием пробела во внутреннем запросе; но ваши цитаты тоже неверны; это:
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