Cláusula DECLARE en PL/SQL

El propósito de la cláusula DECLARE es definir cualquier objeto interno que necesitaremos durante el programa. Dichos objetos los podemos clasificar en:

Variables, con su tipo de dato correspondiente
Boolean, que solo puede contener los valores TRUE, FALSE o NULL
Constantes, elementos a los que se les asigna un valor y ya no se puede cambiar después
Record, estructura de una tabla en una base de datos
Table, estructura que almacena en memoria elementos a modo de tabla
Tipos definidos por el usuario, combinando tipos de objeto predefinidos

Hay ciertas reglas para nombrar estos objetos, por ejemplo que la longitud debe ser como máximo 30 caracteres. Hay caracteres permitidos ($, #, _) y prohibidos (&, -, /, espacios en blanco).

Los tipos de datos que más habitualmente necesitaremos para nuestras variables son los esperados:
DATE, BOOLEAN, CHAR, VARCHAR2, NUMBER(precisión, escala), PLS_INTEGER, BINARY_FLOAT, BINARY_DOUBLE y ROWID(ID de una fila en una base de datos).

Al declarar una variable podemos asignarle un valor inicial por defecto. Hay 2 formas idénticas para hacerlo.  Además podemos obligar a que una variable nunca pueda contener valores nulos (en estos casos obligatoriamente tendremos que asignar un valor al declararlas). Veamos algunos ejemplos:


Al ser PL/SQL un lenguaje de programación integrado en las bases de datos ORACLE, era de esperar que el programador tuviera atributos de tipos de dato tan interesantes como %TYPE %ROWTYPE.  Profundicemos un poco más en estas características. En la tabla "Employee" uno de los campos es "Salary", de tipo NUMBER(6). En nuestro programa tendremos que hacer un uso intensivo de valores de esta columna, así que lo primero que podríamos pensar es en definir una variable "SalarioEmpleado", como la del ejemplo anterior. Sin embargo lo recomendado es asociar dicha variable al tipo que tenga la columna en la tabla, usando %TYPE. El "siguiente nivel" sería asociar a una variable toda una fila de una tabla. Y para ello usamos %ROWTYPE.


Además el lenguaje soporta estructuras avanzadas específicas que representan tablas y registros: TYPE...TABLE y TYPE ... RECORD. Vamos a verlas en funcionamiento con algunos ejemplos:



Bucles y Ficheros de Código Fuente en PL/SQL

Hoy vamos a continuar viendo la sintaxis básica del lenguaje PL/SQL para gestionar bases de datos Oracle. En concreto analicemos el siguiente ejemplo cuya función es la de insertar un número determinado de registros, haciendo uso de un bucle de 1000 iteraciones:


Caso de necesitar que el índice del bucle vaya decrementándose, en vez de incrementándose, deberíamos usar la estructura FOR i IN REVERSE 1..1000 LOOP.


Otro ejemplo interesante sería un bucle "infinito" hasta que cierta condición se cumpla, desconociendo de antemano el número de iteraciones que se producirán. El equivalente al código de abajo sería con un WHILE NumRegsFaltan>10 LOOP:


Por último, y como parte de nuestras buenas prácticas, partiendo que los developers somos a veces un poco perezosos, nada como guardar nuestro código en SQL Developer. Démosle por ejemplo el nombre Emps1000.sql al fichero.Ahora cada vez que queramos ejecutar el fichero nos bastará con correr la siguiente sentencia en la Hoja de Trabajo:  @ Emps1000.sql;

Ultimas consultas ejecutadas en SQL Server

Algo que seguro todos hemos necesitado en algún momento es conocer de primera mano qué se ha ejecutado recientemente en nuestro SQL Server. Tan recientemente como sea posible... y si es de ahora mismo ¡mejor!. Espero que esta query os pueda ser útil:

SELECT deqs.last_execution_time AS [Time]dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs 
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handleAS dest
ORDER BY deqs.last_execution_time DESC



Obtener meses de un intervalo de fechas en T-SQL

Hoy se me planteó una cuestión en principio simple, que normalmente he resuelto a nivel de aplicación pero me preguntaba cómo sería el equivalente en T-SQL. El objetivo era listar el conjunto de meses comprendidos entre dos fechas cualesquiera sin usar ninguna tabla ni código que no fuera SQL al 100%. Una posible solución podría ser ésta, aunque se aceptan sugerencias de mejora por vuestra parte. Se devuelven los meses en formato AAAAMM y el intervalo pasado a la query está en formato AAAAMMDD.

Es interesante en esta query el uso de MAXRECURSION, cuya función es la de controlar el número de iteraciones y permitirnos hacer algún debug llegado el caso, pero que dejamos a 0 para que independientemente del número de meses resultantes no de ningún error como el siguiente (caso de poner un valor de 5 y como hemos visto antes en el ejemplo salían 16 registros):



Buscar en el Blog: