Подавление ошибок ORA-00942 в сценариях создания ddl

Скажем, вы создаете ddl для создания всех ваших таблиц базы данных и т. д. через Hibernate SchemaExport и т. д. Вы получаете сценарий, который начинается с операторов drop в начале. Не проблема, так как я этого хочу. Но запуск этого сценария приводит к куче ошибок ORA-00942, работающих в базе данных Oracle.

Поскольку на самом деле это не ошибки, если таблицы просто еще не существовали, я бы хотел, чтобы мой сценарий создания был безошибочным при выполнении, чтобы было легко определить, что (если таковые имеются) не удалось.

Каковы мои варианты? Я ДЕЙСТВИТЕЛЬНО хочу, чтобы операторы удаления генерировались, поскольку таблицы могут существовать, а могут и не существовать, но я не хочу, чтобы мне возвращались миллионы ORA, которые я должен проверять (чтобы определить, являются ли они реальными ошибками) только потому, что это невозможно. t уронить стол, который является совершенно новым.


person Manius    schedule 03.10.2010    source источник


Ответы (2)


Если вы получаете скрипт с операторами удаления, а Hibernate не сделает это за вас, оберните операторы DROP TABLE в IF, чтобы проверить, существует ли таблица, прежде чем удалять ее:

IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;
person Community    schedule 03.10.2010
comment
Желательно, чтобы Hib сделал это за нас, но если предположить, что это невозможно, я могу попробовать написать что-нибудь, чтобы сделать это после генерации ddl. Тем не менее, я надеялся на более простой метод. :( +1 хотя бы за НЕКОТОРОЕ решение - person Manius; 03.10.2010
comment
@Crusader Создайте задачу Jira... и отправьте патч :) - person Pascal Thivent; 04.10.2010
comment
Думал об этом, но решил, что это, вероятно, не стоит проблем, учитывая, для чего я его использую. - person Manius; 04.10.2010
comment
прочитайте: meta.stackexchange.com/questions/66352/ - person NullUserException; 06.10.2010

«Скажем, вы создаете ddl для создания всех ваших таблиц базы данных и т. Д. Через Hibernate SchemaExport и т. Д. Вы получаете сценарий, который начинается с операторов drop в начале. Не проблема, поскольку я этого хочу. Ошибки -00942, работающие в базе данных Oracle."

В идеале мы должны правильно поддерживать нашу схему, используя передовые методы управления исходным кодом и конфигурацией. В этом сценарии мы заранее знаем, содержит ли схема, для которой мы запускаем наши сценарии, эти таблицы. Мы не получаем ошибок, потому что не пытаемся удалить несуществующие таблицы.

Однако не всегда это удается сделать. Один альтернативный подход состоит в том, чтобы иметь два сценария. В первом сценарии есть только операторы DROP TABLE, предваряемые дружественным

PROMPT  It is safe to ignore any ORA-00942 errors in the following statements

Второй сценарий содержит все операторы CREATE TABLE и начинается с

PROMPT  All the statements in this script should succeed.  So investigate any errors

Другой вариант — использовать словарь данных:

begin
    for r in ( select table_name from user_tables )
    loop
        execute immediate 'drop table '||r.table_name
                    ||' cascade constraints';
    end loop;
end;

Будьте осторожны с этим. Это ядерный вариант, и он удалит каждую таблицу в вашей схеме.

person APC    schedule 03.10.2010
comment
И вы можете предварить свой вопрос своими неявными требованиями и уровнем сложности проекта, чтобы люди, которые рассказывают вам (и те, кто придет после вас), как правильно разрабатывать решения, не были ошибочно приняты за снисходительные ослы. В качестве альтернативы научитесь использовать grep, особенно переключатель -v. - person Adam Musch; 04.10.2010
comment
Правильное замечание, но грубый ответ (который с тех пор, к счастью, был отредактирован) все равно полностью находится под контролем отвечающего. Также grep в Windows не вычисляет. Кажется, что «простого» ответа, на который я надеялся, не существует, так что, вероятно, эту проблему не стоит решать? - person Manius; 06.10.2010