Oracle table exists exception



check if table exists

how to write this check in oracle:

if table X exists, select * from X else select ‘ table X does not exist’

Answers

I am getting SP2-0223 and SP2-0224

SQL> l_cnt PLS_INTEGER;
SP2-0223: No lines in SQL buffer.

SQL> l_cnt PLS_INTEGER;
SP2-0224: invalid starting line number

Justin has provided one method using pl/sql to deal with the situation but I want to know why you do not know if the tables you want to query against exist or not? What is the business problem?

If may be you can just use SQL against the rdbms dictionary: all_tables, all_views, etc . to generate the select * from . table_name in your list that do exist or you could generate queries against all tables owned by a specific username.

The following is not as nice as what Justin posted but might help you determine what you want to do.
HTH — Mark D Powell —
add code tags (Duh)

Edited by: MarkDPowell on Jun 2, 2009 2:08 PM

I need to display the output of the select when the table exists

user535296 wrote:
hi

I need to display the output of the select when the table exists

Well, I’m not quite sure what you are looking for, but if you fire a simple SELECT statement on SQL*Plus, that’ll return you all the expected rows if table exists, if the table does not exists then you’ll get a very understandable error message.

Just as an FYI, I also omitted the declaration of some_variable and some_collection since it wasn’t clear what the end goal was.

«I need to display the output of the select when the table exists»

I think we all understand that. The question is why wouldn’t the table exist? As a rule in Oracle you create a table once and it remains in existance untill the applicaiton no longer needs to use the table. Often this is the life of the application.

Why do you not know what tables exist?

Justin showed you the technique for dynamically generating the select statements.

I mentioned a method for generating the select statements based on your having a list of desired targets. No if test would be necessary since the script would only generate the select if the table existed. Then the generated script is ran spooling the resutls.

It is generally unnecessary to do what you are asking to do when working with Oracle which is why several posters have asked you why?

Источник

Database.Guide

Beginners

Categories

  • Azure SQL Edge (16)
  • Database Concepts (48)
  • Database Tools (70)
  • DBMS (8)
  • MariaDB (420)
  • Microsoft Access (17)
  • MongoDB (265)
  • MySQL (375)
  • NoSQL (7)
  • Oracle (296)
  • PostgreSQL (255)
  • Redis (183)
  • SQL (588)
  • SQL Server (887)
  • SQLite (235)

Oracle DROP TABLE IF EXISTS Alternatives

Oracle Database doesn’t include the IF EXISTS clause that some other DBMSs offer in their DROP TABLE statements. Therefore, if we want to avoid any nasty errors resulting from trying to drop a non-existent table, we need to do a bit of extra work.

Option 1: Check if the Table Exists

We can check the DBA_TABLES data dictionary view to see if the table exists. This view describes all relational tables in the database. Its columns are the same as those in ALL_TABLES .

We can check this table to see if the table exists, then only run the DROP TABLE statement if it does.

In this case, the table called t1 already existed and was dropped.

Читайте также:  Rmmod error module is in use

Now, if we run the same code again, we get the same output:

No error occurred, even though the table no longer exists.

However, if we simply try to drop the table without first checking for its existence, we get an error:

Option 2: Test for the Error

Another way to do it is to simply go ahead and run the DROP TABLE statement, and then catch any ORA-00942 error that occurs. Specifically, we catch any SQLCODE -942 error that occurs.

I ran that even though the T1 table didn’t exist. The ORA-00942 error was caught and handled so we didn’t get an error message.

If the table had already existed, the table would have been dropped, and we’d see the same output.

Источник

Оракул: если таблица существует

Я пишу несколько сценариев миграции для базы данных Oracle и надеялся, что у Oracle есть что-то похожее на MySQL. IF EXISTS построить.

В частности, всякий раз, когда я хочу удалить таблицу в MySQL, я делаю что-то вроде

Таким образом, если таблица не существует, DROP не выдает ошибки, и сценарий может продолжаться.

Есть ли у Oracle аналогичный механизм? Я понимаю, что могу использовать следующий запрос, чтобы проверить, существует ли таблица или нет

но синтаксис для связывания этого с DROP убегает от меня.

15 ответы

Лучший и наиболее эффективный способ — перехватить исключение «таблица не найдена»: это позволяет избежать накладных расходов на проверку того, существует ли таблица дважды; и не страдает от проблемы, заключающейся в том, что в случае сбоя DROP по какой-либо другой причине (которая может быть важна) исключение все равно вызывается для вызывающей стороны:

ДОПОЛНЕНИЕ Для справки, вот эквивалентные блоки для других типов объектов:

Ссылка на базу данных

И для удаления ПОЛЬЗОВАТЕЛЯ игнорируемый SQLCODE равен -1918. — Эндрю Свон

Нужно написать процедуру. Делать это? Нет лучшего способа сделать это? — Уилсон Фрейтас

Если я добавлю много EXECUTE IMMEDIATE ‘DROP TABLE mytable’; предложения (по одному для каждой таблицы в скрипте), должен ли я помещать один обработчик исключений для каждого из них, или этого достаточно, чтобы обернуть все предложения в одном BEGIN . EXCEPTION . END; блокировать? — глотать

@ jpmc26: эквивалент для MS SQL IF OBJECT_ID(‘TblName’) IS NOT NULL DROP TABLE TblName . Кажется, многословность языка SQL пропорциональна цене. — user565869

@JeffreyKemp: Ты бы так не подумал, но я снова и снова обнаруживал, что Oracle все усложняет. Когда вы тратите в среднем час на одну неясную синтаксическую ошибку или пытаетесь понять, как сделать что-то очевидное и простое в другой базе данных (например, условное удаление элемента), и подобные проблемы возникают ежедневно, это складывается. Быстрый. — jpmc26

Это для проверки, существует ли таблица в текущей схеме. Чтобы проверить, существует ли уже данная таблица в другой схеме, вам нужно будет использовать all_tables вместо user_tables и добавляем условие all_tables.owner = upper(‘schema_name’)

ответ дан 09 апр.

+1 Это лучше, потому что не следует использовать декодирование исключений, чтобы понять, что делать. Код будет легче поддерживать и понимать — Daitangio

Согласитесь с @daitangio — производительность обычно не превосходит ремонтопригодность со сценариями развертывания с однократным запуском. — мелкие

Мне было бы интересно понять, играет ли здесь роль неявная фиксация. Вы бы хотели, чтобы SELECT и DROP находились внутри одной транзакции. [Очевидно, игнорирование любого последующего DDL, который может быть выполнен. ] — Mathew

@Matthew, DROP — это команда DDL, поэтому сначала выполняется COMMIT, удаляется таблица, а затем выполняется 2-й COMMIT. Конечно, в этом примере нет транзакции (поскольку он только выдает запрос), поэтому это не имеет значения; но если пользователь ранее выдал некоторый DML, он будет неявно зафиксирован перед выполнением любого DDL. — Джеффри Кемп

Читайте также:  Магнитола pioneer amp error что это такое

Я искал то же самое, но в итоге написал процедуру, которая могла бы мне помочь:

Надеюсь это поможет

ответ дан 30 мая ’14, 19:05

После того, как я создал выше proc. delobject, я попытался вызвать его, выдав следующий SQL. Но не вышло. delobject (‘MyTable’, ‘ТАБЛИЦА’); Я получаю следующую ошибку ——————————— Ошибка при запуске со строки 1 в команде: delobject (‘MyTable ‘,’ ТАБЛИЦА ‘) Отчет об ошибке: Неизвестная команда — Шай

используйте команду EXECUTE — EXECUTE DelObject (‘MyTable’, ‘TABLE’); — идануда

просто хотел опубликовать полный код, который создаст таблицу и отбросит ее, если она уже существует, с использованием кода Джеффри (слава ему, а не мне!).

ответ дан 02 авг.

Лично я бы выделил CREATE TABLE на отдельном шаге, поскольку это не нужно делать динамически и не нужен обработчик исключений. — Джеффри Кемп

В SQL * PLUS вы также можете использовать команду WHENEVER SQLERROR:

Работы С Нами CONTINUE NONE сообщается об ошибке, но сценарий будет продолжен. С участием EXIT SQL.SQLCODE сценарий будет остановлен в случае ошибки.

ответ дан 14 апр.

Я предпочитаю экономичное решение

ответ дан 26 апр.

В oracle нет «DROP TABLE IF EXISTS», вам нужно будет выполнить оператор select.

попробуйте это (я не разбираюсь в синтаксисе оракула, поэтому, если мои переменные ошибочны, пожалуйста, простите меня):

Я попытался перевести сценарий в синтаксис Oracle. — Том

объявить номер счета; начать select count (*) в count from all_tables, где table_name = ‘x’; если count> 0, немедленно выполнить drop table x; конец, если; конец; Вы не можете запустить DDL непосредственно из блока транзакции, вам нужно использовать execute. — Хб

Огромное спасибо! Я не понимал, что синтаксис был таким другим. Я ДЕЙСТВИТЕЛЬНО знал, что вам нужно обернуть все это в начало / конец, но я решил, что это запускается в середине другого скрипта. Том: Я решил оставить свою версию, а не копировать вашу, поэтому я не беру никаких голосов от вас, у которой, очевидно, есть правильный ответ. — Эрих

Не думаю, что это скомпилирует. Также может быть важно включить сюда владельца схемы, иначе вы можете получить значение «истина» для таблицы с таким же именем, которую вы не хотели получить. — Аллен

Ваш ответ был заменен правильным синтаксисом Oracle через 10 минут после публикации. — jpmc26

Другой метод — определить исключение, а затем перехватить только это исключение, позволяя распространяться всем остальным.

@ Sk8erPeter «уже не существует» против «существовало, но больше не существует» 🙂 — Джеффри Кемп

Эта функция проверяет, является ли строка входного параметра квалифицированным идентификатором SQL существующего объекта SQL.

Но это могло быть не имя стола. — Джеффри Кемп

Также могут быть разные таблицы, использующие это имя в разных схемах. — Гибрис95

Такой блок может быть вам полезен.

К сожалению, нет, не существует таких вещей, как drop, если существует, или CREATE IF NOT EXIST.

Вы можете написать сценарий plsql, чтобы включить туда логику.

Я не очень разбираюсь в Oracle Syntax, но я думаю, что сценарий @ Erich будет примерно таким.

объявить cant integer; имя таблицы varchar2 (100): = ‘BLABLABL’; начать счетчик выбора (*) в cant from dba_tables, где lower (table_name) = tablename; если cant> 0, немедленно выполнить ‘DROP TABLE tablename’; КОНЕЦ ЕСЛИ; конец; — Огуз

Читайте также:  Nfs read error try again почему

Вы всегда можете сами отловить ошибку.

Это считается плохой практикой злоупотреблять этим, как и пустые catch () в других языках.

Нет, никогда не «исключение, когда другие тогда равны нулю» — miracle173

Я предпочитаю указывать таблицу и владельца схемы.

Также обратите внимание на чувствительность к регистру. (см. «верхний» пункт ниже).

Я бросил туда несколько разных предметов, чтобы показать, что их можно использовать не только в ТАБЛИЦАх, но и в других местах.

И пример ТАБЛИЦЫ:

ответ дан 06 авг.

// Выполняя этот код, проверяет, существует ли таблица, а затем создает таблицу max. это просто работает в одиночной компиляции

ответ дан 25 авг.

Я считаю, что это создает таблицу только при возникновении ошибки. — Рыбное печенье

Источник

Oracle: если таблица существует

Я пишу несколько сценариев миграции для базы данных Oracle, и надеялся, что Oracle имеет что-то похожее на IF EXISTS конструкцию MySQL .

В частности, когда я хочу удалить таблицу в MySQL, я делаю что-то вроде

Таким образом, если таблица не существует, DROP ошибка не выдается, и сценарий может продолжаться.

Есть ли у Oracle аналогичный механизм? Я понимаю, что мог бы использовать следующий запрос, чтобы проверить, существует таблица или нет

но синтаксис связывания этого с a DROP ускользает от меня.

Лучший и самый эффективный способ — перехватить исключение «таблица не найдена»: это позволяет избежать ненужных проверок, если таблица существует дважды; и не страдает от проблемы, заключающейся в том, что если DROP завершается неудачей по какой-либо другой причине (которая может быть важной), исключение по-прежнему передается вызывающей стороне:

ADDENDUM Для справки вот эквивалентные блоки для других типов объектов:

Ссылка на базу данных

Это для проверки, существует ли таблица в текущей схеме. Для проверки того, существует ли данная таблица в другой схеме, вам нужно использовать all_tables вместо нее user_tables и добавить условие all_tables.owner = upper(‘schema_name’)

Я искал то же самое, но я закончил тем, что написал процедуру, чтобы выручить меня:

Надеюсь это поможет

Я просто хотел опубликовать полный код, который создаст таблицу и удалит ее, если она уже существует, используя код Джеффри (спасибо ему, а не мне!).

С SQL * PLUS вы также можете использовать команду WHENEVER SQLERROR:

С CONTINUE NONE ошибкой сообщается, но скрипт продолжится. При EXIT SQL.SQLCODE этом скрипт будет прерван в случае ошибки.

В оракуле нет DROP TABLE IF EXISTS, вам нужно будет выполнить оператор select.

попробуйте это (я не разбираюсь в синтаксисе оракула, поэтому, если мои переменные ify, пожалуйста, прости меня):

Я предпочитаю следующее экономическое решение

Другой метод — определить исключение, а затем только перехватить это исключение, позволяя распространяться всем остальным.

Одним из способов является использование DBMS_ASSERT.SQL_OBJECT_NAME :

Эта функция проверяет, что строка входного параметра является квалифицированным идентификатором SQL существующего объекта SQL.

К сожалению, нет, нет такой вещи, как отбрасывание, если существует, или СОЗДАТЬ, ЕСЛИ НЕ СУЩЕСТВУЕТ

Вы можете написать сценарий plsql, чтобы включить туда логику.

Я не сильно разбираюсь в синтаксисе Oracle, но я думаю, что сценарий @ Erich будет примерно таким.

Вы всегда можете поймать ошибку самостоятельно.

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

Я предпочитаю указывать таблицу и владельца схемы.

Также следите за чувствительностью к регистру. (см. «верхний» пункт ниже).

Я добавил несколько различных объектов, чтобы показать, что их можно использовать в других местах, кроме ТАБЛИЦ.

И ТАБЛИЦА пример:

// Делая этот код, проверяет, существует ли таблица, и позже она создает таблицу max. это просто работает в одной компиляции

Источник

Оцените статью
toolgir.ru
Adblock
detector