Вы находитесь на странице: 1из 8

BASE DE DATOS

LABORATORIO 9
PL SQL

Contenido
1. Lenguaje de programación para sql
2. Estructura basica de pl/sql
3. Declaración de variables
4. Impresión en PL SQL
5. Almacenamiento de datos en variables
6. Manipulación de datos con SQL empotrado
7. Bifurcaciones condicionales (if)
8. Estructura case
9. Bucles incondicionales
10. Bubles condicionales
11. Buble for
12. Etiquetas
13. Registros
14. Tablas
15. Cursores
16. Excepciones

ING. Fernando Castillo R. 2010 - II


ecastillor@upao.edu.pe
LENGUAJE DE PROGRAMACIÓN PARA SQL
Oracle definió un lenguaje de programación de tercera generación, que admitía sentencias SQL
embebidas, madiante el cual se puede aplicar las estructuras típicas de un lenguaje de programación
(bifurcaciones, bucles, funciones…) a las sentencias SQL típicas.

Estructura Basica de PL/SQL


Cuando se escribe código en PL/SQL, este debe estar agrupado en unidades sin nombre usadas en
cualquier lugar del programa denominadas “bloques anonimos”.Un bloque de código puede
contener otros sub-bloques de código cada uno delimitado por las palabras reservadas BEGIN y
END.

Declaración de Variables
Las variables deben declararse dentro de la sección DECLARE
Los tipos de datos son todos aquellos válidos para SQL añadiendo algunos propios de PL/SQL.

Variables ancladas
VARIABLE1 number;
Variable2 VARIABLE1%TYPE ;

Asignaciones de valor
var_num1 := 100 ;
var_num2 := var_num1 ;
var_sum := var_num1 + var_num2 ;

Variables de host
VARIABLE g_mitad number

declare
v_monto number;
begin
v_monto:=&v_monto;
:g_mitad:=v_monto/2;
end;
/
SQL>PRINT g_mitad

2
Impresión en PL SQL
SET SERVEROUTPUT ON

declare
numero,doble number ;
begin
numero := &num ;
doble := numero * 2 ;
DBMS_OUTPUT.PUT_LINE(‘el doble de ‘||numero||’ es ‘||doble);
end;

Almacenamiento de datos en variables


declare
precio number;
begin
select p_price INTO precio from product where p_code=‘&p_code’;
dbms_output.put_line(precio);
end;

Manipulación de datos con SQL empotrado


declare
incremento number:=&incremento;
begin
update product set p_price=p_price+incremento where p_code=‘&p_code’;
end;

Bifurcaciones Condicionales (IF)


Como en cualquier lenguaje de programación, las estructuras IF se pueden anidar unas dentro de
otras.
declare
pago varchar2(10) := ‘&pago’ ;
monto number(8,2) := &monto ;
begin
IF ( pago=‘efectivo’ AND monto>=1000 ) THEN
dbms_output.put_line(‘tiene un descuento de’||monto*0.10);
ELSE
dbms_output.put_line(‘no tiene descuento’);
END IF;
end;

declare
meta constant number := 4 ;
total number ;
begin
select count(inv_number) into total
from invoice where inv_date='&inv_date';
IF total >= meta then
dbms_output.put_line('ventas por encima de la esperada');
ELSIF total >0 and total<meta then
dbms_output.put_line('ventas menores al esperada');
ELSE
dbms_output.put_line('no se realizaron ventas en el día');
END IF;
end;

3
Estructura CASE

Declare
v_categoria char := ‘&v_categoria’ ;
begin
CASE v_categoria
WHEN ‘a’ THEN
dbms_output.put_line(‘pension 1000’);
WHEN ‘b’ THEN
dbms_output.put_line(‘pension 750’);
WHEN ‘c’ THEN
dbms_output.put_line(‘pension 500’);
ELSE
dbms_output.put_line(‘pension 300’);
END CASE;
End;

Bucles Incondicionales

Las sentencias de dentro del bucle se ejecutarán durante un número indefinido de vueltas, hasta que
se cumple la condición del EXIT.

Declare
factorial number:=1;
numero number:=&numero;
Begin
LOOP
factorial:=factorial*numero;
numero:=numero-1;
EXIT WHEN numero=0;
END LOOP;
dbms_output.put_line(‘el factorial es’||factorial);
end;

Bubles Condicionales

declare
li number:=0;
ls number:=50;
n number:=0;
begin
WHILE li < 300 LOOP
select count(p_code) into n from product where p_price between li and ls;
dbms_output.put_line('hay'||n||'productos que cuestan entre'||li||'y'||ls);
li:= ls+1;
ls:= ls+50;
END LOOP;
end;

Buble FOR

Contador sera una variable de tipo entero capaz de contener los valores comprendidos entre
limite_inferior y limite_superior.

4
declare
contador number;
cantidad number;
suma number:=0;
begin
select count(*) into cantidad from invoice;
FOR contador in 1..cantidad LOOP
suma:=suma+contador;
END LOOP;
dbms_output.put_line (‘ventas promedio’||suma/cantidad);
end;

Etiquetas

Define un punto de salto de la ejecucion del programa hacia el lugar en donde esta ubicada la
etiqueta

Registros y Tablas

Existen dos tipos de datos especiales: los registros (o estructuras) y las tablas (o arrays o vectores).
Los dos tipos deben ser definidos como un nuevo tipo antes de declarar variables de ese nuevo tipo.

Una vez definido en nuevo tipo, ya se pueden definir variables de ese nuevo tipo

Registros

Los registros son agrupaciones de tipos de variables a los que se acceden con el mismo nombre

Para acceder a un campo de un registro


nombre_registro.nombre_campo

alumno.apellido_1

5
Tablas

Una tabla es una colección de elementos identificados cada uno de ellos por un índice.

El tamaño de la tabla se define durante la declaración de la variable.

El ejemplo define un tipo de arrayde enteros y después declara una variable de ese tipo,
inicializándola a 4 elementos (todos con 0).

Cursores
Recuperan fila a fila los resultados de una consulta select, para almacenarlos en variables para su
posterior tratamiento.
1. Declarar el cursor
Se define el nombre que tendrá el cursor y qué consulta SELECT ejecutará.

2. Abrir el cursor en el servidor


Ejecuta la sentencia SELECT y guardar su resultado dentro de tablas temporales.

3. Recuperar cada una de sus filas con un bucle

4. Cerrar el cursor

6
Declare
cursor c_ventas is select inv_number,inv_date from invoice;
v_factura invoice.inv_number%type;
v_fecha invoice.inv_date%type;
v_cantidad number:=0;
begin
open c_ventas;
fetch c_ventas into v_factura,v_fecha;
while c_ventas%found loop
v_cantidad:=v_cantidad+1;
dbms_output.put_line('factura'||v_factura||'fecha'||v_fecha);
fetch c_ventas into v_factura,v_fecha;
end loop;
dbms_output.put_line('ventas totales'||v_cantidad);
end;

Ejemplo con ROWTYPE


declare
product_rec product%rowtype;
begin
select * into product_rec from product where p_code = ‘&p_code’;
if product_rec.p_indate > sysdate-30 then
dbms_output.put_line(product_rec.p_descript||‘producto reciente’);
else
dbms_output.put_line(product_rec.p_descript||‘producto vencido’);
end if;
end;

Excepciones

Las excepciones deben ser declaradas dentro de la sección DECLARE, como una variable de tipo
exception

En el cuerpo del bloque de codigo se debe definir cuando debe ser lanzada, a través de la
instrucción RAISE.

Una vez que la excepción ha sido lanzada, la ejecución continua en la sección EXCEPTION,
concretamente en el manejador apropiado para la excepcion ocurrida (o el manejador WHEN
OTHERS cuando no exista el específico).

7
Ejemplo:
declare
codigo number:=&codigo;
nombre varchar(15);
contador number;
ex1 EXCEPTION;
begin
select count(*) into contador from customer where cus_code=codigo;
if(contador=0) then
RAISE ex1;
end if;
select cus_lname into nombre from customer where cus_code=codigo;
dbms_output.put_line(nombre);
EXCEPTION
WHEN ex1 THEN
dbms_output.put_line('codigo no existe, registrelo');
end;

Referencias
http://www-db.stanford.edu/~ullman/fcdb.html

Вам также может понравиться