Cuando usar un Stored Procedure y cuando no?..

3,925 views
Skip to first unread message

Analyzer

unread,
Feb 21, 2014, 12:41:41 PM2/21/14
to sgbd
En un grupo traen esta pregunta de si es bueno o no usar los SP.

Prefiero darle un enfoque más positivo al tema y preguntar:

¿Cuándo se debería usar un SP y cuando sería mejor usar el lenguaje de programación?..

Saludos!

Walter R. Ojeda Valiente

unread,
Feb 21, 2014, 2:43:00 PM2/21/14
to sistemas-gestores...@googlegroups.com

Es muy fácil. Siempre que necesites realizar alguna operación con tu Base de Datos (inserción, actualización, borrado, consulta) DEBES SÍ O SÍ usar un stored procedure.

Ganarás en seguridad, velocidad y confiabilidad.

Saludos.

Walter.

--
Has recibido este mensaje porque estás suscrito al grupo "Sistemas Gestores de Bases de Datos" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/sistemas-gestores-de-bases-de-datos.

Analyzer

unread,
Feb 21, 2014, 2:54:12 PM2/21/14
to sgbd
Un punto que se mencionaba es que cada motor tiene su propia sintaxis para los SP y esa era una desventaja.

¿Que hay de eso?


Saludos!

Walter R. Ojeda Valiente

unread,
Feb 21, 2014, 5:59:33 PM2/21/14
to sistemas-gestores...@googlegroups.com
Es cierto, hay diferencias porque cada motor tiene su propia sintaxis, pero no son tan grandes como para que una persona inteligente no pueda resolverlas en cuestión de minutos.

La programación en 3 capas es muy clara: una capa es la de datos, lo cual traducido significa: stored procedures para todas las inserciones, actualizaciones, borrados, y procesos que involucran a alguna tabla de la Base de Datos.

No necesitas un stored procedure o un trigger para verificar que la cantidad vendida sea mayor que cero, eso puedes hacerlo con tu lenguaje de programación. Pero si quieres saber cuanto se vendió entonces sí o sí (si eres un buen desarrollador, claro) utilizarás un stored procedure.

Si eres bueno, si entiendes bien el concepto de bases de datos, entonces en el código fuente que escribiste en tu lenguaje de programación solamente tendrás:
1. Llamadas a stored procedues
2. SELECT a vistas

Si tienes algo más, entonces aún eres un principiante o quizás un intermedio, pero es seguro que no eres un experto.

Jamás un experto escribiría comandos tales como INSERT, UPDATE, DELETE, SELECT a tabla, en un lenguaje de programación porque no obtendrá alguna ventaja de hacer eso y sí varias desventajas. Si usas stored procedures y vistas, obtienes:

a) Mayor velocidad de respuesta: porque todo lo que se procesa en el Servidor es siempre mucho más rápido que lo que se procesa en un programa. Además puedes monitorear si se usan índices o no, la velocidad en que se ejecutan, etc.
b) Mayor seguridad: porque puedes proteger a los datos encriptándolos, usando checksums, etc., nativamente
c) Mayor confiabilidad: porque jamás podrás grabar un stored procedure o una vista que tenga errores de sintaxis, tablas desconocidas, columnas inexistentes, etc. Por ejemplo, si en tu lenguaje de programación escribes SEEEEELECT * FROM MiTabla solamente notarás el error en tiempo de ejecución, en cambio si escribes eso dentro de un stored procedure o de una vista no podrás grabarlo y al instante verás el error y podrás corregirlo.

Otra ventaja de usar stored procedures y vistas es que pueden ser usadas desde cualquier lenguaje de programación, no tienes que estar reinventando la rueda. El mismísimo stored procedure o vista, sin singún cambio, puede ser llamado desde Visual FoxPro, Visual Basic, Python, C, C++, Delphi, PHP, etc., y eso es muy pero muy útil cuando se trabaja en grupo: cada quien programa en el lenguaje de su preferencia.

Saludos.

Walter.








Hay 10 clases de personas. Las que conocen aritmética binaria y las que no.

Jesús Israel Perales Martínez

unread,
Dec 1, 2015, 11:32:59 AM12/1/15
to sistemas-gestores...@googlegroups.com
Esto solo aplica para proyectos de Java EE

Buen día realmente estaba buscando como impacta un SP al uso de JPA y a lo que me comentas no encuentro ninguna ventaja en los stored para esta especificación de Java EE, ya que en Java EE comun mente se tiene un ORM (Hibernate), creo que esta aproximación es muy valida para los lenguajes de programación que mencionaste, incluido Java si no se utiliza un ORM, obviamente creo que tienes razon en el contexto que indicas pero no puedo darte la razón en un contexto donde se usan algunos de los frameworks mas utilizados en Java EE,comento esto para futuras referencias, ¿Pero que ventajas me ofrece un ORM que soporte JPA,JTA, entre otras API del estandar ?:

* Uso de JPQL (Java Persistence Query Language): http://docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html
  El uso de JPQL ayuda a la portabilidad de la base de datos es decir es posible cambiar de SQLServer a MySQL sin el esfuerzo que indicaria mover logica de negocios de una base de datos a otra, ademas son comprobados en tiempo de despliegue para validar que no exista errores de sintaxis y estan protegidos contra SQL injection, obviamente en una aplicación real y grande no quiere decir que solo tengamos consultas con JPQL, tambien soportan consultas nativas aunque estas no son comprobadas al momento del despliegue y tampoco son portables, lo mas recomendable es tener el 100% de tus consultas con JPQL, pero en el mundo real la relacion es 80-20, es decir 80% de las consultas en JPQL y 20% de las consultas en SQL nativo.

* Cache de segundo nivel. https://docs.oracle.com/javaee/6/tutorial/doc/gkjia.html
 El cache de segundo nivel ayuda a ahorrar recursos pues al utilizar esta API, internamente creara un cache a una consulta para ya no tener que ir a la base de datos
 es decir, no creara una conexion, no abrira una transaccion, no ejecutara la consulta, no cerrara la transaccion y no cerrara la conexion de esta forma podemos evitar consultas repetitivas que sabemos muy bien que nos regresaran los mismos datos.

* JTA
 Al utilizar JTA podemos ejecutar mas de una consulta a la base de datos en una misma transaccion de forma transparente, mas información aquí
http://www.arquitecturajava.com/el-concepto-de-java-jta/

* Uso de JNDI para la conexion a la base de datos mediante un DataSource.
  Al utilizar JNDI para la conexion a la base de datos delegas esa responsabilidad al servidor que contendra la aplicación(Tomcat, Jboss,wildfly,etc),esto
  también es de forma transparente y el servidor se encargara de crear un pool de conexiones, ademas la información usuario y password de la conexión no estaran en el código del proyecto.

* En JPA 2.1 es posible ejecutar SP de forma programatica y asi evitar la concatenacion de Strings entre otras mala practicas
 un ejemplo lo podemos ver aquí http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Stored_Proc/StoredProcedures.html

Para mas información y saber por donde empezar pueden descargar y leer un libro que trata los puntos mas importantes de estos temas ademas de algunos conceptos de SOLID
http://www.arquitecturajava.com/el-libro/

También adjunto un proyecto de ejemplo utilizando estas tecnologias para crear una API REST

https://github.com/ripper2hl/angular-todo

Saludos.
Jesus Perales.

Carlos Mendoza

unread,
Jul 31, 2017, 11:36:16 AM7/31/17
to Sistemas Gestores de Bases de Datos
Estas un poquito fuera de tiempo amigo, parece que no conoces el concepto de servidor de aplicaciones y cluster, imagino que no sabes de Internet Information Server(si piensas que es un hosting para paginas asp estas muy atrasado) o JBOSS, te olvidas de tecnologías como EJB o WCF, nunca vi una respuesta tan equivocada con una gran carga de arrogancia jajjajaja, debes de ser algún tipo de programador visual basic o peor aun foxpro jajajjaja, para que aterrices no se de donde sacas arquitectura de 3 capas, lo que hay es arquitectura N CAPAS con orientacion a dominio, y en ninguna de esas capas tienes a la base de datos, la base de datos es eso un almacén de datos nada mas, ahi te dejo un link https://blogs.msdn.microsoft.com/cesardelatorre/2010/03/11/nuestro-nuevo-libro-guia-de-arquitectura-n-capas-ddd-net-4-0-y-aplicacion-ejemplo-en-disponibles-para-download-en-msdn-y-codeplex/ para ver si te actualizas

Carlos Miguel FARIAS

unread,
Jul 31, 2017, 12:10:14 PM7/31/17
to sistemas-gestores...@googlegroups.com
Con referencia a la pregunta original, de cuando utilizar SP, la regla básica en función de velocidad es que un SP como mínimo debe reducir la transferencia de datos entre el SGBD y la capa de procesamiento/despliegue.
El SP te provee seguridad adicional del SGBD pero tiene que estar bien instrumentado.
Si utilizas SP te atas al SGBD porque no todos los SGBD usan el mismo lenguaje para escribir sus SP
Si utilizas las librerías de acceso a datos del lenguaje o framework de desarrollo, te atas a dichas librerías o framework.
Si escribes SQL en tu código tienes independencia de lenguaje y en general del SGBD.
Si no tienes pensado migrar de lenguaje o SGBD, el uso de librerias o framework o SP te van a dar ventajas de desarrollo en el los primeros casos (lbl, FW) o de velocidad-segurida con los SP
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe


Walter R. Ojeda Valiente

unread,
Jul 31, 2017, 1:09:17 PM7/31/17
to sistemas-gestores...@googlegroups.com
¡¡¡Cómo sabe Carlos Mendoza!!!

¡¡¡Me asombró su sapiencia!!!

¡¡¡Y seguramente voy a estar asombrado como mínimo durante 20 años más!!!

Bueno, ahora ya: modo sarcasmo OFF

:)

Saludos.

Walter.

Víctor Hugo Espínola Domínguez

unread,
Jul 31, 2017, 1:37:46 PM7/31/17
to sistemas-gestores...@googlegroups.com
>Estas un poquito fuera de tiempo amigo

Y sí, casi tres años y medio 😉

Saludos,
Víctor.
Lambaré - Paraguay.


Hernan Cano

unread,
Jun 17, 2022, 12:56:08 PM6/17/22
to Sistemas Gestores de Bases de Datos
Interesantes las apreciaciones tanto de Walter como de Carlos.

Ambas deber estar incluidas en un "catálogo de buenas prácticas".

Voy a grabarlas y tener esta información presente en mis desarrollos.

mhle...@gmail.com

unread,
Apr 11, 2023, 11:01:29 AM4/11/23
to Sistemas Gestores de Bases de Datos
Cómo puedo ejecutar/correr un SP desde visual FoxPro 9

Walter R. Ojeda Valiente

unread,
Apr 11, 2023, 8:02:07 PM4/11/23
to sistemas-gestores...@googlegroups.com
La forma exacta depende de tu motor SQL pero la idea es siempre la misma.

1. Te conectas a tu Base de Datos
2. Obtienes un "handle"
3. Usas ese "handle" para todas las demás operaciones que realizarás con tu Base de Datos
4. En una variable guardas la operación que deseas ejecutar
5. Usas la función SQLEXEC() para enviarle la solicitud al Servidor
6. Si la solicitud se realizó exitosamente, entonces obtendrás un cursor (o sea, una tabla .DBF pero temporal) y ese cursor contendrá la respuesta del Servidor.

Por ejemplo:

lcComando = "EXECUTE PROCEDURE GRABAR_VENTA(?VTC_FECHAX, ?VTC_TIPDOC, ?VTC_NRODOC, ?VTC_IDECLI)"

llComandoOK = SQLEXEC(gnHandle, lcComando) = 1

IF llComandoOK THEN
  && El comando tuvo éxito, aquí escribo lo que quiero
ELSE
  && Por alguna razón falló el comando
ENDIF

En lugar de EXECUTE PROCEDURE el comando podría llamarse CALL o de alguna otra forma, es la que reconoce tu motor SQL.

Otra alternativa es no enviar los parámetros con ? sino con <<>>, por ejemplo:

TEXT TO lcComando TEXTMERGE NOSHOW PRETEXT 15
  EXECUTE PROCEDURE  GRABAR_VENTA(<<VTC_FECHAX>>, <<VTC_TIPDOC>>, <<VTC_NRODOC>>, <<VTC_IDECLI)>>"
ENDTEXT

Saludos.

Walter.




--
Has recibido este mensaje porque estás suscrito al grupo "Sistemas Gestores de Bases de Datos" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a sistemas-gestores-de-ba...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/sistemas-gestores-de-bases-de-datos/9e043d8c-5d23-40e0-804f-2cba696d7850n%40googlegroups.com.

Hernan Cano

unread,
Apr 11, 2023, 11:20:30 PM4/11/23
to sistemas-gestores...@googlegroups.com
image.png

Reply all
Reply to author
Forward
0 new messages