pgsql - pl sql postgresql ejemplos
Diferencia entre el lenguaje sql y el lenguaje plpgsql en las funciones de PostgreSQL (2)
Soy muy nuevo en el desarrollo de bases de datos, así que tengo algunas dudas con respecto a mi siguiente ejemplo:
Función f1 () - idioma sql
create or replace function f1(istr varchar) returns text as $$
select ''hello! ''::varchar || istr;
$$ language sql;
Función f2 () - idioma plpgsql
create or replace function f2(istr varchar)
returns text as $$
begin select ''hello! ''::varchar || istr; end;
$$ language plpgsql;
Ambas funciones se pueden llamar como
select f1(''world'')
oselect f2(''world'')
.Si llamo a
select f1(''world'')
la salida será:`hello! world`
Y salida para
select f2(''world'')
:ERROR: la consulta no tiene destino para los datos de resultados. Sugerencia: si desea descartar los resultados de un SELECCIONAR, use PERFORM en su lugar. CONTEXTO: función PL / pgSQL f11 (variación de caracteres) línea 2 en instrucción SQL ****** Error ******
Deseo saber la diferencia y en qué situaciones debo usar el
language sql
o ellanguage plpgsql
.
Cualquier enlace útil o respuestas con respecto a las funciones será muy apreciado.
Funciones de SQL
son la mejor opción:
Para consultas escalares simples . No hay mucho que planear, mejor guardar los gastos generales.
Para llamadas individuales por sesión . Nada que ganar del almacenamiento en caché de planes y declaraciones preparadas que PL / pgSQL tiene para ofrecer. Vea abajo.
Si normalmente se llaman en el contexto de consultas más grandes y son lo suficientemente simples para ser inlineados .
Por falta de experiencia con cualquier lenguaje de procedimiento como PL / pgSQL. Muchos conocen bien SQL y eso es todo lo que necesitas para las funciones de SQL. Pocos pueden decir lo mismo sobre PL / pgSQL.
Un código un poco más corto. Sin bloque arriba.
Funciones PL / pgSQL
son la mejor opción:
Cuando necesita algún elemento de procedimiento o variables que no están disponibles en funciones SQL, obviamente.
Para cualquier clase de SQL dinámico , donde
EXECUTE
yEXECUTE
sentencias dinámicamente. Se necesita cuidado especial para evitar la inyección de SQL. Más detalles:Cuando tiene cálculos que pueden reutilizarse en varios lugares y no se puede estirar un CTE para este propósito. En una función SQL, no tiene variables y se le obligará a calcular repetidamente o escribir en una tabla. Esta respuesta relacionada en dba.SE tiene ejemplos de código lado a lado para resolver el mismo problema usando una función SQL / una función plpgsql / una consulta con CTE:
Las asignaciones son algo más caras que en otros lenguajes de procedimiento. Adapte un estilo de programación que no use más asignaciones de las necesarias.
Cuando una función no puede estar en línea y se llama repetidamente. A diferencia de las funciones SQL, los planes de consulta pueden almacenarse en caché para todas las sentencias SQL dentro de las funciones PL / pgSQL ; se tratan como declaraciones preparadas , el plan se almacena en caché para llamadas repetidas dentro de la misma sesión (si Postgres espera que el plan en caché (genérico) rinda mejor que volver a planificar cada vez. Por eso, las funciones PL / pgSQL suelen ser más rápidas después las primeras dos llamadas en tales casos.
Aquí hay un hilo en pgsql-performance que analiza algunos de estos elementos:
Re: pl / pgsql funciones superando a los sql?Cuando necesitas atrapar errores
Para procedimientos de activación (que son solo funciones, también).
Considera también:
Para completar: para regresar realmente desde una función PL / pgSQL, podría escribir:
CREATE FUNCTION f2(istr varchar)
RETURNS text AS
$func$
BEGIN
RETURN ''hello! ''; -- defaults to type text anyway
END
$func$ LANGUAGE plpgsql;
Hay otras formas:
PL / PgSQL es un lenguaje de procedimientos específico de PostgreSQL basado en SQL . Tiene bucles, variables, manejo de errores / excepciones, etc. No todos los SQL son válidos PL / PgSQL: como descubriste, por ejemplo, no puedes usar SELECT
sin INTO
o RETURN QUERY
. PL / PgSQL también se puede usar en bloques DO
para procedimientos de una sola vez.
sql
funciones sql
solo pueden usar SQL puro, pero a menudo son más eficientes y son más fáciles de escribir porque no necesita un BEGIN ... END;
bloque, etc. Las funciones de SQL pueden estar en línea, lo que no es cierto para PL / PgSQL.
La gente a menudo usa PL / PgSQL donde SQL simple sería suficiente, porque están acostumbrados a pensar en procedimientos. En la mayoría de los casos, cuando cree que necesita PL / PgSQL, probablemente no lo haga. Las CTE recursivas, las consultas laterales, etc. generalmente satisfacen la mayoría de las necesidades.
Para más información ... vea el manual.