Error unterminated dollar quoted string



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» ,
Subject: Re: Need help (unterminated dollar-quoted string at or near «$$ LANGUAGE plpgsql IMMUTABLE; «) Date: 2012-09-10 13:44:39 Message-ID: 90CC578398154D4BB83F1601C3DD7DA8@marktestcr.marktest.pt Views: Raw Message | Whole Thread | Download mbox | Resend email Thread: Lists: pgsql-novice

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 в следующей последовательности:

  1. CREATE OR REPLACE FUNCTION test(text) RETURNS VOID AS ‘ DECLARE tmp text
  2. BEGIN tmp := «test»
  3. END;
  4. ‘ 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, который пытается реализовать сеансы или пространства имен. Хотя это не решение, я надеюсь, что это поможет.

Источник

Читайте также:  Keyvalues error loadfrombuffer missing in file addons sourcemod configs advertisements txt
Оцените статью
toolgir.ru
Adblock
detector