tutorial postgres pgsql espaƱol ejemplos sql function postgresql stored-procedures plpgsql

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'') o select 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 el language 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 y EXECUTE 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.