Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать таблицу, если её нет, На MS SQL получается, на Oracle не могу 
V
    Опции темы
Peter
Дата 10.10.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Задача: создать таблицу 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". Что делать?


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Sqlninja
Дата 10.10.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



нельзя мешать 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;




--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
batigoal
Дата 10.10.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



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


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Peter
Дата 10.10.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



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


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Sqlninja
Дата 11.10.2007, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



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

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


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Peter
Дата 11.10.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



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

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


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Sqlninja
Дата 12.10.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



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

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


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Filatov NA
Дата 12.10.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.10.2007
Где: г. Нижнекамск

Репутация: нет
Всего: нет



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

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

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

Кстате, для С++Builder есть очень замечательный компонент ODAC.
PM MAIL ICQ   Вверх
Peter
Дата 16.10.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Сделал, как проще.
Код
try
{ <вызов "CREATE TABLE ...">
}catch(...){}

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



--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1236 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.