Для чего используется $$ в 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;
Кстати, что означает последняя строка?
2 ответа
Знаки доллара используются для цитирования доллара и никоим образом не относятся к определению функций. Его можно использовать для замены одинарных кавычек практически в любом месте сценариев 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;
Это не такая хорошая идея. Вместо этого используйте кавычки, а точнее, вставьте знак между $$
чтобы сделать его уникальным - вы можете также использовать $-токвоты внутри тела функции. Я делаю это много, на самом деле.
CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean
AS
$func$
BEGIN
...
END
$func$ LANGUAGE plpgsql STRICT IMMUTABLE;
Подробности:
Что касается вашего второго вопроса:
Прочитайте самое превосходное руководство по CREATE FUNCTION
чтобы понять последнюю строку вашего примера.
$$ - это разделитель, который вы используете, чтобы указать, где начинается и заканчивается определение функции. Рассмотрим следующее,
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. Строковые константы, заключенные в доллары" в руководстве, вы увидите, что вы можете даже использовать символы между символами доллара, и все они будут считаться одним разделителем.