¿Para qué se utilizan '$$' en PL/pgSQL?
Siendo completamente nuevo en PL/pgSQL, ¿cuál es el significado de los signos de dólar dobles en esta función ?
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;
Supongo que en RETURNS boolean AS $$
, $$
es un marcador de posición.
La última línea es un poco misteriosa:$$ LANGUAGE plpgsql STRICT IMMUTABLE;
Por cierto, ¿qué significa la última línea?
Estos signos de dólar ( $$
) se utilizan para cotizar dólares , lo cual no es de ninguna manera específico de las definiciones de funciones . Se puede utilizar para reemplazar las comillas simples que encierran cadenas literales (constantes) en cualquier lugar de los scripts SQL.
El cuerpo de una función resulta ser un literal de cadena. La cotización en dólares es un sustituto específico de PostgreSQL de las comillas simples para evitar el escape de comillas simples anidadas (recursivamente). También puedes encerrar el cuerpo de la función entre comillas simples. Pero luego tienes que escapar de todas las comillas simples anidadas:
CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean
LANGUAGE plpgsql STRICT IMMUTABLE AS
'
BEGIN
IF NOT $1 ~ e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
RAISE EXCEPTION ''Malformed string: "%". Expected format is +999 999'', $1;
END IF;
RETURN true;
END
';
(Se agregó el parámetro que falta para RAISE
, por cierto).
Ésta no es una buena idea. Utilice en su lugar cotizaciones en dólares. Más específicamente, coloque también un token (significativo) dentro de $$
para evitar confusión con comillas anidadas en el cuerpo de la función. Un caso común, en realidad.
CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean
LANGUAGE plpgsql STRICT IMMUTABLE AS
$func$
BEGIN
...
END
$func$;
Ver:
- Insertar texto con comillas simples en PostgreSQL
A su segunda pregunta: lea el manual
más excelente para comprender la última línea de su ejemplo.CREATE FUNCTION
Es $$
un delimitador que se utiliza para indicar dónde comienza y termina la definición de la función. Considera lo siguiente,
CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>
La sintaxis de la función de creación es similar, pero debido a que va a utilizar todo tipo de SQL en su función (especialmente el ;
carácter de fin de declaración), el analizador se dispararía si no lo delimitara. Entonces deberías leer tu declaración como:
CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE;
Lo que sigue a la definición real son opciones para brindarle a la base de datos más información sobre su función, para que pueda optimizar su uso.
De hecho, si observa "4.1.2.4. Constantes de cadena cotizadas en dólares" en el manual, verá que incluso puede usar caracteres entre los símbolos del dólar y todo contará como un delimitador.
Los delimitadores $$ y ' se utilizan para crear el cuerpo que puede tener una o más declaraciones SQL en una función SQL , función PL/pgSQL , procedimiento , disparador y disparador de evento .
Por ejemplo, puede crear una función PL/pgSQL con el delimitador $$
como se muestra a continuación:
CREATE FUNCTION addition(v1 INTEGER, v2 INTEGER) RETURNS INTEGER AS $$
DECLARE
result INTEGER;
BEGIN
SELECT v1 + v2 INTO result;
RETURN result;
END;
$$ LANGUAGE plpgsql;
Y puede crear una función PL/pgSQL con el delimitador '
como se muestra a continuación:
CREATE FUNCTION addition(v1 INTEGER, v2 INTEGER) RETURNS INTEGER AS '
DECLARE
result INTEGER;
BEGIN
SELECT v1 + v2 INTO result;
RETURN result;
END;
' LANGUAGE plpgsql;