Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Создать таблицу, если её нет


Автор: Peter 10.10.2007, 15:43
Задача: создать таблицу T1, если её ещё нет в базе.
MS SQL Server на запрос
Код
IF NOT EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'T1') BEGIN 
CREATE TABLE T1 (...) 
ALTER TABLE T1 ADD PRIMARY KEY (...)
END
 делает, что требуется. Пытаюсь этот скрипт переписать для Oracle.
1) Меняю INFORMATION_SCHEMA.TABLES на all_all_tables.
2) Перед IF ставлю EXEC (иначе "неизвестное начало команды...").
3) Ставлю точки с запятой после каждой команды.
4) Вместо END пишу END IF.
И всё равно: "после BEGIN не может стоять CREATE". Что делать?

Автор: Sqlninja 10.10.2007, 16:53
нельзя мешать DDL и pl/sql, используй динамический SQL

Код

declare
   function table_exists (
      tname   in   varchar2
   )
      return boolean
   is
      cursor c
      is
         select 1
         from   all_tables t
         where  t.table_name = UPPER (tname);

      l_int   pls_integer;
      l_res   boolean     := false;
   begin
      open c;

      fetch c
      into  l_int;

      if c%found
      then
         l_res    := true;
      end if;

      close c;

      return l_res;
   end;
begin
   if not table_exists ('MYTABLE')
   then
      execute immediate 'create table mytable (f1 int, f2 int)';
   end if;
end;


Автор: batigoal 10.10.2007, 16:55
Peter, сделай просто CREATE. Если таблица уже существует, Оракл не даст её создать, т.к. у тебя CREATE, а не CREATE OR REPLACE.

Автор: Peter 10.10.2007, 19:47
Цитата(batigoal @  10.10.2007,  16:55 Найти цитируемый пост)
Peter, сделай просто CREATE.
 Дело в том, что у меня программа соединяется с БД через ODBC. Та обёртка, которую я использую, в случае ошибки выкинет исключение, а его хотелось бы избежать. Если ничего другого не остаётся, придется просто писать CREATE и ставить пустой блок catch(...){}.

Автор: Sqlninja 11.10.2007, 08:57
Цитата(Peter @  10.10.2007,  19:47 Найти цитируемый пост)
Та обёртка, которую я использую, в случае ошибки выкинет исключение, а его хотелось бы избежать

Ну. Возьми тот блок который я тебе написал, добавь секцию exception, и обработай его там. Тогда до твоей обертки ничего не дойдет.

Автор: Peter 11.10.2007, 17:55
Цитата(Sqlninja @  11.10.2007,  08:57 Найти цитируемый пост)
Возьми тот блок который я тебе написал

А как его вставить в программу на C++?

Автор: Sqlninja 12.10.2007, 13:32
Причем тут уже С++?? Ты врроде хотел T-sql'ный блок переписать для Oracle? 
Цитата(Peter @  11.10.2007,  17:55 Найти цитируемый пост)
А как его вставить в программу на C++?

Вообще,это уже тема для отдельного топика,но... На самом деле логика примитивна настолько, что его проще переписать на С++, имхо. Главный смысл в запросе, который проверяет существование таблицы.

Автор: Filatov NA 12.10.2007, 18:14
Цитата(Sqlninja @ 12.10.2007,  11:32)
Причем тут уже С++?? Ты врроде хотел T-sql'ный блок переписать для Oracle? 
Цитата(Peter @  11.10.2007,  17:55 Найти цитируемый пост)
А как его вставить в программу на C++?

Вообще,это уже тема для отдельного топика,но... На самом деле логика примитивна настолько, что его проще переписать на С++, имхо. Главный смысл в запросе, который проверяет существование таблицы.

Код, который тебе посоветовал товарищь, оборачиваешь в процедуру.
А в С++ вызываешь стандартными методами. 

Кстате, для С++Builder есть очень замечательный компонент ODAC.

Автор: Peter 16.10.2007, 13:22
Сделал, как проще.
Код
try
{ <вызов "CREATE TABLE ...">
}catch(...){}

try
{ <вызов "ALTER TABLE ... ADD PRIMARY KEY ...">
}catch(...){}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)