ORA-31603 при генерации ddl для ограничений - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь сгенерировать ddl для ограничений. Фрагмент из запроса:

SELECT DBMS_METADATA.get_ddl ('CONSTRAINT', constraint_name, owner)
FROM   all_constraints
WHERE  owner      = UPPER('THEOWNER')
  AND    constraint_type IN ('U', 'P', 'R');

, но получаю это:

ORA-31603: object "EMPLOYEE_DEPNUM_FK" of type CONSTRAINT not found in schema "THEOWNER"
at "SYS.DBMS_METADATA", line 6069
ORA-06512: at "SYS.DBMS_METADATA", line 8666
ORA-06512: at line 1

Запуск сценария от имени системного пользователя. Также пробовал скрипт как THEOWNER:

SELECT DBMS_METADATA.get_ddl ('CONSTRAINT', 'EMPLOYEE_DEPNUM_FK') from dual;

Та же ошибка. Я могу сгенерировать ddl для таблиц, индексов, представлений и т. Д., Но для некоторых ограничений.

Следующий запрос показывает THEOWNER как владельца ограничения:

SELECT owner FROM all_constraints WHERE CONSTRAINT_NAME='EMPLOYEE_DEPNUM_FK';

Я могуКажется, нигде не найти исходный код для DBMS_METADATA.GET_DDL. Есть предложения?

1 Ответ

2 голосов
/ 29 октября 2019

Вы можете использовать:

SELECT DBMS_METADATA.get_ddl (CASE WHEN constraint_type = 'R' THEN 'REF_CONSTRAINT' ELSE 'CONSTRAINT' END, constraint_name, owner)
FROM   all_constraints
...

, поскольку ref-ограничения имеют описание другого типа.

...