Vous êtes sur la page 1sur 40

BASE DE

DATOS II

Base de

Datos II
Bloques PL / SQL
Introduccin

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Agenda

Reconocer bloques y secciones bsicas de


PL/SQL.

Describir el rol de variables en PL/SQL.

Declarar Variables.

Ejecutar un bloque PL/SQL.

Descripcin de la importancia de la seccin


ejecutable.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Agenda

Escritura de sentencias en la seccin


ejecutable.

Ejecucin y prueba de un bloque PL/SQL.

Empleo de cursores en bloque PL/SQL.

Uso de los registros en bloques PL/SQL.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Estructura de un Bloque PL/SQL


DECLARE

-Opcional

Variables, cursores, excepciones definidas


por el usuario
BEGIN
- Sentencias SQL
- Sentencias PLSQL
EXCEPTION
Acciones a realizar cuando ocurren errores
END;

INGENIERA
DE SOFTWARE

Ejecutar Sentencias en Bloques


PL/SQL
DECLARE
v_variable VARCHAR2(5);
BEGIN
SELECT nombre_columna
INTO v_variable
FROM nombre_tabla;
EXCEPTION
WHEN nombre_excepcion THEN
...
END;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

BASE DE
DATOS II

Tipos de Bloques
Procedimiento

Annimo
[DECLARE]

Funcin

PROCEDURE nombre

FUNCTION nombre

IS

RETURN tipodato
IS

BEGIN
-- sentencias

BEGIN
-- sentencias

BEGIN
-- sentencias

[EXCEPTION]

[EXCEPTION]

[EXCEPTION]

END;

END;

END;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Tipos de Variables

Variables PL/SQL:

Escalares.

Compuestas.

Referencia.

LOB (large objects)

Variable No-PL/SQL:

INGENIERA
DE SOFTWARE

Enlace a variables del host.


Variable de sustitucin.

Variables iSQL*Plus en Bloques


PL/SQL

BASE DE
DATOS II

PL/SQL no tiene capacidad de entrada o


salida de por si.
Puede referenciar variables de sustitucin
dentro de un bloque PL/SQL con un
ampersand de precedencia.
Las variables host (o de enlace) de
iSQL*Plus se pueden usar para pasar valores
en tiempo de ejecucin fuera del bloque
PL/SQL de vuelta al entorno de iSQL*Plus.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Declaracin de Variables PL/SQL

Sintaxis
identificador [CONSTANT] tipodato [NOT NULL]
[:= | DEFAULT expr];

Ejemplos:
DECLARE
v_hiredate
v_deptno
v_location
c_comm

INGENIERA
DE SOFTWARE

DATE;
NUMBER(2) NOT NULL := 10;
VARCHAR2(13) := 'Atlanta';
CONSTANT NUMBER := 1400;

Inicializacin de Variables y Palabras


reservadas
Operador de asignacin (:=)
Palabra reservada DEFAULT
Restriccin NOT NULL
Sintaxis

identificador := expr

Ejemplos
v_hiredate := '01-01-2001';
v_ename := 'Mauro';

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

BASE DE
DATOS II

Declaraciones de Variables escalares

Ejemplos:

DECLARE
v_job
VARCHAR2(9);
v_count BINARY_INTEGER := 0;
v_total_sal NUMBER(9, 2) := 0;
v_orderdate DATE := SYSDATE + 7;
c_tax_rate
CONSTANT NUMBER(3, 2) := 8.25;
v_valid BOOLEAN NOT NULL := TRUE;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

El Atributo %TYPE

Declara una variable de acuerdo a:

Una definicin de columna de base de datos.

Otra variable declarada previamente.

Prefije %TYPE con:

Una tabla de base de datos y columna.

El nombre de variable declarada antes.

INGENIERA
DE SOFTWARE

Declaracin de Variables con el


Atributo %TYPE

Sintaxis
identificador Tabla.nombre_columna%TYPE;

Ejemplos:

v_name
v_balance
v_min_balance

INGENIERA
DE SOFTWARE

employees.last_name%TYPE;
NUMBER(7, 2);
v_balance%TYPE := 10;

BASE DE
DATOS II

BASE DE
DATOS II

Uso de Variables de enlace

Para referenciar una variable de enlace en


PL/SQL, debe prefijar su nombre con dos
puntos (:).
VARIABLE
g_salary NUMBER;
BEGIN
SELECT
salary
INTO
:g_salary
FROM
employees
WHERE
employee_id = 178;
END;
/
PRINT g_salary

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

DBMS_OUTPUT.PUT_LINE

Un procedimiento de paquete proporcionado por


Oracle. Es una alternativa para mostrar datos de un
bloque PL/SQL.
Se debe habilitar en iSQL*Plus con SET
SERVEROUTPUT ON.
SET SERVEROUTPUT ON
DEFINE p_annual_sal = 60000
DECLARE
v_sal NUMBER(9, 2) := &p_annual_sal;
BEGIN
v_sal := v_sal/12;
DBMS_OUTPUT.PUT_LINE (The monthly salary is ||
TO_CHAR(v_sal));
END;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Funciones SQL en PL/SQL: Ejemplos

Construya la lista de direcciones para su


compaa.
v_mailing_address :=

v_name||CHR(10)||
v_address||CHR(10)||v_state||
CHR(10)||v_zip;

Convierta el nombre de empleado a


minscula.
v_name

INGENIERA
DE SOFTWARE

:= LOWER(v_name);

BASE DE
DATOS II

Conversiones de Tipos de Datos

Esta sentencia produce un error de


compilacin si la variable v_date se
declara del tipo DATE.
v_date := 'January 13, 2001';

Para corregir el error, use la funcin


de conversin TO_DATE.
v_date := TO_DATE('January 13, 2001', 'Month DD, YYYY');

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Sentencia IF

Sintaxis:
IF condicin THEN
sentencias;
[ELSIF condicin THEN
sentencias;]
[ELSE
sentencias;]
END IF;

Si el nombre del empleado es Gietz, establezca el Manager ID


a 102.
IF UPPER(v_last_name) = GEITZ THEN
v_mgr := 102;
END IF;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Expresiones CASE

Un a expresin CASE selecciona un resultado y lo


retorna.
Para seleccionar el resultado, la expresin CASE usa
una expresin cuyo valor se usa para seleccionar
una de varias alternativas.
CASE selector
WHEN expresin1 THEN resultado1
WHEN expresin2 THEN resultado2
. . .
WHEN expresinN THEN resultadoN
[ELSE resultadoN+1;]
END;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Expresiones CASE: Ejemplo


SET SERVEROUTPUT ON
DECLARE
v_grade CHAR(1) := UPPER('&p_grade');
v_appraisal VARCHAR2(20);
BEGIN
v_appraisal :=
CASE v_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE('Grade: '|| v_grade || 'Appraisal '||
v_appraisal);
END;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Repeticiones bsicas

Sintaxis:
LOOP
sentencia1;
. . .
EXIT [WHEN condicin];
END LOOP;

condicin

INGENIERA
DE SOFTWARE

-- delimitador
-- sentencias
-- sentencia EXIT
-- delimitador

es una variable Boolean o


expresin (TRUE, FALSE o NULL);

BASE DE
DATOS II

Repeticiones bsicas

Ejemplo:
DECLARE
v_country_id
locations.country_id%TYPE := 'CA';
v_location_id
locations.location_id%TYPE;
v_counter
NUMBER(2) := 1;
v_city
locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id;
LOOP
INSERT INTO locations(location_id, city, country_id)
VALUES((v_location_id + v_counter), v_city, v_country_id);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 3;
END LOOP;
END;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Repeticiones WHILE

Sintaxis:
WHILE condicin LOOP
sentencia1;
sentencia2;
. . .
END LOOP;

La condicin es evaluada
al inicio de cada iteracin

Use la repeticin WHILE mientras una condicin sea TRUE.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Repeticiones FOR

Sintaxis:
FOR contador IN [REVERSE]
lmite_inferior .. lmite_superior LOOP
sentencia1;
sentencia2;
. . .
END LOOP;

Utilice una repeticin FOR para acortar la prueba de nmeros


de las iteraciones.

No declare el contador; se declara de manera implcita.

lmite_inferior . . lmite_superior es la sintaxis requerida.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Convenciones de nomenclatura
Identificador

Convencin Nombre

Ejemplo

Variable

v_name

v_sal

Constante

c_name

c_company_name

Cursor

name_cursor

emp_cursor

Excepcin

e_name

e_too_many

Tipo Tabla

name_table_type

amount_table_type

Tabla

name_table

countries

Tipo Registro

name_record_type

emp_record_type

Registro

name_record

customer_record

Variable de sustitucin de iSQL*Plus (parmetro de


sustitucin)

p_name

p_sal

Variable host o de enlace de iSQL*PLus

g_name

g_year_sal

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Cursor SQL

Un cursor es una estructura de control que


accede y procesa el rea de trabajo privada
de sentencias SQL.
Hay dos tipos de cursor.

Cursores implcitos.

Cursores explcitos.

El Oracle utiliza cursores implcitos para


verificar y ejecutar sus sentencias SQL.
Los cursores explcitos son declarados
expresamente por el programador.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Atributos de un Cursor SQL

Usando atributos de Cursor SQL puede probar la


salida de sus sentencias SQL.
SQL%ROWCOUNT

Nmero de filas afectadas por la sentencia de SQL ms


reciente.

SQL%FOUND

Atributo booleano que se evala a TRUE si la sentencia


SQL ms reciente afecta uno o ms registros.

SQL%NOTFOUND

Atributo booleano que se evala a TRUE si la sentencia


SQL ms reciente no afecta registro alguno.

SQL%ISOPEN

Siempre se evala a FALSE porque PL/SQL siempre cierra


los cursores implcitos inmediatamente despus que se
ejecutan.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Atributos de un Cursor SQL

Eliminar las filas que tienen el ID de empleado especificado


de la tabla EMPLOYEES. Imprima el nmero de filas
eliminadas.
Ejemplo
VARIABLE rows_deleted VARCHAR2(30)
DECLARE
v_employee_id employees.employee_id%TYPE := 176;
BEGIN
DELETE FROM employees
WHERE employee_id = v_employee_id;
:rows_deleted := (SQL%ROWCOUNT || ' row deleted.');
END;
/
PRINT rows_deleted

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Uso de cursores explcitos

Declarar y recorrer un cursor.


DECLARE
CURSOR emp_cursor IS
select empno, ename from emp;
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_empno,v_ename;
EXIT WHEN emp_cursor%NOTFOUND;
dbms_output.put_line(v_empno || ', ' || v_ename);
END LOOP;
CLOSE emp_cursor;
END;
/

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Uso de cursores explcitos

Uso de FOR con cursores explcitos.

DECLARE
CURSOR emp_cursor
IS
SELECT ename, sal
FROM emp
WHERE deptno = 10
ORDER BY sal DESC;
BEGIN
FOR emp_rec IN emp_cursor
LOOP
DBMS_OUTPUT.PUT_LINE
('Employee ' || emp_rec.ename || ' earns ' ||
TO_CHAR (emp_rec.sal) || ' dollars.');
END LOOP;
END;
/
INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Tipos de Datos Compuestos

Hay dos tipos:

PL/SQL RECORDs.

Colecciones PL/SQL.

Tabla INDEX BY
Tabla anidada
VARRAY

Contienen componentes internos.

Son reutilizables.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Registros PL/SQL

Deben contener uno o ms componentes de


cualquier escalar, RECORD,tipos de datos tabla
INDEX BY, campos nombrados.
Son similares en estructura a registros en un
lenguaje de tercera generacin (3GL).
No son los mismo que las filas en una tabla de base
de datos.
Trata una coleccin de campos como una unidad
lgica.
Son convenientes para volcar una fila de datos de
una tabla para su procesamiento.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Crear un Registro PL/SQL

Sintaxis:
TYPE nombre_tipo IS RECORD
(declaracin_campo [, declaracin_campo]);
identificador
nombre_tipo;

Donde declaracin_campo es:


nombre_campo {tipo_campo | variable%TYPE
| tabla.columna%TYPE | tabla%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Crear un Registro PL/SQL

Declare variables para almacenar el nombre,


puesto y salario de un nuevo empleado.
Ejemplo:

TYPE emp_record_type IS RECORD


(last_name
VARCHAR2(25),
job_id
VARCHAR2(10),
salary
NUMBER(8, 2));
emp_record
emp_record_type;

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

El Atributo %ROWTYPE
Declare una variable de acuerdo a
una coleccin de columnas en una
tabla o vista de base de datos.
Prefije %ROWTYPE con la tabla de
base de datos.
Los campos en el registro toman sus
nombres y tipos de datos de las
columnas de la tabla o vista.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

Ventajas de usar %ROWTYPE


El nmero y tipos de datos de las
columnas de base de datos
implicadas no necesita conocerse.
El nmero y tipos de datos de las
columnas de base de datos puede
variar durante la ejecucin.
El atributo es til cuando se recupera
una fila con la sentencia SELECT *.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

El Atributo %ROWTYPE

Ejemplos:
Declare una variable para almacenar la informacin de un
departamento de la tabla DEPARTMENTS.
dept_record

departments%ROWTYPE;

Donde variable para almacenar la informacin de un


empleado de la tabla EMPLOYEES.
emp_record

INGENIERA
DE SOFTWARE

employees%ROWTYPE;

BASE DE
DATOS II

El Atributo %ROWTYPE

Uso de cursores con %ROWTYPE.

DECLARE
CURSOR emp_cursor IS
select * from emp;
emp_rec emp%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
dbms_output.put_line(emp_rec.empno || ', ' || emp_rec.ename);
END LOOP;
CLOSE emp_cursor;
END;
/

INGENIERA
DE SOFTWARE

Sentencias de Control de
Transacciones

Inicie una transaccin con el primer


comando DML que requerir luego un
COMMIT o ROLLBACK.
Use las sentencias de SQL COMMIT y
ROLLBACK para terminar de manera
explcita una transaccin.

INGENIERA
DE SOFTWARE

BASE DE
DATOS II

BASE DE
DATOS II

Resumen
En esta sesin hemos aprendido lo siguiente:

Los bloques PL/SQL y el empleo de variables


escalares y compuestas.
Un bloque PL/SQL puede ser un bloque
annimo que puede acceder a uno o muchos
registros.
Elempleo de los cursores y el empleo de los
registros.

INGENIERA
DE SOFTWARE

Vous aimerez peut-être aussi