2012-08-27 19 views
53

Al ser completamente nuevo en PL/pgSQL, ¿cuál es el significado de los signos dobles de dólares en this function:

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 un misterio: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

Por cierto, ¿qué significa la última línea?

+3

Considere marcar la respuesta de Erwin como respuesta a esta pregunta, su descripción explica qué es realmente '$$' y puede aprender algo nuevo leyéndola, p. Ej. también hay '$ foo $' – csharpfolk

Respuesta

72

Los signos de dólar se usan para dollar quoting y son de ninguna manera específica para las definiciones de función. Se puede usar para reemplazar comillas simples prácticamente en cualquier lugar en scripts SQL.

El cuerpo de una función pasa a ser un literal de cadena que debe estar entre comillas simples. La cotización en dólares es un sustituto específico de PostgreSQL para comillas simples para evitar problemas de cotización dentro del cuerpo de la función. También podría escribir la definición de su función con comillas simples. Pero entonces tendría que escapar de todas las comillas simples en el cuerpo:

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; 

Esto no es una buena idea. En su lugar, utilice las cotizaciones en dólares, más específicamente, coloque un token entre $$ para hacerlo único; también puede usar $ -quotes dentro del cuerpo de la función. Lo hago mucho, en realidad.

CREATE OR REPLACE FUNCTION check_phone_number(text) 
    RETURNS boolean 
AS 
$func$ 
BEGIN 
... 
END 
$func$ LANGUAGE plpgsql STRICT IMMUTABLE; 

Detalles:

En cuanto a su segunda pregunta:
leer el más excelente manual on CREATE FUNCTION para entender la última línea de su ejemplo.

+1

Se supone que debes decir * fine manual *, RTEM simplemente no tiene el anillo derecho :) –

+0

@muistooshort: Mi problema es intentar una variación del tema que parece haberse roto la armonía ¿Cómo te gusta RTMEM? :) –

+1

Intenté gritar y simplemente no era lo mismo.Aunque, hay algunas situaciones en las que la cortesía cuenta. –

17

$$ es un delimitador que se utiliza para indicar dónde comienza y finaliza la definición de la función. Considere lo siguiente,

CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS> 

La creación de la función de sintaxis es similar, pero ya que se van a utilizar todo tipo de SQL en la función (sobre todo al final de la declaración; caracteres), el analizador dispararía si no lo hiciste t lo delimita. Por lo que debe leer su estado de cuenta como:

CREATE OR REPLACE FUNCTION check_phone_number(text) 
RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE; 

El material después de la definición real son opciones para dar la base de datos más información acerca de su función, por lo que puede optimizar su uso.

De hecho, si mira en "4.1.2.2 Constantes de cadenas entrecomilladas en dólares" en el manual, verá que incluso puede usar caracteres entre los símbolos en dólares y que todo contará como un delimitador.

Cuestiones relacionadas