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?
$$
y puede aprender algo nuevo leyéndolo, por ejemplo, también hay$foo$
Respuestas:
Los signos de dólar se utilizan para cotizar en dólares y no son específicos de las definiciones de funciones . Se puede utilizar para reemplazar comillas simples prácticamente en cualquier lugar de los scripts SQL.
El cuerpo de una función es un literal de cadena que debe estar entre comillas simples. Dollar-quoting es un sustituto específico de PostgreSQL para las comillas simples para evitar problemas de citas dentro del cuerpo de la función. También puede escribir la definición de su función con comillas simples. Pero luego tendrías que escapar de todas las comillas simples en el cuerpo:
No es tan buena idea. En su lugar, use la cotización en dólares, más específicamente también coloque un token entre
$$
para que sea única; es posible que también desee usar $ -quotes dentro del cuerpo de la función. De hecho, hago mucho eso.Detalles:
En cuanto a su segunda pregunta:
lea el manual
CREATE FUNCTION
más excelente para comprender la última línea de su ejemplo.fuente
$body$
? DesdeCREATE OR REPLACE FUNCTION update_ts() RETURNS TRIGGER AS $BODY$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $BODY$ LANGUAGE plpgsql
- no veobody
definido en ningún lado. Realmente no tengo idea de lo que está pasando aquí$body$
es solo "cotización en dólares", como expliqué. Más detalles: stackoverflow.com/a/12320729/939860$$ es un delimitador que se usa para indicar dónde comienza y termina la definición de la función. Considera lo siguiente,
La sintaxis de la función de creación es similar, pero debido a que va a usar todo tipo de SQL en su función (especialmente el final de la declaración; carácter), el analizador se disparará si no lo delimita. Por lo tanto, debe leer su declaración como:
Lo que sigue a la definición real son opciones para dar a la base de datos más información sobre su función, para que pueda optimizar su uso.
De hecho, si mira en "4.1.2.2. Constantes de cadena entre comillas en dólares" en el manual, verá que incluso puede usar caracteres entre los símbolos de dólares y todo contará como un delimitador.
fuente