SELECT xt.*
FROM (
SELECT
XMLELEMENT("Employee", XMLATTRIBUTES(pl AS "ID", f1 AS "Name"),
XMLELEMENT("Salary", f2),
XMLELEMENT("Department", f2) ) AS xml_data
FROM
(
SELECT LEVEL AS pl, chr(LEVEL + 100) AS f1, LEVEL + 100 AS f2 FROM dual CONNECT BY LEVEL <= 10
)
) z, XMLTABLE('/Employee'
PASSING z.xml_data
COLUMNS
Salary VARCHAR2(10) PATH 'Salary',
Department VARCHAR2(100) PATH 'Department'
) xt;
Вот такая ошибка.
SQL Error [19114] [72000]: ORA-19114: error during parsing the XQuery expression:
ORA-06550: line 1, column 13:
PLS-00201: identifier 'SYS.DBMS_XQUERYINT' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
В чем проблема и как исправить. Благодарен за любые наводки.
Здравствуйте, Funny Rabbit, Вы писали:
Не спец по ораклу, но раз вы приветствуете прямо любые наводки, то:
Вы используете XMLTABLE и XMLELEMENT, которые внутри обращаются к встроенным пакетам Oracle для обработки XML/XQuery.
Конкретно пакет SYS.DBMS_XQUERYINT — это внутренний пакет Oracle, который обычно не виден пользователям напрямую.
Если вы видите ошибку must be declared, значит:
— либо не установлен/невалиден компонент XDB (Oracle XML DB),
— либо пользователь не имеет к нему доступа (нет прав на использование пакетов в схеме SYS)
Решения
1. Проверить наличие компонента XDB
Выполните:
SELECT comp_name, status, version
FROM dba_registry
WHERE comp_id = 'XDB';
Если status != VALID → нужно переустановить или починить XML DB.
Это делается через @?/rdbms/admin/catqm.sql (только админом).
2. Проверить доступ к пакетам
Как DBA, выполнить:
GRANT EXECUTE ON SYS.DBMS_XQUERYINT TO PUBLIC;
или конкретному пользователю:
GRANT EXECUTE ON SYS.DBMS_XQUERYINT TO <your_user>;
Обычно этот грант есть по умолчанию. Если он потерялся — это и вызывает ошибку.
3. Убедиться, что вы не в минимальной установке базы
Если компонент XDB отсутствует (нет записи в dba_registry), проще всего:
-- Под SYS
@?/rdbms/admin/catqm.sql xdbpassword SYSAUX TEMP
(где xdbpassword — пароль для пользователя XDB)