Como escribir codigo SQL para compartir cursores

Hasta aqui hemos visto que son los cursores y los beneficios de compartirlos. Ahora bien, ¿que debe hacer un desarrollador para que las sentencias SQL que escribe se transformen en cursores reutilizables?

La siguiente, es una lista de requerimientos necesarios para poder compartir cursores:

  • Solamente las sentencias identicas pueden usar el mismo cursor
  • El texto de las sentencias deben ser exactamente iguales, incluyendo mayusculas, minusculas, espacios, tabulaciones, y comentarios.
  • Los objetos referenciados en las sentencias SQL deben resolverse a los mismos objetos de la base de datos
  • El tipo de datos de las variables de binding utilizados en las sentencias deben ser los mismos.

Veamos algunos ejemplos.

Ejemplo 1.

Si la cantidad de espacios en blanco es diferente entonces, para Oracle, las sentencias no son iguales.

a) select * from clientes where cliente_id = 34;
b) select *      from clientes where cliente_id = 34;

las sentencias a y b no son iguales, no comparten cursor.

Ejemplo 2

A la hora de evaluar la igualdad de dos sentencias Oracle es “case sensitive”. Por lo tanto mayusculas y minusculas son diferentes

a) select * from clientes where cliente_id = 34;
b) select * from CLIENTES where CLIENTE_ID = 34;

las sentencias a y b no son iguales, no comparten cursor.

Es importante aclarar que muchas herramientas reformatean las sentencias, quitando espacios, tabulaciones, etc, antes de enviarlas al motor de base de datos. Herramientas tales como PL/SQL, los precompiladores de Oracle y SqlPlus envian las sentencias SQL en el mismo formato en que es ingresado por el usuario, sin reformatear.

Ejemplo 3

Si los objetos pertenecen a diferentes usuarios, las sentencias no son identicas.

a) select * from clientes where cliente_id = 34; Usuario A ejecuta esta sentencia y en su esquema existe la tabla CLIENTES
b) select * from clientes where cliente_id = 34; Usuario B ejecuta esta sentencia y en su esquema existe la tabla CLIENTES

Si bien las sentencias a y b estan escritas de forma identica, no son iguales pues el motor resuelve los objetos referenciados como diferentes. La sentencia “a” hace referencia a la tabla CLIENTES del usuario A, la sentencia “b” hace referencia a la tabla CLIENTES del usuario B. En conclusion, las sentencias a y b no son iguales, por lo tanto no comparten cursor.

Ejemplo 4

a) select * from clientes where cliente_id = :a;
b) select * from clientes where cliente_id = :b;

Si bien a simple vista estas sentencias no son identicas, como utilizan variables de binding Oracle resuelve a ambas como:

select * from clientes where cliente_id = :b1

Si las variables a y b no tienen el mismo tipo de dato entonces no comparten el cursor.

Si el tipo de dato de las variables a y b es el mismo entonces comparten el cursor. No importa que los nombres de las  variables sea diferente, porque las variables de binding son renombradas internamente. La primer variable de binding pasara a llamarse  :b1, la segunda :b2 y asi sucesivamente.

Existen varias buenas practicas orientadas al desarrollo de sentencias SQL que reutilicen cursores y, por ende, hagan un uso eficiente de la memoria compartida:

  • Crear codigo generico utilizando stored procedures, packages y triggers
  • Definir estandares de codificacion en cuanto a mayusculas/minusculas, espacios en blanco, comentarios, uso de variables de binding
  • Utilizar variables de binding (bind variables)

En el proximo post veremos como el desarrollador puede monitorear el area de SQL compartida y verificar si efectivamente sus  cursores se estan o no compartiendo.

Anuncios

1 comentario

  1. Gracias por el artículo. Tengo una consulta, este comportamiento descrito en cada uno de los ejemplos, es usando el parámetro CURSOR_SHARING en qué valor? EXACT, SIMILAR O FORCE?

    Qué se recomienda para una aplicación cliente – servidor que tiene sentencias con variables BIND y otras tantas sin variables BIND.

    Mil gracias.


Comments RSS TrackBack Identifier URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s