oracle plsql с оператором WITH в сочетании с INSERT

Во время миграции функций postgresql 9 возникла следующая проблема: в Oracle вы можете использовать WITH только в сложных операторах select. Между тем, в postgres (и MS SQL 2008 тоже) вы можете использовать WITH и INSERT (update, delete) вместе.

Пример:

     WITH prerows AS ( SELECT ObjectID, LoginID, Param FROM devices D
                         WHERE D.DevNum = '0003' AND ObjectID IS NULL )

     INSERT INTO dev_sub( ObjectID, LoginID, Param )
     SELECT ObjectID, LoginID, Param FROM prerows;

Запрос отлично работает в PostgreSQL 9.2, но пишет ошибку в Oracle 11 XE: "ORA-00928: отсутствует ключевое слово SELECT". Может я просто что-то пропустил? Я увлекаюсь Oracle, и мне было бы жаль, что он не может объединить оператор WITH и команду INSERT.

С наилучшими пожеланиями, Энтони

2 ответа

Решение

Пытаться:

 INSERT INTO dev_sub( ObjectID, LoginID, Param )

 WITH prerows AS ( SELECT ObjectID, LoginID, Param 
                   FROM devices D
                   WHERE D.DevNum = '0003' 
                     AND ObjectID IS NULL )
 SELECT ObjectID, LoginID, Param FROM prerows;

Пытаться:

INSERT INTO dev_sub( ObjectID, LoginID, Param )
  SELECT ObjectID, LoginID, Param 
    FROM devices D
    WHERE D.DevNum = '0003' 
      AND ObjectID IS NULL

Он не использует предложение WITH в SELECT (также называемое предложением факторинга подзапроса), но с другой стороны, здесь действительно нет необходимости. Oracle, SQL Server и PostgreSQL имеют свои особенности в реализации SQL, и такой вещи, как прозрачная миграция, не существует.

Поделитесь и наслаждайтесь.

Другие вопросы по тегам