Escolar Documentos
Profissional Documentos
Cultura Documentos
1 – Introducción
2 – Estructura de los bloques PL/SQL
3 – Unidades léxicas
4 – Declaración de variables
5 – Tipos de datos
6 – Estructuras de control
6.1 – Condicional
6.2 – Repetitivas
6.3 – Salto
6.4 – Otros
1 – Introducción
1º) Bloque anónimos: Se construyen de manera dinámica y se ejecutan una sola vez.
2º) Bloques nominados: Son bloques anónimos q tienen las mismas características pero
que tienen una etiqueta que permite diferenciarlos.
1
4º) Disparadores o Triggers: Son bloques nominados que se almacenan y se ejecutan
múltiples veces, pero esta ejecución se produce de manera implícita cada vez que tiene
lugar un suceso de disparo. En nuestro caso el suceso es siempre una sentencia DML.
Todos los bloques tienen tres secciones diferenciales: Sección Declarativa, Sección
Ejecutable y Sección de Tratamiento de Excepciones. La única obligatoria es la Sección
Ejecutable siendo opcionales las otras dos.
SINTAXIS:
DECLARE
/* Declaraciones */
BEGIN
/* Sentencias ejecutables */
EXCEPTION
/* Captura y tratamiento de excepciones */
END;
3 – Unidades léxicas
• Identificadores: Se inician con una letra que puede ir seguida de cero o más
letras o números, $, _, o #. La longitud máxima es de 30 caracteres. No
discrimina entre mayúsculas y minúsculas. Si se quiere identificas entre
mayúsculas y minúsculas incluir los caracteres prohibidos o encerrando la
definición entre comillas dobles (“un numero”, “B/N”).
2
- Numéricos: Son valores enteros o reales que pueden ser asignados a una
variable de tipo NUMBER sin conversión. No permite el uso del punto
en un literal entero.
- Booleanos: Solo pueden tomar tres valores (true, flase, null). Sólo
pueden ser asignados a una variable booleana. Se usan básicamente en
las condiciones de las sentencias condicionales repetitivas.
- Monolínea: -- comentario
- Multilínea: /* comentario */
4 – Declaración de variables
SINTAXIS
Ejemplo:
DECLARE
V_descripcion VARCHAR2(50);
V_cont BINARY_INTEGER :=0 ;
V_sino BOOLEAN;
BEGIN
/* Sentencias ejecutables */
END;
Características:
5 – Tipos de datos
• Ámbito y visibilidad:
Una variable, declarada en un bloque es considerada local para ese bloque y global para
todos sus subloques. Por tanto una variable definida en el bloque externo puede ser
referenciada desde un bloque interno. Si en el bloque interno se ha definido una variable
con el mismo nombre que utilizado en el bloque exterior, esta variable local oculta a la
3
variable local. Pero podemos diferenciar a la variable más externa anteponiéndola el
nombre del bloque exterior al que pertenece, si el bloque fuera nominado.
etiqueta_bloque_externo.id_variable
<<etiqueta>>
Ejemplo:
<<Bloque1>>
DECLARE /*1*/
V_bandera BOOLEAN;
V_NSS NUMBER(9);
BEGIN/* 1 */
/* Sentencias */
DECLARE /*2*/
V_NSS CHAR (11);
V_fecha_inicio DATE;
BEGIN /*2*/
/* Sentencias */
END; /*2*/
END Bloque1;
En muchos casos las variables PL/SQL se emplean para manipular los datos
almacenados en una tabla de la BD. En este caso la variable que alberga el dato debe de
tener el mismo tipo que la columna de la tabla. Si la cantidad de código es grande, el
proceso puede llevar mucho tiempo y ser fuente de errores.
PL/SQL proporciona la herramienta %TYPE, que añadida al final del nombre de una
columna de una tabla o incluso de una variable previamente declarada, devuelve el tipo
de la misma.
id_variable id_tabla.id_columna%TYPE;
Ejemplo:
DECLARE
V_DNI VARCHAR2 (9);
V_DNI2 USUARIOS.DNI%TYPE;
6 – Estructuras de control
SINTAXIS:
4
IF condición THEN
Sentencia;
[ELSIF condición2 THEN
Sentencias2;
ELSE
Sentencias3;]
END IF;
EJEMPLO:
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
V_num NUMBER := '&Numero';
BEGIN
IF MOD(V_num, 2) = 0 THEN
DBMS_OUTPUT.PUT_LINE ('El número '|| V_num ||' es PAR');
ELSE
DBMS_OUTPUT.PUT_LINE ('El número '|| V_num ||' es IMPAR');
END IF;
END;
/
SELECT..INTO
SELECT lista_items
INTO lista_variables
FROM tablas
WHERE condición;
5
Ruben
V_antiguedad := TRUNC(MONTHS_BETWEEN (SYSDATE,V_fecha_alta)/12);
IF V_antiguedad > 6 THEN v_ing:=1.02;
ELSIF V_antiguedad >4 THEN v_ing:=1.025;
ELSIF V_antiguedad <=4 THEN v_ing:=1.03;
END IF;
UPDATE USUARIOS
SET cuota_socio = cuota_socio * v_ing;
dbms_output.put_line ('La antiguedad es: '||V_antiguedad);
dbms_output.put_line ('La cuota actual es: '||V_cuotaActual);
END;
6.2 – Repetitivas
a) Simples:
LOOP
6
SentenciasEXIT WHEN CONDICIÓN;(depende de dónde se coloque así funcionará)
END LOOP;
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
V_cont BINARY_INTEGER :=0;
K_salida CONSTANT NUMBER := 10;
BEGIN
LOOP
V_cont := V_cont +1;
dbms_output.put_line(V_cont);
EXIT WHEN V_cont = K_salida;
END LOOP;
END;
/
OTRO EJEMPLO:
Crear una tabla física(Temp_table) con dos columnas, una debe de ser numérica(n_col)
y otra de que coja 100 caracteres (Char_col). Escribir en la tabla la suma acumulada de
los primeros 30 números naturales en la columna numérica. En la columna de caracteres
debe de ir poniendo Vuelta1, Vuelta 2, Vuelta 3,...
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
V_sum NUMBER :=0;
V_cont BINARY_INTEGER :=0;
K_salida CONSTANT NUMBER := 30;
BEGIN
LOOP
V_cont := V_cont + 1;
V_sum := V_sum + V_cont;
INSERT INTO temp_table (n_col,char_col)
VALUES (V_sum, 'Vuelta '||V_cont);
EXIT WHEN V_cont = K_salida;
END LOOP;
COMMIT;
END;
b) While:
7
EJEMPLO:
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
V_cont BINARY_INTEGER :=0;
V_sum NUMBER :=0;
K_salida CONSTANT NUMBER :=50;
BEGIN
dbms_output.put_line('Cálculo de la suma de los ' ||K_salida||' primeros nº naturales');
WHILE (V_cont < K_salida) LOOP
V_cont:= V_cont + 1;
V_sum := v_sum + V_cont;
INSERT INTO temp_table (char_col, n_col)
VALUES( 'Item '||V_cont, V_sum);
END LOOP;
dbms_output.put_line('Suma '||V_sum);
END;
/
OTRO EJEMPLO: Programa que lea un número por teclado y diga el número de veces
que es divisible por dos.
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
V_cont BINARY_INTEGER :=0;
V_num NUMBER := '&Introduce_Numero'; --variable q mete el usuario
K_par CONSTANT NUMBER :=2;
BEGIN
WHILE MOD(V_num, K_par)=0 LOOP
V_cont := V_cont + 1;
V_num := V_num / K_par;
END LOOP;
dbms_output.put_line('Es divisible ' ||V_cont||' veces');
END;
c) For numércos:
Es un bucle en el que conocemos a priori las veces que se va a repetir, pues conocemos
el valor inicial y el valor final.
Los límites del bucle se examinan una sola vez y determinan el número total de
iteraciones. Por defecto el contador del bucle, se inicializa al límite inferior y se
incrementa en una unidad en cada iteración del bucle hasta llegar al límite superior. Si
se incluye la palabra reverse, el índice del bucle realiza las iteraciones desde el límite
superior hasta el límite inferior.
8
Los límites superior e inferior, no tienen porqué ser literales numéricos. Pueden ser
cualquier expresión PL/SQL que pueda ser convertida a un valor numérico. El índice
del bucle, se declara implícitamente como BINARY INTEGER, no siendo necesario
declararlo, ya que si se declara, el índice del bucle ocultará la declaración externa de
dicho contador o variable que hayamos declarado.
El REVERSE vale para cambiar el orden del bucle, del valor inicial al valor final.
EJEMPLO: Programa que pida un número del 1 al 10 por teclado y escriba la cuenta
atrás desde dicho número.
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
V_num NUMBER:='&Numero ';
BEGIN
FOR V_cont IN REVERSE 1..V_num LOOP --Muestra desde el número introducido hasta el 1
dbms_output.put_line (V_cont);
END LOOP;
dbms_output.put_line('YA ESTAAA!!');
END;
/
--(hacerlo por separado) una vez hecho todo esto le meto el UNDEF
UNDEF numero; --Para volver a ejecutar el programa y que nos pida un nuevo número
CLEAR BUFF;
SET SERVEROUTPUT ON;
DECLARE
BEGIN
FOR V_cont IN REVERSE 1..10 LOOP --coge las 10 1ªs filas
UPDATE temp_table
SET n_col = n_col/2
WHERE V_cont = to_number(SUBSTR(char_col,7,length (char_col)));
--pasa a numero entero la cadena
END LOOP;
dbms_output.put_line('TACHAAAN!!');
END;
/
9
6.3 – Salto
6.4 – Otros
10