Curso SQL PLSQL
Curso SQL PLSQL
SQL
Temas del Curso
• Introducción a Oracle
• Objetos de la base de datos
• Terminología
• Dos Tipos de ordenes SQL
• SQL*Plus a Introducción
• Seleccionando columnas
• Seleccionando renglones
• Visualizando el diccionario de datos
• Nomenclatura para la creación de tablas y vistas
• Tipos de datos
• Constraints
• Creación de Tablas
• Modificación de Tablas
Temas del Curso
Continuación:...
• Definición de vistas
• Creación de vistas
• Vistas con alias para columnas
• Creación de vistas con WHIT CHECK OPTION
• Accesos a tablas y vistas
• Otorgando privilegios a tablas y vistas
• Sinónimos
• Creación de sinónimos
• Eliminar privilegios: REVOKE
• Índices
• Reglas para la creación de índices
• Creación de índices
• Eliminando índices
Temas del Curso
Continuación:...
• Tablas del diccionario de datos para índices
• Creación de secuencias
• Insertando datos
• Actualizando datos
• Borrando datos
• Proceso de transacciones
• Valores y funciones numéricas
• Referencia a valores y funciones numéricas
• Valores y funciones de fechas
• Referencia a valores y funciones de carateer
• Otras funciones
• Funciones de grupo
Temas del Curso
Continuación:...
• Comandos de SQL*Plus
• Creación de un archivo de reporte
• Consultas avanzadas
• Subconsultas
Introducción a Oracle
Objetos de la base de datos:
TABLE: Objeto de la base de datos que almacena los
datos.
VIEW: Permite ver una selección personalizada de una o
más tablas, utilizando una consulta SQL que se
almacena en la base de datos.
INDEX: Permite el acceso rápido a los datos en las
tablas.
SYNONYM: Es un nombre alternativo de un objeto de
base de datos
SEQUENCE: Genera números consecutivos, se puede
mantener la integridad de los datos.
Objetos de la base de datos
DATA DICTIONARY: Conjunto de tablas y vistas en las
cuales Oracle contiene información sobre las tablas
creadas por los usuario.
ROLE: Conjunto de privilegios que se agrupan y
conceden a los usuarios.
DATABASE LINK: Referencia a una base de datos
remota.
Terminología
DDL (Data Definition Languaje) . Sentencias SQL
que se usan para la creación de objetos en la
base de datos y para la administración de estos
(CREATE, ALTER, GRANT)
DML (Data Manipulation Languaje). Sentencias
SQL usadas para la manipulación de datos
(INSERT, UPDATE, DELETE).
COMMIT: Guarda los registros en la base de
datos.
ROLLBACK: Acción que realiza Oracle cuando se
realizan modificaciones a la base de datos y
luego se decide no guardar esta acción en la
base de datos.
Terminología
QUERY: Recuperar o consultar información de la
base de datos.
Programs Units: Las funciones son
operaciones que se realizan sobre los datos y
que modifican sus características.
CONSTRAINTS: Reglas de integridad que se
deben cumplir para los datos que se almacenan
en la base de datos, existen diferentes reglas de
integridad dependiente de los requerimientos
del negocio.
Dos tipos de ordenes SQL
Las dos principales categorías de ordenes son: el
DDL (Data Definition Languaje) y el DML (Data
Manipulation Languaje)
DDL ** ESTRUCTURAS**
La creación de un objeto de base de datos
La eliminación de un objeto de base de datos
La modificación de un objeto de la base de datos
La concesión de privilegios sobre un objeto de la base
de datos
La revocación de privilegios sobre un objeto de la base
de datos.
Dos tipos de ordenes SQL
ALTER TABLE
Añade una columna, modifica una columna.
ALTER TABLE ADD CONSTRAINT
Añade un constraint a una tabla existente
CREATE TABLE
Crea una tabla.
CREATE INDEX
Crea un índice.
DROP TABLE
Elimina un tabla de la base de datos.
DROP INDEX
Elimina un índice.
Dos tipos de ordenes SQL
GRANT
Otorga privilegios o roles a un usuario o a otro rol.
TRUNCATE
Borra todas los registros de una tabla datos y libera
espacio.
REVOKE
Elimina los privilegios de un usuario o de un rol.
Dos tipos de ordenes SQL
DML
Permite insertar, actualizar, borrar y seleccionar datos
de la base de datos
INSERT
Inserta registros a una tabla
DELETE
Borra registros de una tabla
UPDATE
Modifica registros de una tabla
SELECT
Recupera registros de una tabla o vista
Dos tipos de ordenes SQL
COMMIT
Guarda los datos en la base de datos.
ROLLBACK
Finaliza la transacción sin guardar los datos en la base
de datos.
SQL*Plus Introducción
Para iniciar una sesión SQL*Plus (Windows)
Pulse el icono SQL*Plus localizado en la carpeta Oracle
para Windows NT
En el cuadro de dialogo CONNECT introduzca el nombre
de usuario y contraseña:
Nombre de usuario : SCOTT
Contraseña: TIGER
Nombre del servicio: (se debe configurar primero el
servicio usando Oracle Net8 Easy Config)
Salir de una sesión SQL
SQL> exit
Seleccionando Columnas
Sintaxis Básica del QUERY:
SELECT ...
FROM ...
Seleccionar todas las columnas de una tabla:
SELECT columna [,columna ,columna ...]
FROM nombre_tabla
ó
SELECT *
FROM nombre_tabla
Seleccionando Columnas
Despliegue todas las columnas de la tabla
department
SQL> SELECT *
2 FROM department;
Use el comando DESCRIBE para desplegar los
nombres de las columnas
SQL> DESC[RIBE] department
Para desplegar una columna en especifico
SQL> SELECT name
2 FROM department;
Seleccionando Columnas
Despliegue el nombre y número de todos los
departments
SQL> SELECT name, department_id
2 FROM department;
La cláusula DISTINCT despliega los valores
únicos en una columna
SQL> SELECT DISTINCT columna [, columna]
2 FROM nombre_tabla;
Ejemplo:
SQL> SELECT DISTINCT job_id
2 FROM employee;
Seleccionando Columnas
En el SELECT se pueden definir alias para los
encabezados de columna
Despliegue job_id con el encabezado Trabajo
SQL> SELECT DISTINCT job_id Trabajo
2 FROM employee;
= Igual a
!= <> Diferente de
> Mayor que
>= Mayor o igual a
< Menor que
<= Menor o igual que
BETWEEN.. AND.. Entre dos valores
IN (lista) Igual a cualquier miembro de la lista
IS NULL Es un valor nulo
LIKE Busca un patrón de caracteres
Seleccionando Renglones
Ejemplos:
Seleccione el número de empleado, apellido y salario para
todos los empleados de el departamento 30
SQL> SELECT employee_id, last_name, salary
2 FROM employee
3 WHERE department_id = 30;
Despliegue el nombre del empleado, puesto y salario para
todos los empleados excepto los gerentes
SQL> SELECT employee_id, job_i, salary
2 FROM employee
3 WHERE job_id <> 671;
Seleccionando Renglones
El operador BETWEEN permite seleccionar renglones
que contengan valores dentro de un rango
Despliegue el nombre del empleado, puesto, y número de
departamento para aquellos contratados entre Enero 1 de
1982 y Enero 1 de 1983.
SQL> SELECT last_name, job_id, department_id, hire_date
2 FROM employee
3 WHERE hire_date BETWEEN
4 to_date('01-JAN-82‘) AND to_date('01-JAN-83‘);
Seleccionando Renglones
El operador IN permite seleccionar valores que
coincidan con uno de los valores en la lista
Despliegue el nombre del empleado, puesto y número de
departamento para todos los empleados que estén en el
puesto de CLERK y ANALYST.
SQL> SELECT last_name, job_id, department_id
2 FROM employee
3 WHERE job_id IN (667, 669);
Seleccionando Renglones
Valores nulos:
IS NULL e IS NOT NULL
Listar todos los empleados que no son candidatos para
recibir comisión (el valor de la columna comisión es NULO)
SQL> SELECT last_name, job_id
2 FROM employee
3 WHERE commission IS NULL;
Seleccionando Renglones
Para buscar una cadena de caracteres se utiliza el
operador LIKE con algunos caracteres comodín:
Ejemplo
CREATE TABLE hdates
AS SELECT employee_id, last_name, hire_date
FROM employee
WHERE department_id = 10;
Modificación de Tablas
La sentencia ALTER TABLE se utiliza para alterar
la definición de una tabla:
Añadiendo columnas o restricciones
Modificando definiciones de columnas (tipos de
datos,no nulos, etc.)
Sintaxis ADD
ALTER TABLE tabla
ADD ({columna1 tipo_de_dato [DEFAULT expr]
[constraint_de_columna]}
[ , {columna1 tipo_de_dato [DEFAULT expr]]
[constraint_de_columna]}]...);
Modificación de Tablas
Ejemplo
Añada una tabla a la tabla HDATES para almacenar el
número de gerente
Sintaxis MODIFY
ALTER TABLE tabla
MODIFY ({columna1 tipo_de_dato [DEFAULT expr]
[constraint_de_columna]}
[ , {columna1 tipo_de_dato [DEFAULT expr]]
[constraint_de_columna]}]...);
Modificación de tablas
Ejemplo
Modifique la tabla hdates para que almacene 18
caracteres en el nombre
Sintaxis:
Ejemplo:
Ejemplo
Elimine la vista empvu10
DROP VIEW empvu10;
Vista con alias para columnas
Ejemplo
Cree una vista que contenga el número de empleado,
(con el encabezado ID_NUMBER), nombre (con el
encabezado EMPLOYEE) y puesto (con el encabezado
TITLE) para el departamento 10
Sintaxis
CREATE VIEW vista [ (alias, [alias]...) ]
AS sentencia
WITH CHECK OPTION [CONSTRAINT constraint]];
Creación de vistas con
WITH CHECK OPTION
Ejemplo
Cree una vista que contenga todas las columnas de la
tabla employee para el departamento 20 con WITH
CHECK OPTION
Ejemplo:
Conceder todos los privilegios a todos los usuarios
sobre la tabla emp
Ejemplo
Cree el sinónimo DATES para la tabla HDATES de Ward
Ejemplo:
Cree un índice sobre la columna employee_id de la tabla
employee
Índice no usado
SQL> SELECT *
2 FROM employee;
Eliminando índices
El comando DROP sirve para remover índices de
la base de datos.
Sintaxis :
DROP INDEX nombre_indice;
Ejemplo :
Borre el índice i_emp_ename;
Ejemplo:
Despliegue los índices existentes sobre la tabla employee
Ejemplos :
Cree una secuencia para employee_id empezando con
el numero 8000
CREATE SEQUENCE s_emp_empno
START WITH 8000;
DESC[RIBE] department;
Insertando Renglones
Ejemplo :
Inserte un subconjunto de datos de un nuevo
empleado a la tabla employee
Ejemplo:
SQL> INSERT INTO old_emp (id, name, department)
2 SELECT employee_id, last_name, department_id
3 FROM employee
4 WHERE department_id IN (10, 20, 30, 40);
Actualizando Renglones
Se pueden cambiar los datos en una tabla
específica con la sentencia UPDATE
Sintaxis :
UPDATE tabla
SET columna1=valor, columna2=valor ...
[WHERE condicion]
Ejemplo :
Despliegue la estructura de la tabla employee
DESC[RIBE] employee
Actualizando Renglones
Ejemplo - Actualice múltiples columnas
Cambie al empleado numero 7566 al puesto de ventas
del departamento 30
UPDATE employee
SET commission = 500
WHERE job = 670;
Borrado de Renglones
La sentencia DELETE borra renglones de una
tabla específica
Sintaxis :
DELETE tabla
[WHERE condicion];
Ejemplo :
Borre al empleado 1234 de la tabla employee para
reflejar su despido
DELETE employee
WHERE employee_id = 1234;
Proceso de Transacciones
Una transacción es definida como todos los
cambios realizados a la base de datos entre
operaciones de COMMIT sucesivas
Inserciones , borrados, y actualizaciones a las
tablas no se hacen permanentes hasta que el
trabajo es guardado en la base de datos (COMMIT)
Hasta que la transacción se guarda en la base de
datos, el único que puede ver los cambios es el
usuario que los hizo
Un COMMIT puede ser explícito o implícito
Proceso de Transacciones
COMMIT explícito
Borre el usuario LERNER y explícitamente de COMMIT a
la transacción de la base de datos
COMMIT implícito
Los siguientes comandos de SQL causan un commit
implícito:
ALTER, COMMENT, CONNECT,
CREATE, DISCONNECT, DROP, EXIT
GRANT, REVOKE y RENAME
Proceso de Transacciones
COMMIT automático
Los cambios tienen efecto inmediatamente después de
un INSERT, UPDATE o DELETE si la opción AUTOCOMMIT
se encuentra habilitado (sólo en SQL*Plus)
Para esto se utiliza el comando SET de SQL*Plus
SET AUTOCOMMIT ON
Proceso de Transacciones
Controlando cuando tienen efecto los cambios:
ROLLBACK
El comando ROLLBACK cancela todos los cambios
pendientes regresando al estado en que estaba la
información antes del último COMMIT
Ejemplo :
Transferir a Jones al grupo de ventas
UPDATE employee
SET job_id =670, department_id=30
WHERE first_name = ‘JONES’;
Proceso de Transacciones
Todos los empleados con el nombre ‘JONES’ son
transferidos al grupo de ventas. Haga rollback a la
transaccion y repita la transaccion especificando el
numero de empleado de Jones
ROLLBACK;
UPDATE employee
SET job_id = 670, department_id =30
WHERE employee_id = 7566;
Proceso de Transacciones
SAVEPOINT marca un punto dentro de una
transacción particular en el cual se desea hacer
un ROLLBACK parcial de la transacción
Ejemplo :
Inserte un nuevo departamento a la tabla DEPT y cree
un savepoint para la transacción
SAVEPOINT A;
Proceso de Transacciones
Use la sentencia ROLLBACK TO para hacer una
anulación parcial de la transacción
Ejemplo
Inserte un nuevo departamento a la tabla deparment
ROLLBACK TO A;
Ejercicios
Ejemplo
Despliegue el salario, comisión y compensación total
para todos los vendedores cuya comisión sea mayor al
25% de su salario
INITCAP(cadena)
Regresa la primer letra de cadena en mayúscula y el
resto en minúsculas
UPPER(cadena)
Regresa todos los caracteres de cadena en mayúsculas
LOWER(cadena)
Regresa todos los caracteres de cadena en minúsculas
LENGTH(cadena)
Regresa el numero de caracteres de cadena
Valores y
funciones de caracteres
GREATEST(val1,val2)
Regresa el valor mayor entre val1 y val2
LEAST (val1,val2)
Regresa el valor menor entre val1 y val2
Ejercicios
1. Despliegue el nombre de los empleados
utilizando la letra inicial mayúscula
2. Calcule el número de meses entre la fecha de
contratación y la de hoy
3. Ordene el resultado anterior por el numero de
meses de empleo. Redondee el numero de
meses al numero entero mayor mas próximo
4. Despliegue el nombre del empleado,
compensación total y fecha de contratación
para todos los empleados cuyo salario sea
mayor a 2 veces su comisión, de formato a la
fecha de contratación para que parezca a 10 de
Diciembre de 1982
Funciones de Grupo
Las funciones de grupo obtienen resultados
basados en grupos de renglones en vez de un
resultado por renglón
AVG(sal)
Valor promedio de salario
COUNT(*)
Numero de renglones no nulos en un grupo
MAX(sal)
Maximo valor de salario
MIN(sal)
Minimo valor de salario
SUM(comm)
Suma de los valores de comision
Funciones de grupo
Ejemplo
Despliegue el promedio , el mas alto, y la suma de los
salarios para todos los vendedores
SELECT AVG(sal), MAX(sal), SUM(sal)
FROM employee
WHERE job_id = 670;
Ejemplo - GROUP BY
Despliegue cada departamento y su numero de
personal agrupado por departamento
SELECT department_id, COUNT(*)
FROM employee
GROUP BY department_id;
Si se seleccionan al mismo tiempo una funcion
de grupo y una columna normal se producira un
mensaje de error
SELECT department_id, COUNT(*)
FROM employee;
Funciones de Grupo
Ejemplo
Despliegue el numero de empleados para cada puesto
dentro de cada departamento
ECHO {ON|OFF}
ON Los comandos ejecutados desde una archivo seran
desplegados en terminal
OFF Suprime el desplegado de los comandos
FEED[BACK]
• Despliega el numero de registros recuperados en una
consulta, ON u OFF hacen que se despliegue o no el
resultado
Comandos de SQL*Plus
SPACE {1|n}
Ajusta el numero de espacio entre columnas
PAGESIZE {14|n}
Ajusta el numero de líneas por pagina
SET HEADING {ON|OFF}
ON Se despliegan los encabezados de las columnas
OFF Se suprimen los encabezados
SET LINESIZE {n}
Fija el numero de caracteres que SQL*Plus despliega
por linea, el default es 80
Comandos de SQL*Plus
SAVE nomre_archivo{.sql}
Crea una archivo script para después ejecutarse. Por
default guarda lo que este en el buffer.
START nomre_archivo{.sql}
Ejecuta un archivo script.
@ nomre_archivo{.sql}
Ejecuta un archivo script, igual que START
EDIT nomre_archivo.sql
Ejecuta un archivo, si no se le pasa nombre de archivo
edita el archivo buffer.
Creación de un
archivo de reporte
Sintaxis
SELECT [tabla.]columna, [tabla.]columna ...
FROM tabla1, tabla2
WHERE [tabla1.columna]=[tabla2.columna];
Consultas avanzadas
Ejemplo
Despliegue el nombre del empleado, ubicación y
numero de departamento
Sintaxis
SELECT tabla.columna, tabla.columna...
FROM tabla1, tabla2
WHERE tabla1.columna=tabla2.columna(+);
ò
SELECT tabla.columna, tabla.columna...
FROM tabla1, tabla2
WHERE tabla1.columna(+)=tabla2.columna;
Consultas Avanzadas
Ejemplo
Despliegue los nombres, numero de departamento y
ubicaciones de oficina de todos los empleados, incluya
en esa lista los números de departamentos y
ubicaciones de oficina que actualmente no tienen
empleados
SELECT employee.last_name
,department.department_id
,department.location_id
FROM employee, department
WHERE employee.department_id(+) =
department.deparment_id
Consultas Avanzadas
Un SELF JOIN hace un join a una tabla con ella
misma, como si se tratara de dos tablas
separadas, usada en relaciones recursivas.
Ejemplo
Despliegue la asociación del nombre del empleado y
gerente como <nombre_empleado> trabaja para
<nombre_gerente>
SELECT worker.last_name || ' trabaja para ‘
|| manager.last_name
FROM employee worker, employee manager
WHERE worker.manager_id = manager.employee_id
Consultas Avanzadas
Job
Employe Department
e Job_Id
Employee_Id Department_Id Location
Location_Id
Products
Salary_Grade Product_Id
Salary_Id
Customers
Price
Customer_Id Items
Sales_Order Product_Id
Item_Id Start_Date
Order_Id
PL/SQL
Temas del Curso
• PL/SQL
• Bloque PL/SQL
• Conjunto de carateres de un bloque PL/SQL
• Conjunto de carateres relacionados
• Nomenclatura de variables
• Tipos de variables
• Variables escalares
• Variables compuestas
• Atributo %TYPE
• Atributo %ROWTYPE
• Componentes de PL/SQL
• SELECT en un bloque PL/SQL
• Insertando datos
Temas del Curso
• Actualizando datos
• Borrando datos
• Cursores
• Manejando excepciones
• Subprogramas
• Procedimientos
• Modos de parámetro
• Funciones
• Paquetes
• Triggers
PL/SQL
Es un lenguaje procedural
Es una extensión de SQL
Se pueden tener sentencias de consultas o DML
Ventajas
Operadores aritméticos
Operadores relacionales
Declaración de variables
Manejo de errores
Portabilidad
Bloque PL/SQL
DECLARE (opcional)
declaración de variables;
declaración de cursores;
creación de tipos de dato;
…
BEGIN (obligatoria)
estructuras de control;
sentencias SQL;
asignación de valores;
…
EXCEPTION (opcional)
manejo de errores;
…
END; (obligatoria)
Conjunto de
caracteres de un Bloque PL/SQL
Caracteres permitidos
Todas las letras mayúsculas y minúsculas
Los dígitos de 0-9
Los símbolos ( ) + - * / <> = ! ; : . ‘ @ % , ¨# $ ^ & _ | {}
?[]
Operadores Aritméticos
+ Suma
* Multiplicación
** Exponenciación
- Sustracción
/ División
Conjunto de
caracteres de un Bloque PL/SQL
Operadores Relaciónales
<> Distinto de
^= Distinto de
!= Distinto de
= Igual
Conjunto de
caracteres relacionales
Diversos símbolos
() Separador de lista
; Fin de orden
. Elemento separador
:= Asignación
|| Concatenación
-- Delimitador de comentario
/* */ Delimitadores de comentario
Nomenclatura de Variables
Reglas para nombrar variables
Las variables deben comenzar por una letra A-Z
Pueden ir seguidas de una o mas letras, números del 0-
9 o de los caracteres especiales $,# o _
Las variables no deben ser mas largas de 30 caracteres
En los nombres de variables no se pueden incluir
espacios
Ejemplos
23_letras
prueba_nombre
prueba-nombre
Prueba nombre
un_nombre_de_variable_demasiado_largo
muchos_$$$$$$
23
Nomenclatura de Variables
No esta permitido utilizar palabras reservadas
como nombres de variable
Algunas palabras reservadas son:
LOOP
CREATE
SELECT
INSERT
FOR
DECLARE
....
Tipos de Variables
Variables PL/SQL:
Escalar
No tienen componentes internos
Mantienen un solo valor
Compuestas
Tienen componentes internos
Son reutilizables
TABLE
RECORD
Referencia
Cursor
LOB (objetos grandes)
Variables no declaradas dentro de PL/SQL.
Variables Escalares
Tipos de Datos:
VARCHAR2(long)
NUMBER [(digitos,decimales)]
DATE
CHAR
LONG
LONG_ROW
BINARY_INTEGER
BOOLEAN
PLS_INTEGER
Sintaxis:
nombre_variable [CONSTANT] tipo_dato [NOT NULL] [:=|
DEFAULT valor]
Ejemplo:
vd_Fecha_Entrada DATE;
vn_Salario NUMBER(5,2) := 1500;
vc_Nombre VARCHAR2(15) DEFAULT ‘JONES’;
Variables Compuestas
TABLE
Tipo de dato tabla PL/SQL, similar la tabla de Oracle
Crece dinámicamente
Consta de dos columnas, una para el índice y otra para
almacenar el valor
Sintaxis:
TYPE nombre_tipo IS TABLE OF tipo_dato [NOT NULL]
INDEX BY BINARY_INTEGER
Ejemplo
TYPE t_employee_salario IS TABLE OF NUMBER(5,2)
INDEX BY BINARY_INTEGER
index salario
vtn_salario T_EMPLOYE_SALARIO; 1 1500
... 2 2300
vtn_salario(1).salario := 1500; ... ...
vtn_salario(2).salario := 2300;
Variables Compuestas
RECORD
Tipo de dato registro PL/SQL, similar a un registro de
una tabla Oracle
Debe contener mas de un componente (llamados
campos) de tipo de dato escalar, TABLE o RECORD
Sintaxis:
TYPE tipo_registro IS RECORD (campo1 tipo_dato [NOT
NULL {:= | DEFAULT exp}], campo2 ...)
Ejemplo:
TYPE reg_department IS RECORD (depto_id NUMBER(2),
name VARCHAR2(15), location_id NUMBER(3))
vreg_department REG_DEPARTMENT;
...
vreg_department.depto_id := 10;
vreg_department.name := ‘SISTEMAS’; 10 SISTEMAS 123
vreg_department.location_id := 123;
Atributo %TYPE
%TYPE
Define a una variable con respecto a:
El tipo de dato de otra variable previamente declarada
Una columna de la base de datos
Se utiliza como posfijo
Sintaxis:
nombre_variable variable%TYPE;
nombre_variable tabla.columna%TYPE;
Ejemplo:
vc_nombre VARCHAR2(10);
vc_apellido vc_nombre%TYPE;
vn_sueldo employee.sueldo%TYPE;
Atributo %ROWTYPE
%ROWTYPE
Define una variable con respecto a la definición de un
renglón de una tabla
Se utiliza como sufijo
Los campos del registro toman el nombre y tipo de dato
de las columnas de la tabla.
Sólo almacena un registro a la vez.
Sintaxis:
nombre_variable tabla%ROWTYPE;
Ejemplo:
vreg_location location%ROWTYPE;
...
vreg_location.location_id := 1;
vreg_location.regional_group := ‘SAN DIEGO’;
1 SAN DIEGO
Componentes de PL/SQL
Estructuras de control
Tres tipos de estructuras lógicas IF
Tres tipos de estructuras de ciclo
Estructura Lógica IF
IF THEN
cnt := 1;
LOOP
cnt:=cnt +1;
IF cnt > 100 THEN
EXIT;
END IF;
... -- Código
END LOOP;
Componentes de PL/SQL
LOOP-EXIT WHEN-END LOOP
cnt := 1;
LOOP
... -- Código
cnt := cnt + 1;
END LOOP;
Componentes de PL/SQL
WHILE-LOOP-END LOOP
cnt := 1;
... -- Código
cnt:=cnt +1;
END LOOP;
Componentes de PL/SQL
FOR-IN-[REVERSE]-LOOP-END LOOP
... -- Código
END LOOP;
Estructura NULL
IF cnt>100 THEN
NULL;
END IF;
Select en Bloque PL/SQL
Cláusula INTO es requerida
El query debe regresar uno y sólo un registro
DECLARE
v_deptno department.department_id%TYPE;
v_loc department.location_id%TYPE;
BEGIN
SELECT department_id, locaction_id
INTO v_deptno, v_lo
FROM department
WHERE name = ‘SALES’;
END;
Select en Bloque PL/SQL
Ejemplo
SET SERVEROUTPUT ON
DECLARE
v_orderdate sales_order.order_date%TYPE;
v_shipdate sales_order.ship_date%TYPE;
BEGIN
SELECT order_date, ship_date
INTO v_orderdate, v_shipdate
FROM sales_order
WHERE order_id=516;
dbms_output.put_line(‘Order Date: ’|| v_orderdate);
dbms_output.put_line(‘Ship Date: ’|| v_shipdate);
END;
Insertando datos
Ejemplo
DECLARE
v_empno employee.employee_id%TYPE;
BEGIN
SELECT s_emp_empno.NEXTVAL
INTO v_empno
FROM dual;
INSERT INTO employee(employee_id, last_name
,first_name, job_id
,department_id)
VALUES (v_empno, ‘HARDING’, ‘ROSS’, 667,10);
END;
Actualizando datos
Ejemplo
DECLARE
v_sal_increase employee.salary%TYPE := 2000;
BEGIN
UPDATE employee
SET salary = salary +v_sal_increase
WHERE job_id = (SELECT job_id
FROM job
WHERE function = ‘ANALYST’);
END;
Borrando datos
Ejemplo
DECLARE
v_deptno employee.department_id%TYPE := 10;
BEGIN
DELETE employee
WHERE department_id = v_deptno;
END;
Cursores
no
E
M si
DECLARE OPEN FETCH CLOSE
PT
Y?
Sintaxis
DECLARE
CURSOR nombre_cursor IS
setencia_select;
BEGIN
...
END;
CURSOR cur_department IS
SELECT *
FROM department
WHERE department_id = 10;
BEGIN
...
END;
Abriendo el cursor
Sintaxis
DECLARE
...
BEGIN
OPEN nombre_cursor;
...
END;
OPEN cur_employee;
OPEN cur_department;
Recuperando
datos del cursor
Sintaxis
FETCH nombre_cursor INTO [variable1, variable2, …
| nombre_registro];
Ejemplos
DECLARE
CURSOR cur_employee IS
SELECT employee_id, first_name||’ ‘||last_name name
FROM employee;
v_empno employee.employee_id%TYPE;
v_name VARCHAR2(50);
BEGIN
OPEN cur_employee;
LOOP
FETCH cur_employee INTO v_empno, v_name
EXIT WHEN cur_employee%NOTFOUND;
dbms_output.put_line(v_empno||’ ‘|| v_name);
END LOOP;
END;
Cerrando el cursor
Sintaxis
CLOSE nombre_cursor;
DECLARE
...
BEGIN
OPEN cur_employee;
LOOP
FETCH cur_employee INTO v_empno, v_name
EXIT WHEN cur_employee%NOTFOUND;
dbms_output.put_line(v_empno||’ ‘|| v_name);
END LOOP;
CLOSE cur_employee;
END;
Atributos de
cursores explícitos
%ISOPEN - Boolean
Evalúa TRUE si el cursor esta abierto
%NOTFOUND - Boolean
Evalúa TRUE si el FETCH mas reciente no regresa un
renglón
%FOUND - Boolean
Evalúa TRUE si el FETCH mas reciente regresa un
renglón
%ROWCOUNT - Number
Regresa el numero de filas que se han regresado al
momento
Cursores y Registros
Variables tipo registro que almacene todo el
registro del cursor
Se puede utilizar el atributo %ROWTYPE
Se puede crear un tipo de dato RECORD y
declara la variable con respecto al tipo de dato
Ejemplo:
DECLARE
CURSOR cur_job IS
SELECT *
FROM job;
reg_job cur_job%ROWTYPE; JOB_ID
FUNCTIO
N
BEGIN
OPEN cur_job
FECTH cur_job INTO reg_job
...
Cursor FOR LOOP
Sintaxis
FOR nombre_registro IN nombre_cursor LOOP
sentencias;
...
END LOOP;
Sintaxis
EXCEPTION
WHEN excepción [OR excepción...] THEN
sentencias;
WHEN excepción [OR excepción ...] THEN
sentencias;
WHEN others THEN
sentencias;
END;
Ejemplos:
NO_DATA_FOUND
TOO_MANY_ROWS
INVALID_CURSOR
ZERO_DIVIDE
DUP_VAL_ON_INDEX
EXCEPTION
WHEN no_data_found THEN
sentencias;
WHEN dup_val_on_index THEN
sentencias;
...
Excepciones
No-Predefinidas
Ejemplo:
DECLARE
e_dep_con_fk EXCEPTION;
PRAGMA EXCEPTION_INIT(e_dep_con_fk, -2292);
BEGIN
DELETE department
WHERE department_id = 10;
EXCEPTION
WHEN e_dep_con_fk THEN
dbms_output.put_line(‘El departamento tiene
empleados’);
END;
Excepciones Definidas
por el Usuario
Ejemplo:
DECLARE
e_invalid_department EXCEPTION;
BEGIN
UPDATE department
SET name = ‘Information Technology’
WHERE department_id = 99;
IF sql%notfound THEN
RAISE e_invalid_department;
ELSE
commit;
END IF;
EXCEPTION
WHEN e_invalid_department THEN
dbms_output.put_line(‘El departamente no existe’);
END;
Propagando Excepciones
DECLARE
v_employee_id employee.employee_id%TYPE;
BEGIN
sentencias;
BEGIN
SELECT employee_id
INTO v_employee_id
FROM employee;
END;
EXCEPTION
WHEN too_many_rows THEN
dbms_output.put_line(‘El query regresó mas de un
registro’);
END;
SubProgramas
Ejemplo:
CREATE OR REPLACE PROCEDURE elimina_employee
(p_employee_id IN employee.employee_id) IS
BEGIN
DELETE employee
WHERE employee_id = p_employee_id;
END;
Llamando a un Procedimiento:
SQL*Plus
exec[ute] elimina_employee;
Bloque PL/SQL
BEGIN
elimina_employee;
END;
SubProgramas Anidados
Notación posicional
SQL> execute inserta_dep(1, ‘SISTEMAS’, 124)
Notación nominal
SQL> execute inserta_dep(p_nombre =>’SISTEMAS’,
2 p_location => 123, p_id => 1)
Funciones
DECLARE
v_sueldo NUMBER(10);
BEGIN
v_sueldo := sueldo_total(7505);
END;
Restricciones
de las Funciones
Procedimiento
Package PROCEDURE B; Privado
Body Procedimiento
PROCEDURE A Público
var3 Variable Local
…;
Sintaxis de Paquete
Evento: 2 Tipo: 4
INSERT, DELETE, sentencia
UPDATE [OF columna], renglón
CREATE, ALTER,
Cuerpo: 5
LOGON, LOGOFF, . . .
Procedimiento
Almacenado de
Java o de PL/SQL
Tipo y Tiempo
de Triggers
3.- Elaborar una función que regrese como valor el id del empleado que tenga el salario
mas grande de un departamento dado.
4.- Elaborar un procedimiento que otorgue un aumento del 15% a todos los empleados que
tenga más de quince años de laborar en la empresa.
5.- Crear un trigger que nos mande un mensaje de cada vez que insertemos un nuevo
empleado(de la tabla emp). El mensaje dira: 'Bienvenido : ' || Nombre_del_Empleado.
1.- Crear un Paquete llamado pkg_libreria que contendrá las siguientes funciones, procedimientos y
tipos de datos.
* Una Función que regrese los días que han transcurrido desde una fecha dada hasta
la fecha de hoy.
* Una Función que regrese el la descripción de un error generado por Oracle, donde
nosotros le pasemos el numero de error que produjo Oracle.
* Un Procedimiento que dé de baja a un empleado dado. El procedimiento funcionará de
la siguiente manera:
- Si el empleado existe en la employee se eliminará y se ingresaran esos datos en una
tabla donde se guardaron todo los datos de los empleados eliminados (debe crearse esa tabla
previamente, se llamarará empleados_eliminados) y mandar el mensaje “El empleado
employee_id ha sido eliminado”
- Si el empleado no existe en la tabla de employee, se debe buscar ese empleado en la
tabla empleados_eliminados si existe mandar el mensaje “El empleado employee_id ya había
sido eliminado con anterioridad”
- Si el empleado no existe en la tabla employee y tampoco en la tabla
empleados_eliminados mandar el mensaje “El empleado employee_id no existe”.
* Declarar una variable del tipo numérica con longitud de 15.
* Declarar una variable del tipo carácter de longitud igual a 300.
1.- Elaborar un procedimiento y ponerle por nombre obtiene_ordenes, recibirá como parámetro la clave
del cliente, este procedimiento obtendrá Todos los pedidos realizados por el cliente, junto con los
artículos que componen estos pedidos. Debe mandar los siguientes mensajes en el mismo formato.
Utilice cursores: