Будучи совершенно новым для 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;
Кстати, а что означает последняя строчка?
$$
и вы можете узнать что-то новое, прочитав его, например, есть также$foo$
Ответы:
Знаки доллара используются для обозначения доллара и никоим образом не относятся к определениям функций . Его можно использовать для замены одинарных кавычек практически в любом месте сценариев 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
чтобы понять последнюю строку вашего примера.источник
$body$
? ОтCREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsql
-body
нигде не вижу определения. Я действительно понятия не имею, что здесь происходит$body$
это просто " котировка доллара", как я объяснил. Подробнее: stackoverflow.com/a/12320729/939860$$ - это разделитель, который вы используете, чтобы указать, где начинается и заканчивается определение функции. Рассмотрим следующее:
CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>
Синтаксис функции создания аналогичен, но поскольку вы собираетесь использовать в своей функции все виды SQL (особенно символ конца оператора), синтаксический анализатор отключится, если вы не ограничите его. Итак, вы должны читать свое утверждение как:
CREATE OR REPLACE FUNCTION check_phone_number(text) RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE;
Материал после фактического определения - это параметры, позволяющие предоставить базе данных больше информации о вашей функции, чтобы она могла оптимизировать ее использование.
Фактически, если вы посмотрите в разделе «4.1.2.2. Строковые константы, выраженные в долларах» в руководстве, вы увидите, что вы даже можете использовать символы между символами доллара, и все это будет считаться одним разделителем.
источник