Совместимость с Oracle и Sybase для создания таблицы new_table as

Я пытаюсь написать SQL-запрос, который должен быть совместим как с базой данных Sybase, так и с базой данных Oracle. Запрос выглядит следующим образом:

SELECT * 
  INTO new_table
  FROM other_table

Этот запрос отлично работает в базе данных Sybase, но не в базе данных Oracle. Я нашел эквивалент для Oracle:

CREATE table new_table AS
SELECT * 
  FROM other_table

Есть ли способ написать третий запрос, который делал бы то же самое и мог бы выполняться в Sybase и в базе данных Oracle?


person MartinMoizard    schedule 17.02.2011    source источник


Ответы (3)


Как вы обнаружили, Oracle поддерживает INTO, но не использует его, как Sybase/SQL Server. Точно так же Sybase не поддерживает расширение Oracle синтаксиса CREATE TABLE.

Наиболее надежным способом создания таблицы и импорта данных между системами является использование двух операторов:

CREATE TABLE new_table (
  ...columns...
)

INSERT INTO new_table
SELECT * 
  FROM OLD_TABLE

Даже в этом случае синтаксис отличается, потому что Oracle требует, чтобы каждый оператор был разделен точкой с запятой, в отличие от TSQL.

Создание таблицы и импорт всех данных из другой таблицы является для меня красным флагом - это не то, что вы сделали бы в хранимой процедуре для производственной системы. TSQL и PLSQL очень разные, поэтому я ожидаю отдельных сценариев для изменений DML.

person OMG Ponies    schedule 17.02.2011

Нет запроса, который делал бы то, что вы хотите. Эти среды очень разные.

person codingguy3000    schedule 17.02.2011
comment
В порядке. И зная, что мне нужно построить новую таблицу в зависимости от результатов запроса, как вы думаете, есть ли запрос, который будет работать для этих двух сред? - person MartinMoizard; 17.02.2011
comment
@MartinMoizard Да, это заканчивается добавлением таблицы DUAL в базы данных sql-сервера, которую какой-то дурак копирует обратно в Oracle, скрывая системную псевдотаблицу. Наконец, у вас есть более одной строки в Dual. - person bernd_k; 17.02.2011

Это возможно.

SELECT * INTO new_table FROM existing_table;

Спасибо

person Able    schedule 26.04.2013