Для чего используются '$$' в PL/pgSQL
будучи совершенно новым для PL / pgSQL , что означает двойной знак доллара в эта функция:
CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
IF NOT ~ 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 ~ 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. Строковые константы в долларах " в руководстве вы увидите, что вы даже можете использовать символы между символами доллара, и все это будет считаться одним разделителем.
Comments