Для чего используется $$ в 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. Строковые константы, заключенные в доллары" в руководстве, вы увидите, что вы можете даже использовать символы между символами доллара, и все они будут считаться одним разделителем.

Другие вопросы по тегам