IntroPL-SQL Sentencias
IntroPL-SQL Sentencias
MENSAJES
1
BLOQUES SQL
Un bloque SQL tiene tres partes: una declarativa, una ejecutable y una última para el manejo de instrucciones (warnings y
condiciones de error). De estas partes, sólo la parte ejecutable es obligatoria.
[ DECLARE
-- declaraciones]
BEGIN
-- sentencias
[EXCEPTION
-- manejo de excepciones]
END;
DECLARE
total number(6,2);
nombre varchar(30):= ‘JUANA’;
maximo CONSTANT number(4):=9999;
En la parte declarativa, las variables se pueden inicializar a un valor específico o no hacerlo, mientras que las constantes
han de ser inicializadas en la parte declarativa.
2
DECLARACIÓN de VARIABLES y CONSTANTES
Si necesitamos que el tipo de datos coincida con el definido para una columna de una tabla podemos utilizar %TYPE
El atributo %TYPE proporciona el tipo de dato de una variable o columna de la base de datos.
DECLARE
valor number(4,2);
auxvalor valor%TYPE;
auxcategoria habitacion.categoria%TYPE;
Utilizar el atributo %TYPE hace que no sea necesario conocer el tipo de dato exacto de una variable o columna, y por otro lado,
tiene la ventaja de que si la definición del tipo de datos de una columna cambia, el tipo de dato de la columna también cambia
automáticamente.
Si necesitamos definir una estructura similar a una fila de una tabla podemos utilizar %ROWTYPE
El atributo %ROWTYPE obtiene un tipo de registro que representa una fila de una tabla. Los campos del registro y las
correspondientes columnas de la tabla tienen el mismo nombre y el mismo tipo de datos
DECLARE
pvp pvptemporada%ROWTYPE;
Oracle utiliza áreas de trabajo para ejecutar sentencias SQL y almacenar la información procesada.
El uso de cursores permite dar nombre a un área de trabajo y acceder a la información almacenada en ella.
Ahora es como si el resultado de ejecutar la sentencia SELECT fuera una tabla llamada c1 que podemos ir recorriendo fila a fila.
Trabajando con OPEN, FETCH y CLOSE (aunque esta forma de trabajar con cursores es válida, recomendamos trabajar con cursores de un modo más sencillo, t
con CURSORES en BUCLE FOR, que se explica en el siguiente apartado)
Para trabajar con cursores se pueden utilizar los comandos OPEN, FETCH y CLOSE.
OPEN
Abre el cursor, es decir, ejecuta la consulta e identifica el resultado (las filas resultantes de la consulta).
Al ejecutar OPEN, las filas no se devuelven.
DECLARE
auxnum habitación.num%type;
auxsuperf habitación.superficie%type;
auxsupMin categoría.supMin%type;
CURSOR c1 IS SELECT num, superficie, supMin FROM habitación , categoría WHERE categoria=nombre;
BEGIN
OPEN c1;
… FETCH
FETCH c1 INTO auxnum, auxsuperf, auxsupMin; Permite devolver las filas del resultado.
Cada vez que se ejecuta FETCH el cursor
… CLOSE avanza a la siguiente fila del resultado.
CLOSE c1; Cierra el cursor. Una vez
… cerrado podría volver a abrirse.
END;
4
Para cada columna que se devuelve en la consulta asociada al cursor, tendremos que tener una variable después del INTO, con un
tipo de datos compatible.
Cada cursor tiene asociados cuatro atributos: %FOUND, %ISOPEN, %NOTFOUND, %ROWCOUNT
Tras abrir un cursor con OPEN y antes de que se haya hecho el primer FETCH
• el atributo %FOUND contiene NULL
• el valor de %ROWCOUNT es 0
Ejemplo:
Si c1 es un cursor que hemos definido, se podrían utilizar expresiones como
IF c1%FOUND THEN …
IF c1%ROWCOUNT >4 THEN …
5
Al trabajar con cursores, se puede simplificar el código utilizando un bucle FOR en lugar de OPEN, FETCH y CLOSE. El bucle FOR:
• abre implícitamente el cursor
CURSOR EN BUCLE FOR (en la asignatura definiremos de este modo los cursores)
• realiza FETCH repetidamente
• y cierra el cursor cuando todas las filas han sido procesadas.
En el bucle además de abrir el cursor se declara una variable (en el ejemplo que sigue regc1).
o Esta variable sólo puede ser utilizada dentro del bucle.
o Es una variable de tipo registro, cuyos campos tienen el mismo nombre y tipo de datos que las
columnas de la sentencia SELECT que figura en la definición del cursor.
o Si alguna de las columnas fuese calculada sería necesario que tuviese un alias en la sentencia SELECT
Ejemplo:
DECLARE
CURSOR c1 IS SELECT num, superficie, supMin FROM habitación , categoría WHERE categoria=nombre;