Saltar a contenido

SQL cl谩sico

Cursores

Los cursores SQL son una caracter铆stica esencial de los sistemas de gesti贸n de bases de datos relacionales del operacional que permiten procesar los resultados de las consultas fila por fila. Aunque SQL suele estar optimizado para operaciones basadas en conjuntos, hay situaciones en las que es necesario realizar operaciones fila por fila. En estos casos, los cursores permiten procesar cada fila individualmente. Es necesario debido a que muchos lenguajes de programaci贸n sufren de lo que en ingl茅s se conoce como impedance mismatch. Como norma general, los lenguajes de programaci贸n son procedurales y no disponen de ning煤n mecanismo para manipular en una sola instrucci贸n conjuntos de resultados de consultas (datasets). Debido a ello, las filas deben ser procesadas de forma secuencial por la aplicaci贸n. Un cursor puede verse como un iterador sobre la colecci贸n de filas que habr谩 en el conjunto de resultados

Prepared Statements

PrepStatement
Una prepared statement es un server-side object que puede utilizarse para optimizar el rendimiento. Cuando se ejecuta la sentencia PREPARE, la sentencia especificada es analizada y reescrita. Cuando, posteriormente, se emite un comando EXECUTE, la sentencia preparada se planifica y ejecuta. Esta divisi贸n del trabajo evita el trabajo repetitivo de an谩lisis sint谩ctico, al tiempo que permite que el plan de ejecuci贸n dependa de los valores espec铆ficos de los par谩metros suministrados

Las sentencias preparadas pueden tomar par谩metros: valores que se sustituyen en la sentencia cuando se ejecuta. Al crear la sentencia preparada, hace referencia a los par谩metros por posici贸n, utilizando $1, $2, etc. Opcionalmente, se puede especificar una lista correspondiente de tipos de datos de par谩metros. Cuando no se especifica el tipo de datos de un par谩metro o se declara como desconocido, el tipo se deduce del contexto en el que se hace referencia al par谩metro por primera vez (si es posible). Al ejecutar la sentencia, se debe especificar los valores reales de estos par谩metros

Las sentencias preparadas s贸lo duran lo que dura la sesi贸n actual de la base de datos. Cuando la sesi贸n finaliza, la sentencia preparada se olvida, por lo que debe volver a crearse antes de volver a utilizarse. Esto tambi茅n significa que una 煤nica sentencia preparada no puede ser utilizada por varios clientes simult谩neos de la base de datos. Sin embargo, cada cliente puede crear su propia sentencia preparada para utilizarla. Las sentencias preparadas pueden limpiarse manualmente mediante un comando DEALLOCATE

Las declaraciones preparadas funcionan, b谩sicamente, en dos pasos:

  1. Preparar: Se crea una plantilla de sentencia SQL y se env铆a a la base de datos. Ejemplo: INSERT INTO MisInvitados VALUES(?, ?, ?). La base de datos analiza, compila y optimiza la consulta de la plantilla de sentencia SQL y almacena el resultado sin ejecutarlo
  2. Ejecutar: Posteriormente, la aplicaci贸n asocia los valores a los par谩metros y la base de datos ejecuta la sentencia. La aplicaci贸n puede ejecutar la sentencia tantas veces como quiera con diferentes valores de los par谩metros

En comparaci贸n con la ejecuci贸n directa de sentencias SQL, las sentencias preparadas tienen tres ventajas principales:

  • Las sentencias preparadas reducen el tiempo de an谩lisis ya que la preparaci贸n de la consulta s贸lo se realiza una vez (aunque la sentencia se ejecute varias veces)
  • Los par谩metros vinculados minimizan el ancho de banda hacia el servidor, ya que s贸lo es necesario enviar los par谩metros cada vez, y no toda la consulta
  • Las sentencias preparadas son muy 煤tiles contra las inyecciones SQL, ya que no es necesario escapar correctamente los valores de los par谩metros, que se transmiten posteriormente utilizando un protocolo diferente. Si la plantilla original de la sentencia no se deriva de una entrada externa, no puede producirse la inyecci贸n SQL