2010-04-02 6 views
41

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

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

ответ

51

Postgres 9

DO $$ 
-- declare 
BEGIN 
    /* pl/pgsql here */ 
END $$; 
+3

Для тех, кто нашел этот ответ и попробовал его только для получения« ОШИБКИ: синтаксис ошибка в точке «SELECT» или рядом с ней, вам нужны BEGIN и END. DO $$ BEGIN/* pl/pgsql здесь */END $$ –

+2

Но как этот код может вернуть результат запроса? Если я поставлю SELECT в части pl/pgsql, я получаю 'ERROR: запрос не имеет адресата для данных результата' – isapir

+2

@Igal: Он не может. Вы ничего не можете вернуть из инструкции 'DO'. Вы можете поднимать уведомления или записывать во временную таблицу или открывать курсор как возможные обходные пути. –

5

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

+0

+1, но я думаю, что это было объявлено на 8,5 - http://developer.postgresql.org/pgdocs/postgres/release-8.5.html –

+1

Я думал, что 8,5 стал 9,0 из-за некоторых основных функций, которые были реализованы ... –

+0

А, это объяснит это. –

1

Я изо всех сил, чтобы получить эту работу, потому что это довольно строги о добавлении полу двоеточие точно в нужных местах. Но как только вы привыкнете к этому, он работает хорошо. Помимо неспособности возвращать записи, конечно, однако вы можете создавать уведомления об ошибках & и выполнять другие обходные пути, например, используя временные таблицы, как @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; 
+0

Я думаю, что способность возвращать строки, похожие на хранимые процедуры SQL Server/Oracle, входит в следующую версию PostgreSQL. Почему это заняло много времени, я покончил с собой. –

Смежные вопросы