database - español - stored procedure sql tutorial
Mejores lenguajes que SQL para procedimientos almacenados (7)
DB2 para Z / OS es la base de datos que admite la mayoría de los lenguajes que yo conozco. Es compatible con COBOL, C / C ++, JAVA como el procedimiento de la tienda, por supuesto, también es compatible con el procedimiento de SQL.
Cada vez me siento más frustrado con las limitaciones y la verbosidad necesarias para realmente comprometer cierta lógica de negocios con los procedimientos almacenados, usando lenguajes como Transact-SQL o PL / SQL. Me encantaría convertir algunas bases de datos actuales a Oracle y aprovechar su compatibilidad con los procedimientos almacenados de Java, pero esa opción no está disponible en este momento.
¿Qué alternativas recomendaría en el camino de las bases de datos que admiten procedimientos almacenados en otros idiomas?
Oracle admite procedimientos almacenados CLR para que pueda escribir procesos almacenados en cualquier lenguaje .NET como C #, VB.NET o IronPython. Esto solo funciona cuando el servidor de la base de datos se ejecuta en una máquina con Windows. No puede hacerlo cuando la base de datos se ejecuta en Linux o Unix.
PostgreSQL tiene soporte para muchos procedimientos de lenguaje de scripting. Oficialmente Perl, Python y Tcl. Como complementos, PHP , Ruby , Java y probablemente muchos otros (solo Google para pl <languagename>) que pueden o no estar en condiciones de trabajo a partir de ahora.
Ah, y también SQL Server 2005 en adelante tiene soporte para procedimientos almacenados CLR , donde puede usar lenguajes .NET.
También hay algo de apoyo para escribir procedimientos almacenados de Oracle en Perl .
Debido a que Oracle tiene una JVM incorporada, puede desarrollar procs almacenados en Java pero también en lenguajes no-java que usan la JVM, lo que significa idiomas como JACL, JYTHON, SCHEME y GROOVY. Vea aquí: http://db360.blogspot.com/2006/08/oracle-database-programming-using-java_01.html y http://en.wikipedia.org/wiki/List_of_JVM_languages .
Existen algunos obstáculos arquitectónicos para tener lenguajes de consulta más inteligentes en un administrador de base de datos. El principal es el optimizador de consultas. Una de las limitaciones de diseño en SQL es que solo puede usar construcciones accesibles para el optimizador de consultas. Esto significa que el lenguaje y sus capacidades están estrechamente relacionados con las capacidades del motor de ejecución de consultas y el optimizador de planes de consultas.
La otra limitación principal del diseño es la naturaleza mecánica del sistema de base de datos: la programación de la base de datos es casi única ya que tiene un componente mecánico. El rendimiento de las consultas está limitado por las limitaciones mecánicas de las búsquedas de cabezales de disco y la latencia rotacional (el tiempo de espera antes de que los datos que desea lleguen a los encabezados).
Esto efectivamente evita muchas abstracciones inteligentes que podrían hacer que SQL sea más poderoso o más fácil de usar. Muchos sistemas de administración de bases de datos complementan el SQL con alternativas de procedimientos que pueden usarse para crear scripts. Sin embargo, interactúan con el DBMS al ejecutar una serie de consultas SQL que el optimizador procesa individualmente. Algunos idiomas de este tipo que se envían con diversas plataformas DBMS son:
PL / SQL de Oracle y Java incrustado . PL / SQL en realidad se basa en Ada; es bastante "vieja escuela" para los estándares modernos y tiene una base de código heredada con la que debe permanecer compatible hacia atrás. No es necesariamente el entorno de programación más agradable, pero tiene construcciones para instalaciones como el paralelismo y un sistema de tipos razonablemente flexible. Una de las principales críticas de los procedimientos almacenados de Java en Oracle es que está pagando por la licencia basada en capacidad de Oracle en la CPU en la que está ejecutando la JVM.
Integración CLR de SQL Server. Algo similar a los procedimientos almacenados Java de Oracle, esto permite que los módulos CLR compilados desde C # (o cualquier lenguaje .net) se carguen en una instancia de SQL Server y se ejecuten de la misma manera que los procedimientos almacenados. SQL Server también tiene API de estilo PostgreSQL para hacer funciones agregadas personalizadas a través de la integración CLR y otros enganches para bases de código SQL / CLR mixto.
PostgreSQL es en realidad el sistema en el que originalmente se desarrolló la integración del lenguaje de fondo. El sistema exporta una C API nativa con funciones para funciones agregadas personalizadas, motores de almacenamiento, extensiones de procedimientos y otras funcionalidades. Las interfaces de idiomas se basan en esta API e incluyen: PL / pgSQL (un lenguaje personalizado similar a PL / SQL), Python , Perl y Tcl .
Esto lo convirtió en la corriente principal a través de Illustra , una versión comercializada de Postgres, que luego fue comprada por Informix (que posteriormente fue comprada por IBM). Las características clave se incorporaron a Informix On-Line , que aún es vendido por IBM.
Una limitación clave de estos lenguajes es su interacción limitada con el optimizador de consultas (aunque la API C para PostgreSQL sí admite esto). La participación en un plan de consulta como ciudadano de primera clase requiere que el optimizador de consultas pueda obtener una visión sensata de los recursos que tomará su acción. En la práctica, este tipo de interacción con el optimizador de consultas es principalmente útil para implementar motores de almacenamiento.
Este nivel de búsqueda en el motor de almacenamiento es (a) algo esotérico si la funcionalidad está disponible (por lo que la mayoría de las personas no tendrán la habilidad para hacerlo) y (b) probablemente sea más problemático que solo escribir la consulta en SQL. . Las limitaciones del optimizador de consultas significan que probablemente nunca obtendrá el nivel de abstracción de SQL que podría obtener de (digamos) Python o incluso C # o Java.
Es probable que la ruta de menor resistencia para consultas eficientes sea escribir la consulta en SQL con algún pegamento de procedimiento en uno de los otros idiomas. En algunos casos, un cálculo realmente se presta a un enfoque de procedimiento.
Esto puede convertirse en una molestia y conducir a grandes cuerpos de código SQL repetitivo. Las únicas opciones reales para esto son sistemas de generación de códigos o SQL codificados a mano. Un ejemplo trivial de generación de código es la funcionalidad CRUD proporcionada por los marcos donde este SQL se genera a partir de metadatos. Se puede ver un ejemplo más complejo en herramientas de ETL como Oracle Warehouse Builder o Wherescape Red, que funcionan generando grandes reglas de código de procedimiento almacenado del modelo.
Me encuentro construyendo sistemas de generación de código de un tipo u otro de forma semi-regular precisamente por esta razón. Cualquier sistema de plantillas servirá para esto: he tenido bastante buen rendimiento de CherryTemplate, pero hay muchos de estos artículos. Code Generation in Action es un buen libro sobre este tema: el autor usa un sistema basado en ruby cuyo nombre se me escapa.
Editar: Si observa un ''Mostrar plan de ejecución estimado'' para un bloque de código de procedimiento, notará que cada enunciado tiene su propio plan de consulta. El algoritmo de optimización de consultas solo puede funcionar en una única instrucción SQL, por lo que un procedimiento tendrá un bosque de planes de consulta. Debido a que el código de procedimiento puede tener " efectos secundarios ", no puede usar el tipo de algoritmo utilizado en la optimización de consultas para razonar sobre el código. Esto significa que un optimizador de consultas no puede optimizar globalmente un bloque de código de procedimiento. Solo puede optimizar declaraciones SQL individuales.