Для чего используются '$$' в 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;

кстати, что означает последняя строка?

225   2  

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

    Ничего не найдено.

Добавить ответ:
Отменить.