¿Cuáles son las diferencias entre "Procedimientos almacenados" y "Funciones almacenadas"?

36

Entonces, un comentario de esta pregunta menciona que hay una ligera diferencia en "Procedimientos almacenados" y "Funciones almacenadas" en PostgreSQL.

El comentario enlaza con un artículo de Wikipedia, pero algo de esto no parece aplicarse (por ejemplo, que pueden usarse en una SELECTdeclaración).

La sintaxis en sí misma parece ser un poco confusa:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Usted crea un FUNCTIONpero se refiere a él como a PROCEDURE.

Entonces, ¿cuál es la diferencia entre estos dos?

DrColossos
fuente

Respuestas:

43

Oficialmente, PostgreSQL solamente tiene "funciones". Funciones de disparo se refieren a veces como "procedimientos de activación", pero que el uso no tiene un significado distinto. Internamente, las funciones se refieren a veces como procedimientos, como en el catálogo del sistema pg_proc. Eso es un vestigio de Postquel. Cualquier cuenta que algunas personas (posiblemente con experiencia en diferentes sistemas de bases de datos) podrían asociar con los procedimientos, tales como su relevancia para la prevención de las inyecciones SQL o el uso de los parámetros de salida, también se aplican a las funciones tal y como existen en PostgreSQL.

Ahora, cuando la gente en la comunidad de charla PostgreSQL sobre "Procedimientos almacenados" o "procedimientos reales almacenados", sin embargo, que a menudo significan una característica hipotética de un objeto función similar que puede iniciar y transacciones de alto en su cuerpo, algo que las funciones actuales no pueden hacer. El uso del término "procedimiento almacenado" en este contexto parece ser por analogía con otros productos de bases de datos. Vea esta lista de correo de rosca para una idea vaga.

En la práctica, sin embargo, esta distinción de función versus procedimiento en términos de sus capacidades de control de transacciones no es universalmente aceptada, y ciertamente muchos programadores sin sesgo en la base de datos tomarán una interpretación similar a Pascal de un procedimiento como una función sin valor de retorno. (El estándar SQL parece tomar un punto medio, ya que un procedimiento por defecto tiene un comportamiento de transacción diferente que una función, pero esto se puede ajustar por objeto). Entonces, en cualquier caso, y especialmente cuando se miran preguntas en Stack Exchange con un público muy variado, debe evitar asumir demasiado y utilizar términos más claros o definir las propiedades que espera.

Peter Eisentraut
fuente
14

En términos de DDL, Postgres no tiene objetos de procedimiento, solo funciones. Las funciones de Postgres pueden devolver valores o valores nulos para que asuman los roles de funciones y procedimientos en otros RDBMS. La palabra 'procedimiento' en el se create triggerrefiere a una función.

En términos de la documentación de Postgres, 'procedimiento' también es sinónimo del objeto de la base de datos llamado función, por ejemplo: " Se crea un procedimiento de activación con el comando CREATE FUNCTION ".

Los 'procedimientos' de activación tienen reglas particulares: deben declararse como una función sin argumentos y un tipo de activación de retorno . Ejemplo aquí .

Jack Douglas
fuente
8

Los términos "procedimiento almacenado" y "función almacenada" se usan indistintamente en PostgreSQL y generalmente se toman para significar lo mismo. Otras bases de datos pueden diferenciar entre un procedimiento y una función (al igual que VB diferencia entre subrutinas y funciones).

Mientras una función en PostgreSQL devuelva algo parecido a una tabla, puede usar la salida de esa función como si fuera una tabla estándar. La CREATE TRIGGERsintaxis es un poco confusa, pero sospecho que puede haber estado vigente antes de que se finalizara el estándar ANSI. Solo tengo una copia de SQL: 2003, así que no puedo hacer mucho más que especular por qué la nomenclatura es extraña.

versión DR; TL: con PostgreSQL "procedimiento" es equivalente a "función".

Jeremías Peschka
fuente
6

En MSSQL, un procedimiento almacenado es un conjunto pre-compilada de comandos SQL.
Un procedimiento almacenado:

 - puede tener muchos parametros de entrada y salida
 - se puede utilizar para modificar las tablas de bases de datos / estructuras de datos /
 - no se utilizan normalmente en el interior de inserción / actualización de declaraciones / borrar / seleccione
funciones definidas por el usuario vienen en varios sabores. Dependiendo del tipo de función escrita, funciones:
  - puede tener varios parámetros de entrada, pero sólo devolver un valor único (es decir, la concatenación de cadenas)
  - puede aceptar un conjunto como entrada, devolver un solo valor (es decir, dbo.FindLargestPig (ListOfPigs))
  - devolver una tabla (es decir, seleccionar * de dbo.ExplodeString ("esta es una lista de palabras"))
  - se puede utilizar en / insertar / actualizar / borrar las instrucciones de selección
  - No puede ser utilizado para modificar tablas de base de datos / estructuras /

datagod
fuente
5

La respuesta corta es que una función devuelve un valor, sino un procedimiento no lo hace.

Esa distinción estuvo presente en los módulos persistentes almacenados (SQL / PSM), que fue propuesto para SQL 1992. No sé si SQL / PSM jamás se ha hecho en las normas.

Mike Sherrill 'Recall Gato'
fuente
para el año 2003 creo
xenoterracide
Eso suena notablemente como la sintaxis de VB. Una función devuelve un valor y un procedimiento no (por lo que si usted tenía un valor de retorno de una función que explotaría en el compilador)
jcolebrand
@jcolebrand En realidad, los nombres son más aparentes en Pascal. Un procedimiento no devuelve un resultado, mientras que una función sí. Por razones históricas, VBA usa el lenguaje de FORTRAN, que los llama (¿llamado?) SUBROUTINA Y FUNCIÓN . Los lenguajes modernos de tipo C solo tienen funciones, pero los lenguajes mecanografiados tienen la opción de funciones nulas que son procedimientos con otro nombre. Una tendencia popular es usar funciones normales para todo y devolver algo que puede ignorarse si lo desea.
Manngo
2

Comparando la respuesta aceptada desde el nivel conceptual abstracto, entiendo la diferencia desde la funcionalidad y la perspectiva de entrada / salida. A continuación, utilicé sp yf para representar el procedimiento almacenado y la función, respectivamente.

  1. Uso en una expresión: sp no se puede usar en una expresión mientras que la función sí, lo que significa que puede usar su valor devuelto desde af dentro de otras declaraciones, como

    select * 
    from table 
    where col_a < (select col_A from f())
  2. devolver un valor: sp no devuelve automáticamente un valor a menos que especifique el tipo de retorno del refcursor , abra y devuelva un cursor; f devuelve el resultado en la última declaración donde se incrusta una cláusula 'return', como una cláusula select .

  3. devolver conjuntos de resultados únicos / múltiples: aquí los conjuntos de resultados hacen referencia a una lista de resultados que pueden diferir en formato, como un conjunto de enteros individuales, matriz de texto y dos tablas. sp puede devolver varios conjuntos siempre que especifique el tipo de retorno del refcursor, abra y devuelva un cursor. Sin embargo, f solo puede devolver un tipo de conjunto.

Por lo general, los procedimientos almacenados se utilizan para modificar los datos de la base de datos o la estructura donde no se necesita el valor de retorno, como eliminar, actualizar, eliminar , etc. o situaciones en las que se requieren conjuntos de resultados múltiples. La función, por otro lado, se elige principalmente para consultas simples.

Para obtener más detalles sobre mi explicación, consulte este enlace: Procedimientos almacenados y funciones en PostgreSQL

Franco
fuente