Возврат вставленного значения в переменную с предложением PostgreSQL RETURNING .. INTO - PullRequest
6 голосов
/ 17 мая 2019

После вставки оператор отлично работает с Oracle.

INSERT INTO table_name (col1, col2) VALUES (val1, val2) RETURNING col1 INTO :var ;

Мы можем связать переменную с :var и выполнить инструкцию.

Однако, когда тот же запрос выполняется в базе данных Postgres, он выдает следующую ошибку.

ОШИБКА: синтаксическая ошибка в или около «INTO».

В чем причина такого поведения?

Я пытался выполнить запрос в блоке PL / pgSQLи он прекрасно работает.

DO $$
DECLARE var integer;
BEGIN
  INSERT INTO "table_name "(
            "col1, "col2")
          VALUES (val1, val2)
          RETURNING "col1" INTO var;
END $$

Но приведенный выше запрос не может напрямую использоваться внутри кода C ++ без блока PL / pgSQL, когда мы подключаемся к базе данных Postgres.Я использую PostgreSQL 9.5.4.Поскольку мы поддерживаем независимые от баз данных программные приложения, нам нужно прояснить это поведение.

Я ожидаю, что обе базы данных поддерживают предложение RETURNING .. INTO одинаково.

1 Ответ

5 голосов
/ 17 мая 2019

В PostgreSQL оператор SQL INSERT ... RETURNING не поддерживает предложение INTO, так же как SELECT.

Оба оператора поддерживают INTO только в PL / pgSQL.

Вы обрабатываете INSERT ... RETURNING точно так же, как SELECT в PostgresSQL - он возвращает набор результатов.

Я не знаю, почему Oracle обрабатывает INSERT ... RETURNING так сложно и отличается от SELECT;проектное решение, вероятно, было принято как запоздалая мысль в конце семидесятых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...