Как выполнить код pl / pgsql без создания функции? - PullRequest
44 голосов
/ 03 апреля 2010

С SQL Server я могу выполнить специальный код T-SQL с полной процедурной логикой через SQL Server Management Studio или любой другой клиент. Я начал работать с PostgreSQL и столкнулся с небольшой разницей в том, что PGSQL требует, чтобы в функцию была встроена любая логика.

Есть ли способ выполнить код PL / PGSQL без создания функции?

Ответы [ 3 ]

59 голосов
/ 25 октября 2010

Postgres 9

DO $$ 
-- declare
BEGIN
  /* pl/pgsql here */
END $$;
6 голосов
/ 03 апреля 2010

Нет, еще нет. Версия 9.0 (все еще альфа) будет иметь эту опцию (делать), вам придется подождать, пока она выйдет.

1 голос
/ 06 декабря 2017

Я изо всех сил пытался заставить это работать, потому что это довольно строго о добавлении точек с запятой в точно правильных местах. Но как только вы привыкаете к этому, это работает хорошо. Помимо невозможности возврата записей, конечно, вы можете создавать уведомления и исключения и делать другие обходные пути, такие как использование временных таблиц, как @ErwinBrandstetter указал в комментарии выше.

например:.

DO 
$$
BEGIN
  IF EXISTS(SELECT 'any rows?' 
              FROM {your_table} 
              WHERE {your_column} = 'blah')
  THEN
      RAISE NOTICE 'record exists';
  ELSE
      RAISE EXCEPTION 'record does not exist';
  END IF;

  DROP TABLE IF EXISTS foo;

  CREATE TEMP TABLE foo AS
  SELECT 'bar'::character varying(5) as baz;
END 
$$;

SELECT * FROM foo;
...