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.
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.
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
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 .
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
fuente