Что такое "$$", используемое в 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;
Кстати, что означает последняя строка?
Ответы
Ответ 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. Корректированные строки в долларах" в руководстве, вы увидите, что вы можете даже использовать символы между символами доллара, и все они будут считаться одним разделителем.