postgresql: синтаксическая ошибка в или около DO

Я пытаюсь запустить блок DO, например. вот этот (скопировано из поста на этом форуме)

DO $$
DECLARE x int;
    BEGIN
    x := 10;
    RAISE NOTICE '>>>%<<<', x;
END;
$$

но что происходит:

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

Состояние SQL: 42601

Персонаж: 1

Неважно, какой блок DO я запускаю, оператор DO просто не работает (в том числе на примерах, скопированных/вставленных из документа, и мне интересно, в чем может быть причина. Кто-нибудь может мне помочь, пожалуйста?

Большое спасибо


person jkt    schedule 20.06.2014    source источник
comment
Какая версия постгреса?   -  person hobbs    schedule 21.06.2014
comment
Ну, во всяком случае, я могу предположить. DO был добавлен в postgres 9.0. Для более старых версий см. Что эквивалентно DO блок для Postgres ‹ 9.0?   -  person hobbs    schedule 21.06.2014
comment
Либо 9.3. или более поздняя версия.   -  person jkt    schedule 21.06.2014
comment
Показать вывод select version();   -  person Clodoaldo Neto    schedule 21.06.2014
comment
Мне жаль. Это 8.4.20. Я работаю над недавно установленным сервером, и мне не приходило в голову, что могла быть установлена ​​более ранняя версия. Благодарю вас!   -  person jkt    schedule 21.06.2014


Ответы (2)


Вы используете старую версию PostgreSQL.

В общем, если вы получаете непредвиденную синтаксическую ошибку в ключевом слове или PostgreSQL жалуется на отсутствующую функцию, которая, очевидно, должна существовать, первое, что нужно сделать, это проверить, действительно ли функция, которую вы пытаетесь использовать, существовала в вашей версии.

Вы можете заменить блок DO на:

CREATE OR REPLACE FUNCTION some_func() RETURNS void AS 
$$
.. body of the DO block here...
$$ LANGUAGE plpgsql VOLATILE;

SELECT some_func();

DROP FUNCTION some_func();

в более старой версии.

person Craig Ringer    schedule 21.06.2014

Если у вас такая же ошибка с postgreSQL 9.0+, то это связано с неправильным типом выполнения. pgAdiminIII имеет две кнопки выполнения (зеленый треугольник):

  • Выполнить запрос
  • Выполнить pgScript

Чтобы запустить DO $$, вам нужен первый.

person epox    schedule 27.04.2017