Подтвердить что ты не робот

Что такое "$$", используемое в PL/pgSQL

Будучи совершенно новым для PL/pgSQL, в чем смысл знаков двойного доллара в этой функции:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;

Я предполагаю, что в RETURNS boolean AS $$, $$ является заполнителем.

Последняя строка немного загадка: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

Кстати, что означает последняя строка?

4b9b3361

Ответ 1

Знаки доллара используются для долларового котирования и никак не зависят от определений функций. Его можно использовать для замены одиночных кавычек практически в любом месте сценариев SQL.

Тело функции представляет собой строковый литерал, который должен быть заключен в одинарные кавычки. Колонка доллара является специфичной для PostgreSQL заменой одинарных кавычек, чтобы избежать цитирования проблем внутри тела функции. Вы также можете написать определение своей функции с одинарными кавычками. Но тогда вам придется избегать всех одиночных кавычек в теле:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS
'
BEGIN
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';
  END IF;
  RETURN true; 
END
' LANGUAGE plpgsql STRICT IMMUTABLE;

Это не такая хорошая идея. Вместо этого используйте долларовое цитирование, а точнее также поместите токен между $$, чтобы сделать его уникальным - вы также можете использовать $-quotes внутри тела функции. На самом деле я это делаю.

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean  
AS
$func$
BEGIN
 ...
END
$func$  LANGUAGE plpgsql STRICT IMMUTABLE;

Подробнее:

Что касается вашего второго вопроса:
Прочтите самую отличную руководство по CREATE FUNCTION, чтобы понять последнюю строку вашего примера.

Ответ 2

$$ - это разделитель, который вы используете, чтобы указать, где начинается и заканчивается определение функции. Рассмотрим следующее:

CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>

Синтаксис функции create аналогичен, но поскольку вы собираетесь использовать всевозможные SQL в своей функции (особенно конец оператора, символ), синтаксический анализатор отключится, если вы не разделите его. Поэтому вы должны прочитать свое выражение как:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE;

Материал после фактического определения - это опции для предоставления базе данных дополнительной информации о вашей функции, поэтому она может оптимизировать ее использование.

На самом деле, если вы посмотрите в разделе "4.1.2.2. Корректированные строки в долларах" в руководстве, вы увидите, что вы можете даже использовать символы между символами доллара, и все они будут считаться одним разделителем.