Dollar-Quoted Postgres pl/pgsql procedures abort at first semi-colon
anonymous
[This topic is migrated from our old forums. The original author name has been removed]
I’m trying to create pl/pgsql stored procedures in Postgres.
They are typically of the format:
CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$
BEGIN
RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;
(This example is from http://www.postgresql.org/docs/8.2/interactive/plpgsql-declarations.html)
The dollar-quotes ($$) avoid the need to double-quote enclosed text, a bit like Javascript allows the use of single quotes within double-quotes.
However, when DbVisualizer sends this SQL to Postgres, it returns the error:
13:19:14 [CREATE — 0 row(s), 0.000 secs] [Error Code: 0, SQL State: 42601] ERROR: unterminated dollar-quoted string at or near «$$
BEGIN
RETURN subtotal * 0.06″
13:19:14 [END — 0 row(s), 0.000 secs] Command processed . No rows were affected
From what I can observe, the code is being terminated at the semi-colon after ‘0.06’, rather than being interpreted as an entire block. The example runs fine if the dollar-quotes ($$) are replaced with single quotes (‘).
I have tried changing the Statement Delimiters (no luck) and the Variable Identifers (away from $$) but the above error still happens.
If I execute the same code within another query tool (eg Query Tool for Postgres), it executes fine. Thus, it is something to do with DbVisualizer’s interaction with Postgres.
Oh, and yes — I used the button labelled «Execute the complete buffer as one SQL statement».
Re: Need help (unterminated dollar-quoted string at or near «$$ LANGUAGE plpgsql IMMUTABLE; «)
From: | «Oliveiros d’Azevedo Cristina» |
---|---|
To: | «Rob Richardson» , |
You’re right, Rob, the text in-between the dollar signs is an identifier.
But, Unless I’m mistaken, nothing prevents the identifier from being empty.
Best,
Oliver
—— Original Message ——
From: Rob Richardson
To: pgsql-novice(at)postgresql(dot)org
Sent: Monday, September 10, 2012 2:24 PM
Subject: Re: [NOVICE] Need help (unterminated dollar-quoted string at or near «$$ LANGUAGE plpgsql IMMUTABLE; «)
That looks to me like an error from PostgreSQL rather than from InstallShield.
When I look at a function that works in my database, I see something like:
CREATE OR REPLACE some_function()
RETURNS integer AS
LANGUAGE ‘plpgsql’ VOLATILE
So, I suggest putting something between the two dollar signs. I believe, but I’m not positive, that the text between the dollar signs is merely an identifier. If you don’t have that identifier, I can imagine PostgreSQL getting confused.
P.S. Please keep in mind that this advice may be worth exactly what you have paid for it.
In response to
- Re: Need help (unterminated dollar-quoted string at or near «$$ LANGUAGE plpgsql IMMUTABLE; «) at 2012-09-10 13:24:04 from Rob Richardson
Browse pgsql-novice by date
From | Date | Subject | |
---|---|---|---|
Next Message | James David Smith | 2012-09-12 15:39:07 | Interpolating Values |
Previous Message | Rob Richardson | 2012-09-10 13:24:04 | Re: Need help (unterminated dollar-quoted string at or near «$$ LANGUAGE plpgsql IMMUTABLE; «) |
Copyright © 1996-2023 The PostgreSQL Global Development Group
ОШИБКА: незавершенная строка в кавычках около или около
При выполнении показанного ниже кода триггера с использованием ANT я получаю сообщение об ошибке
Я могу успешно выполнить приведенный ниже код через PGADmin (предоставленный postgres) и утилиту командной строки «psql», и функция триггера добавлена, но при выполнении через ANT она каждый раз терпит неудачу
8 ответы
Я столкнулся с этой ошибкой в Ликибаза и эта страница была одним из первых результатов поиска, поэтому я думаю, что делюсь своим решением на этой странице:
Вы можете поместить весь свой sql в отдельный файл и включить его в набор изменений. Важно установить splitStatements вариант false .
Тогда весь набор изменений будет выглядеть как
Мне всегда нравится иметь эти большие части SQL (например, обновления функций и т. Д.) В отдельных файлах. Таким образом вы получите правильную подсветку синтаксиса при открытии файла sql и вам не придется смешивать XML и SQL в одном файле.
Редактировать: как упоминалось в комментариях, стоит отметить, что что собой представляет sql изменение поддерживает splitStatements вариант (спасибо AndreyT за указание на это).
ответ дан 24 апр.
Думаю, нужно упомянуть, что sql поддерживает splitStatements=»false» тоже. док — АндрейТ
У меня была такая же проблема с драйвером JDBC, используемым Liquibase.
Кажется, что драйвер взрывает каждую строку, оканчивающуюся точкой с запятой, и запускает ее как отдельную команду SQL. Поэтому приведенный ниже код будет выполняться драйвером JDBC в следующей последовательности:
- CREATE OR REPLACE FUNCTION test(text) RETURNS VOID AS ‘ DECLARE tmp text
- BEGIN tmp := «test»
- END;
- ‘ LANGUAGE plpgsql
Конечно, это недопустимый SQL и вызывает следующую ошибку:
Чтобы исправить это, вам нужно использовать обратную косую черту после каждой строки, заканчивающейся точкой с запятой:
Как вариант, вы можете поместить все определение в одну строку.
ответ дан 13 мая ’15, 10:05
Если вы используете файл SQL в формате LiquiBase, попробуйте добавить этот комментарий в свой файл proc / function splitStatements: false. Это помогло мне. — Куберчаун
привет спасибо за этот ответ. это помогло мне с аналогичной ошибкой. однако я хотел добавить, что ваш обходной путь (добавление обратной косой черты) работает только в некоторых случаях. разделение на отдельные операторы выполняется более высоким уровнем, чем jdbc, поэтому именно то, что считается строкой, а что нет, зависит от другого программного обеспечения в стеке. в моем случае с использованием пружины обратная косая черта не работает, но можно было указать другой разделитель. — Эндрю Кук
@andrewcooke Как указать другой разделитель, чтобы решить проблему? — Пако Абато
Я использую клиент HeidiSQL, и эта проблема была решена путем размещения DELIMITER // перед оператором CREATE OR REPLACE. В HeidiSQL также есть опция «Отправить пакет за один раз», которая, по сути, обеспечивает то же самое.
ответ дан 15 окт ’14, 09:10
Отправить пакет за один раз помогает в HeidiSQL — BIOHAZARD
Спасатель, спасибо — я бы никогда не нашел это самостоятельно. Этот параметр находится в раскрывающемся меню кнопки «Выполнить SQL». — Скотт Мартин
Эта ошибка возникает из-за взаимодействия между конкретным клиентом, используемым для подключения к серверу, и формой функции. Проиллюстрировать:
Следующий код будет работать без потерь в Netbeans 7, Squirrel, DbSchema, PgAdmin3.
Обратите внимание, что оператор «begin» идет сразу после строки в кавычках «$».
Следующий код остановит всех вышеуказанных клиентов, кроме PgAdmin3.
Ключевым отличием второго примера является раздел «объявление». Уловка с использованием обратной косой черты вызывает ошибку с PgAdmin3.
В заключение я предлагаю попробовать разные инструменты. Некоторые инструменты, даже если они должны писать текстовые файлы, помещают в текст невидимые элементы. Как известно, это происходит с спецификацией Unicode, которая останавливает любой файл php, который пытается реализовать сеансы или пространства имен. Хотя это не решение, я надеюсь, что это поможет.