postgresql - type - Podría referirse a una variable PL/pgSQL o una columna de tabla
postgresql select record type (2)
En casos como estos, donde el código es lo suficientemente simple y directo, a veces es útil confiar en uno de estos comandos especiales de plpgsql al comienzo del texto de la función:
#variable_conflict error
#variable_conflict use_variable
#variable_conflict use_column
En este caso, se utilizaría de la siguiente manera:
CREATE OR REPLACE FUNCTION core.date_bs_from_ad(date_in_ad date)
RETURNS character varying AS
$$
#variable_conflict use_column
BEGIN
RETURN(
SELECT date_in_bs FROM core.date_conversion
WHERE date_in_ad = $1
);
END
$$
Esto es especialmente útil para los casos en que el conflicto no es con los parámetros, sino con los nombres de columnas de salida, como este:
CREATE OR REPLACE FUNCTION core.date_bs_from_ad(p_date_in_ad date)
RETURNS TABLE (date_in_bs character varying) AS
$$
BEGIN
RETURN QUERY
SELECT date_in_bs FROM core.date_conversion
WHERE date_in_ad = p_date_in_ad;
END;
$$
La función anterior fallará porque el compilador no puede decidir si date_in_bs
es el nombre de la variable de salida o una de las columnas de core.date_conversion
. Para problemas como estos, el comando #variable_conflict use_column
realmente puede ayudar.
Tengo una función en pgsql
CREATE OR REPLACE FUNCTION core.date_bs_from_ad(date_in_ad date)
RETURNS character varying AS
$$
BEGIN
RETURN(
SELECT date_in_bs FROM core.date_conversion
WHERE date_in_ad = $1
);
END
$$
LANGUAGE plpgsql;
Se crea sin errores, pero cuando uso esta función a través del siguiente error:
ERROR: column reference "date_in_ad" is ambiguous
LINE 3: WHERE date_in_ad = $1
^
DETAIL: It could refer to either a PL/pgSQL variable or a table column.
QUERY: SELECT (
SELECT MAX(date_in_bs) FROM core.date_conversion
WHERE date_in_ad = $1
)
CONTEXT: PL/pgSQL function core.date_bs_from_ad(date) line 3 at RETURN
********** Error **********
ERROR: column reference "date_in_ad" is ambiguous
SQL state: 42702
Detail: It could refer to either a PL/pgSQL variable or a table column.
Context: PL/pgSQL function core.date_bs_from_ad(date) line 3 at RETURN
Existe una colisión entre el identificador de SQL y la variable PlpgSQL. No hay limpia, ¿qué quieres? Usted escribió un predicado, eso es VERDADERO siempre.
Buen uso:
- prefijo (generalmente "_") para variables locales
- nombres calificados en SQL incorporado, como table_name.column_name
Así que ambas técnicas (solo una es necesaria)
CREATE OR REPLACE FUNCTION core.date_bs_from_ad(_date_in_ad date)
RETURNS character varying AS $$
BEGIN
RETURN SELECT dc.date_in_bs
FROM core.date_conversion dc
WHERE dc.date_in_ad = _date_in_ad;
END
$$ LANGUAGE plpgsql;
Para estas funciones de una línea es mejor el lenguaje SQL:
CREATE OR REPLACE FUNCTION core.date_bs_from_ad(_date_in_ad date)
RETURNS character varying AS $$
SELECT dc.date_in_bs
FROM core.date_conversion dc
WHERE dc.date_in_ad = $1;
$$ LANGUAGE sql;