pl/sql

199

Click here to load reader

Upload: marcela-gomez

Post on 13-Nov-2014

38.268 views

Category:

Documents


6 download

DESCRIPTION

Capitulos PL/SQL 1-9 en espanol

TRANSCRIPT

Page 1: PL/SQL

Marcela GómezLoja 2008

Page 2: PL/SQL
Page 3: PL/SQL

DECLARACIÓN DE VARIABLES

Page 4: PL/SQL

Conocer la estructura de un bloque PL/SQL básico y sus secciones.

Declarar variables PL/SQL

Ejecutar un bloque PL/SQL

Page 5: PL/SQL

PL/SQL, consiste de tres secciones:

DECLARE………....BEGIN…………EXCEPTION…………..END;

Page 6: PL/SQL
Page 7: PL/SQL

Ejecutando Sentencias y Bloques PL/SQL

Ejecutando Sentencias y Bloques PL/SQL

DECLAREv_variable VARCHAR2(5);

BEGINSELECT column_nameNTO v_variableFROM table_name;EXCEPTIONWHEN exception_name THEN……………..

END;

Page 8: PL/SQL

Es importante:

Poner punto y coma (;) al final de una sentencia SQL o sentencia de control PL/SQL.

Cuando un bloque es ejecutado exitosamente sin errores de manejo y compilación, aparece el siguiente mensaje:

PL/SQL procedure successfully completed

Las palabras claves de sección DECLARE, BEGIN y EXCEPTION no van seguido de punto y coma.

END y todas las otras sentencias PL/SQL requieren un punto y coma para terminar la sentencia.

Se puede tener toda la expresión en una sola línea, pero este método no es recomendable para claridad o edición.

Page 9: PL/SQL

NOTA:

En PL/SQL a un error se lo llama excepción.

Con la modularidad es fácil solucionar un problema complejo esto gracias a que se puede trabajar en módulos.

Page 10: PL/SQL

Tipos de bloqueTipos de bloque

[DECLARE]

BEGIN

[EXCEPTION]

END;

-- statements

Anónimo

DECLARE name

BEGIN

[EXCEPTION]

END;

IS

--statements

Procedimiento

FUNTION name

BEGIN

[EXCEPTION]

END;

RETURN datatype

--statements

IS

RETURN value;

Función

PL/SQL es un programa que tiene uno o más bloques. Estos bloques pueden estar separados o anidados unos con otros. Por lo tanto, un bloque puede representar una pequeña parte de otro bloque.

Page 11: PL/SQL

Bloque anónimo.- es un bloque secreto. Estos son declarados en un punto en una aplicación donde son ejecutados. Se puede enraizar en un bloque anónimo dentro de un programa pre-compilado y dentro de iSQL*Plus o un servidor director. Los triggers en los componentes de Oracle Developer constan de estos bloques.

Sub-Programas.- son bloques nombrados en PL/SQL que pueden aceptar parámetros y pueden ser invocados. Se los puede declarar como procedimientos o como funcione. Generalmente se usa un procedimiento para ejecutar una acción y una función para computar un valor.

Page 12: PL/SQL

Usando los componentes de Oracle Developer (formas, reportes, y gráficos), tu puedes declarar procedimientos y funciones como parte de la aplicación (un formulario o reporte) y llamar a estos desde otros procedimientos, funciones y triggers dentro de una misma aplicación.

NOTA: Una función es similar a un procedimiento,

excepto que una función puede retornar un valor.

Page 13: PL/SQL

Conceptos de programaConceptos de programa

Page 14: PL/SQL

La siguiente tabla contiene una idea general de los conceptos de programa de PL/SQL que usa un bloque básico.

Page 15: PL/SQL
Page 16: PL/SQL
Page 17: PL/SQL

Uso de VariablesUso de Variables

Con PL/SQL se puede declarar variables. Las variables pueden ser usadas para lo siguiente:

•Almacenamiento Temporal de Datos: los datos pueden ser temporalmente guardados en una o más variables para ser usados cuando se validan los datos de entrada y para el procesamiento después en el proceso de circulación de datos.

•Manipulación de Valores guardados: las variables pueden ser usadas para cálculos y otras manipulaciones de datos sin acceder a la base de datos.

Page 18: PL/SQL

•Reusabilidad: después de ser declaradas, las variables pueden ser usadas repetidamente en una aplicación solo mencionándolas en otras declaraciones, otra declaración de sentencias.

•Facilidad de mantenimiento: cuando use %TYPE y %ROWTYPE, usted declara variables, basando la declaración en la definición de una columna de una base de datos. Si una definición subyacente cambia, la declaración variable cambia en consecuencia al tiempo de ejecución. Esto suministra la independencia de datos, reduce el coste de mantenimiento, y permite que programas se adapten a los cambios de base de datos para cubrir nuevas necesidades de la empresa.

Page 19: PL/SQL

Manejando variables en PL/SQLManejando variables en PL/SQL

•Declaración y Inicialización de Variables en la sección de declaración: se puede declarar variables en la parte declarativa de PL/SQL de cualquier bloque, subprograma o paquete. Las declaraciones asignan un espacio para almacenar un valor, especifican el tipo de datos, y nombran la ubicación en donde se va a almacenar con el propósito de hacer referencia al valor. Las declaraciones también pueden atribuir un valor inicial e imponer la restricción NOT NULL en la variable. Se debe declarar una variable antes de mencionarla en otras declaraciones, incluyendo la declaración de otras sentencias.

Page 20: PL/SQL

•Asignar nuevos valores para variables en la sección ejecutable: en la sección ejecutable, el valor existente de la variable es remplazado por un nuevo valor que es asignado para la variable.

•Paso de valores en subprogramas PL/SQL a través de parámetros: existen tres modos de parámetros, IN (por defecto), OUT, y IN OUT. Use el parámetro IN para pasar valores al subprograma que está siendo llamado. Use el parámetro OUT para retornas valores al que llama a un subprograma. Y use el parámetro IN OUT para pasar valores iníciales a un subprograma que está siendo llamado y para devolver valores actualizados al que llama al subprograma.

Page 21: PL/SQL

Tipos de VariablesTipos de Variables

Todas las variables PL/SQL tienen un tipo de dato, cuando se especifica el formato de almacenamiento, restricciones y validar el rango de valores. PL/SQL soporta cuatro categorías de tipos de datos: escalar, compuesto, referencia y LOB (objetos grandes), que se pueden utilizar para declarar variables, constantes y punteros.

1.Datos de tipo escalares sujetan un solo valor. Los principales tipos de datos son ésos que corresponden a un tipo de columna en las tablas de un servidor Oracle; PL/SQL también soporta variables booleanas.

Page 22: PL/SQL

2. Datos de tipo compuesto, como los registros, permiten que grupos de campos sean definidos y manipulados en bloques PL/SQL.

3. Los tipos de datos de referencia sujetan valores, llamados punteros, que designan otros ítems del programa.

4. Los tipos de datos LOB sujetan valores, llamados halladores, eso especifica la ubicación de objetos grandes (como ideas gráficas) que son guardados fuera de línea.

Page 23: PL/SQL

Declaración de Variables PL/SQLDeclaración de Variables PL/SQL

Sintaxis:

Identifier: es el nombre de la variable

CONSTANT: restringe la variable con el propósito de que su valor no pueda cambiar; las constantes deben ser inicializadas.

Page 24: PL/SQL

Data type: puede ser un escalar, compuesto, referenciado o LOB.

NOT NULL: restringe a la variable para que tenga un valor .

Expr: es cualquier expresión PL/SQL que puede ser una expresión literal, otra variable o una expresión que involucra operadores y funciones.

Page 25: PL/SQL

Inicialización de variables y palabras claves

Inicialización de variables y palabras claves

Identifier: es el nombre de la variable escalarExpr: puede ser una variable, literal o llamada a una función, pero no a una columna de la base de datos.Las variables son inicializadas todo el tiempo en un bloque o subprograma. Por defecto las variables son inicializadas con NULL.Default: se puede usar la palabra clave de default en lugar del operador de asignación.NOT NULL: imponer la estricción NOT NULL cuando la variable debe contener un valor.

Page 26: PL/SQL

Tipos de datos base escalaresTipos de datos base escalares

Page 27: PL/SQL
Page 28: PL/SQL
Page 29: PL/SQL
Page 30: PL/SQL

Declaración de Variables BooleanasDeclaración de Variables Booleanas

Este tipo de variables nos permiten realizar comparaciones a través de expresiones booleanas, estas pueden ser simples o complejas separadas por operadores relacionales.

Ejemplo:v_sal1 := 50000;v_sal2 := 60000;

La siguiente expresión es verdaderav_sal1 < v_sal2

Page 31: PL/SQL

Declaración y inicialización de una variable booleanaDECLARE

v_flag BOOLEAN:= FALSE;BEGIN

v_flag := TRUE;END;

DBMS_OUTPUT.PUT_LINE

Se puede declarar una variable principal o anfitriona, referenciarla en un bloque PL/SQL, y luego presentar su contenido en iSQL*Plus usando el comando PRINT. Otra alternativa para presentar que la información de un bloque de PL/SQL es DBMS_OUTPUT.PUT_LINE es un paquete oracle-supplied, y PUT_LINE es un procedimiento dentro de ese paquete.

Page 32: PL/SQL

Dentro de un bloque PL/SQL, referencia DBMS_OUTPUT.PUT_LINE y entre paréntesis se especifica lo que se quiere que presente. El paquete debe estar primero permitido en una sesión en iSQL*Plus. Para ejecutar el paquete en iSQL*Plus se debe realizar con el comando SERVEROUTPUT ON.

Ejemplo:

Page 33: PL/SQL
Page 34: PL/SQL
Page 35: PL/SQL

SINTAXIS DE BLOQUE DE PL-SQL. Declaración puede continuar después de

varias líneas.Una línea de PL-SQL contiene grupo de

caracteres conocidos como unidades léxicas que pueden clasificarse como:

Delimitadores (simples y símbolos compuestos).Identificadores (se incluye cualquier palabra reservada)Literales.Comentarios.

Page 36: PL/SQL

IDENTIFICADORES.Pueden contener 30 caracteres.Deben empezar con un carácter alfabético.Pueden contener números, signos de dólar,

subrayar, y signos de números. No pueden contener caracteres como guiones,

slashes, y espacios.No deben tener el mismo nombre de una

columna de la tabla de la base de datos.No deben haber palabras reservadas.

Page 37: PL/SQL

SINTAXIS DE BLOQUE DE PL-SQL. LITERALES.Caracteres y fechas deben estar encerrados en

comillas simples. v_name := `Henderson`Los números pueden ser simples valores o

notaciones científicas.Un slash (/) corre en bloques de PL-SQL en

archivos de script o en herramientas tales como iSQL*PLUS.

Page 38: PL/SQL

COMENTARIOS EN CODIGO.Los comentarios en líneas simples se hacen con

dos guiones (--)Los comentarios para múltiples líneas se hace

entre los símbolos /* y */. Ejm DECLARE……V_sal number (9,2);BEGIN /*calcular el salario anual basado en la fecha de

contrato*/V_sal : g_montly_sal *12;END

Page 39: PL/SQL

FUNCIONES DE SQL EN PL/SQLDisponible en declaración de procedimientos:

Filas simples numeradas.Caracteres de fila simple.Conversión de tipos de datos.Datos.TimestampGrandes y mínimas.Miscelánea de funciones.

No disponible en declaración de procedimientos:

decodeGrupo de funciones.

Page 40: PL/SQL

FUNCIONES DE SQL EN PL/SQL: Ejemplo.Construyendo una lista de correo para una

empresa:V_mailing_address := v_name o CHR (10) o

v_address o CHR (10) o v_state o CHR (10) o v_síp;

Convertir el nombre de empleado a minuscula:V_ename := LOWER (v_name);

Page 41: PL/SQL

CONVERSION DE TIPOS DE DATOS Convertir datos a tipos de datos comparables.}Mezcla de tipos de datos pueden resultar en un

error y afectar el funcionamiento.Funciones de conversión son:

- TO_CHAR_ TO_DATE_TO_NUMBER

DECLAREV_date date := TO_DATE(`12-JAN-2001`,`DD-

MON-YYYY);BEGIN

Page 42: PL/SQL

Este declaración produce un error en tiempo de ejecución si la variable v_date es declarada como un tipo de dato DATE.

V_date := `January 13, 2001`;para corregir el error, use la función de

conversión TO_DATE.V_date := TO_DATE (`January 13,

2001`,`Month DD, YYYY`);

Page 43: PL/SQL

BLOQUE ANIDADOS Y ALCANCE DE LAS VARIABLES.Los bloques de PL/SQL pueden ser anidadas

dondequiera que una declaración ejecutable sea permitida.

Un bloque anidado llega a ser una declaración.Una sección de excepción puede contener

bloques anidados. Una sección de excepción puede contener

bloques anidados.El alcance de un identificador es desde la

región de una unidad de programa desde la cual usted puede referenciar el identificador.

Page 44: PL/SQL

ALCANCE DE LOS IDENTIFICADORES.

Un identificador es visible en la región donde usted puede referenciar el identificador sin tener que caracterizar este:

Un bloque puede buscar bloques encerrados.Un bloque no puede observar los bloques

encerrados.

Page 45: PL/SQL

CAPACITAR UN IDENTIFICADORLa capacitación puede etiquetar un bloque

encerrado.

Capacitar un identificador puede usarse el prefijo de etiquetación de bloques.

DECLAREbirthdate DATE;

BEGIN DECLARE

birthdate DATE;BEGIN

outer.birthdate := TO_DATE (03-AUG-1976, DD-MON-YYYY)

ENDEND

Page 46: PL/SQL

OPERADORES EN PL/SQL.LógicosAritméticos.Concatenación.Paréntesis para controlar el orden de las

operaciones.Los mismo es SQL.

Operadores exponencial (**).

Page 47: PL/SQL

PROGRAMACION GUIDELINES.El código hecho se mantiene fácilmente por:Código documentado con comentarios.Desarrollando un caso de conversión para el

código. Desarrollando conversión de nombres por

identificadores y otros objetos.Incremento de legibilidad y

Page 48: PL/SQL

CODIGO INDENTING.

Para claridad, se muestra un ejemplo de código.

BEGIN IF x = 0 THEN

y:=1;EN IF

END;DECLAREV_deptno NUMBER (4);V_location_id NUMBER (4);BEGIN SELECT department_id, location_id, v_deptno, v_location_idFROM deparmentsWHERE deparment_name = `SALES`END;

Page 49: PL/SQL

Son símbolos simples o compuestos quetienen significado especial para PL/SQL.

Símbolos SimplesSímbolos Simples

Page 50: PL/SQL

Símbolos compuestos

Nota.- No puede usarse palabras reservadas como los identificadores a menos que ellos son adjuntos en la cita doble.

Page 51: PL/SQL
Page 52: PL/SQL
Page 53: PL/SQL

ObjetivosObjetivosDespués de completada esta lección, usted estará en la capacidad de:Escribir en PL/SQL una sentencia SELECT exitosamente.Escribir en PL/SQL sentencias DMLControlar transacciones en PL/SQLDeterminar el resultado de las sentencias del Lenguaje de Manipulación de datos. (DML)

Page 54: PL/SQL

Sentencias SQL en PL/SQL

Sentencias SQL en PL/SQL

Cuando usted extraiga información o aplique cambios a la base de datos usted debe usar SQL. PL/SQL soporta el Lenguaje de Manipulación de datos (DML) y los comandos del control de transacciones de SQL. Usted puede usar una sentencia SELECT para incrementar una variable con valores consultados de una fila o una tabla.

Page 55: PL/SQL

Usted puede usar comandos DML para modificar los datos en una tabla de la base de datos. Sin embargo recuerde los siguientes puntos acerca de los bloques PL/SQL mientras está usando sentencias DML y comandos de control de transacciones.

La palabra clave END significa el fin de un bloque PL/SQL, no el fin de una transacción. Justo como un bloque puede contener múltiples transacciones una transacción puede tener múltiples bloques.

PL/SQL no soporta directamente el Lenguaje de Definición de Datos (DDL), así como CREATE TABLE, ALTER TABLE o DROP TABLE.

PL/SQL no soporta sentencias del Leguaje de Control de Datos (DCL) así como GRANT o REVOKE.

Page 56: PL/SQL

Resumen

A través de las sentencias SQL en PL/SQL se podrá:

Extraer una fila de datos usando el comando SELECT.

Hacer cambios a filas en la base de datos usando comandos DML.

Controlar una transacción con comandos como el COMMIT, ROLLBACK o SAVEPOINT.

Determinar el resultado DML con atributos de cursor implícito.

Page 57: PL/SQL

Recuperando datos usando PL/SQL

Recuperando datos usando PL/SQL

Utilice la sentencia SELECT para recuperar datos de la base de datos. Con la sintaxis:

select_list : es una lista de al menos una columna y puede incluir expresiones SQL, filas, funciones, o grupo de funciones.

variable_name: es la variable escalar que retiene el valor recuperado.

record_name: es el registro PL/SQL que alberga el valor recuperado.

Page 58: PL/SQL

table: Especifica el nombre de la tabla de la base de datos.

condition: está compuesta de un nombre de columna, expresión, constante, y operadores de comparación incluyendo variables y constantes PL/SQL.

Sintaxis:SELECT select_listINTO {variable_name[, variable_name]… | record_name}FROM table[WHERE condition];

Page 59: PL/SQL

Guía para recuperar datos en PL/SQL

Guía para recuperar datos en PL/SQL

Terminar cada sentencia SQL con un punto y coma (;).

La cláusula INTO se requiere para la sentencia SELECT cuando esta es insertada en PL/SQL.

La cláusula WHERE es opcional y puede ser usada para especificar variables de entrada, constantes, literales o expresiones PL/SQL.

Especificar el mismo número de variables en la cláusula INTO como columnas en la base de datos en la cláusula SELECT. Debe asegurar que se correspondan posicionalmente y que sus tipos de datos sean compatibles.

Use funciones de grupo, así como SUM, en una sentencia SQL. porque las funciones de grupo se aplican a filas en una tabla.

Page 60: PL/SQL

Sentencia SELECT en PL/SQLSentencia SELECT en PL/SQL

Cláusula INTOLa cláusula INTO es obligatoria y ocurre entre

las cláusulas SELECT y FROM. Esta es usada para especificar los nombres de variables que contienen los valores que SQL retorna de una cláusula SELECT. Usted debe especificar una variable para cada ítem seleccionado, y el orden de las variables debe corresponderse con los ítems seleccionados.

Use la cláusula INTO para llenar variables o variables host.

Page 61: PL/SQL

Las consultas deben retornar una y solo una fila.

La sentencia SELECT dentro de un bloque PL/SQL está dentro de la clasificación ANSI de insertar SQL, para lo cual se aplican las siguientes reglas: Las consultas deben retornar una y solo una fila, una consulta que retorna mas de una fila o ninguna genera un error.

PL/SQL maneja estos errores levantando excepciones, las cuales usted puede atrapar en la sección de excepciones del bloque con las excepciones NO_DATA_FOUND y TOO_MANY_ROWS.

Page 62: PL/SQL

Ejemplo 1DECLARE

v_deptno NUMBER(4);v_location_id NUMBER(4);

BEGINSELECT department_id, location_idINTO v_deptno, v_location_idFROM departmentsWHERE department_name = ‘Sales’;

END;/

Page 63: PL/SQL

Ejemplo 2DECLARE

v_hire_date employees.hire_date%TYPE;v_salary employees.salary%TYPE;

BEGINSELECT hire_date, salaryINTO v_hire_date, v_salaryFROM employeesWHERE employee_id = 100;

END;/

Page 64: PL/SQL

En el ejemplo anterior, la variable v_hire_date y v_salary son declarados en la sección DECPLARE del bloque PL/SQL.

En la sección ejecutable, los valores de las columnas HIRE_DATE y SALARY para el empleado con el número de empleado 100 son recuperados de la tabla Empleados y almacenados en las variables v_hire_date y v_salary respectivamente.

Observe como la cláusula INTO, a lo largo con la sentencia SELECT, recupera los valores de las columnas de la base de datos dentro de las variables PL/SQL.

Page 65: PL/SQL

Ejemplo 3SET SERVEROUTPUT ONDECLARE

v_sum_sal NUMBER(10, 2);v_deptno NUMBER NOT NULL := 60;

BEGINSELECT SUM(salary) - – función de grupoINTO v_sum_salFROM employeesWHERE department_id = v_deptno;DBMS_OUTPUT.PUT.LINE (‘La suma del salario es’

||TO_CHAR(v_sum_sal));END;/

Page 66: PL/SQL

En el ejemplo 3, las variables v_sum_sal y v_deptno son declaradas en la sección DECLARE del bloque PL/SQL.

En la sección ejecutable, el total del salario para el departamento con el número de departamento 60 es calculado usando la función de grupo SUM de SQL, y asignado a la variable v_sum_sal.

Nótese que la función de grupo no puede ser usada en la sintaxis PL/SQL. Ellas son usadas en la sentencia SQL dentro del bloque PL/SQL.

La salida del bloque PL/SQL se muestra a continuación:

La suma del salario es 28800PL/SQL procedure successfully completed.

Page 67: PL/SQL

Convención de nombresConvención de nombresDECLARE

v_hire_date employees.hire_date%TYPE;sys_date hire_ date%TYPE;employee_id employees.employee_id%TYPE := 176;

BEGINSELECT hire_date, sysdateINTO v_hire_date, v_salaryFROM employeesWHERE employee_id = employee_id;

END;/

DECLARE*ERROR al line 1:ORA-01422: exact fetch returns more than requested number of rowsORA-06512: at line 6

Page 68: PL/SQL

En sentencias SQL potencialmente ambiguas, los nombres de las columnas de la base de datos preceden sobre los nombres de variables locales. El ejemplo es definido como sigue: Retorna la fecha de inicio y la fecha de hoy de la tabla Empleados para el empleado cuyo id es 176.

Este ejemplo levanta una excepción en tiempo de ejecución no manejada porque en la cláusula WHERE, los nombres de las variables PL/SQL son los mismos que los nombres de las columnas de la base de datos en la tabla empleados

Page 69: PL/SQL

La siguiente sentencia DELETE quita todos los empleados de la tabla empleados en donde el apellido no es nulo, no justo ‘King’, porque el servidor Oracle asume que ambos apellidos en la cláusula WHERE se refiere a la columna de la base de datos.

DECLARElast_name VARCHAR2(25) := ‘King’;

BEGINDELETE FROM employees WHERE last_name = last_name;

Page 70: PL/SQL

Manipulando Datos usando PL/SQL

Manipulando Datos usando PL/SQL

Page 71: PL/SQL

Usted manipula los datos en la base de datos usando comandos DML. Usted puede usar comandos DML como INSERT, UPDATE, DELKETE y MERGE sin restricción en PL/SQL. Filas bloqueadas son liberadas incluyendo sentencias COMMIT o ROLLBACK en el código PL/SQL.

•La declaración INSERT añade nuevas filas de datos a la tabla.•La declaración UPDATE modifica lasa filas existentes en la tabla.•La declaración DELETE quita filas no deseadas de la tabla.

Page 72: PL/SQL

La declaración MERGE selecciona filas de una tabla para actualizar o insertarlas en otra tabla. La decisión de insertar, actualizar o no dentro de la tabla objetivo se basa en una condición dentro de la cláusula ON.

NOTA: MERGE es una declaración determinista. Usted no puede actualizar la misma fila de la tabla objetivo múltiples veces en la misma declaración MERGE. Usted debe tener privilegios de objeto INSERT y UPDATE en la tabla objetivo y el privilegio SELECT en la tabla origen.

Page 73: PL/SQL

Insertando datosInsertando datos

En el ejemplo que se muestra a continuación, una declaración INSERT es usada dentro del bloque PL/SQL para insertar un registro dentro de la tabla Empleados. Mientras este usando el comando INSERT en un bloque PL/SQL usted puede:

Usar funciones como USER y SYSDATE.Generar valores de claves primarias usando secuencias de base de datos.Derivar valores en el bloque PL/SQLAñadir valores por defecto de columna

Page 74: PL/SQL

Ejemplo

Añada nueva información de empleados a la tabla Empleados.

BEGIN INSERT INTO employees(employee_id, first_name, last_name, email, hire_date, job_id, salary)VALUES(employees_seq.NEXTVAL, ‘Ruth’, ‘Cores’, ‘RECORES’, sysdate, ‘AD_ASST’, 4000);

END;/

NOTA:

No hay posibilidad de ambigüedad con identificadores y nombres de columnas en la sentencia SELECT. Ningún identificador en la cláusula INSERT debe ser el nombre de una columna de la base de datos.

Page 75: PL/SQL

Actualizando datosActualizando datos

Puede haber ambigüedad en la cláusula SET de una declaración UPDATE porque aunque el identificador en la parte izquierda del operador de asignación es siempre una columna de la base de datos, el identificador de la parte derecha no puede ser una columna de la base de datos o variable PL/SQL.Recuerde que la cláusula WHERE es usada para determinar que filas son afectadas. Si no hay filas modificadas, no ocurren errores, a diferencia de una sentencia SELECT en PL/SQL.

Page 76: PL/SQL

Ejemplo

Incremente el salario de todos los empleados quienes son empleados (stock clerks).

DECLAREv_sal_increase employees.salary%TYPE :=

800;BEGIN

UPDATE employeesSET salary = salary + v_sal_increaseWHERE job_id = ‘ST_CLERK’;

END;/

NOTA: La variable de asignación de PL/SQL siempre usa :=; y SQL para una columna de asignación siempre usa =. Memorice que si el nombre de una columna y el nombre de un identificador son idénticos en la cláusula WHERE, el servidor Oracle observa a la base de datos primero por el nombre.

Page 77: PL/SQL

Borrando datosBorrando datos

La sentencia DELETE quita filas no deseadas de una tabla. Sin el uso de una cláusula WHERE, los contenidos enteros de una tabla pueden ser quitados, a condición de que no hay restricciones de integridad.

Ejemplo

Borre filas que pertenezcan al departamento 10 de la tabla empleados.

DECLAREv_deptno employees.department_id%TYPE := 10;

BEGINDELETE FROM employeesWHERE department_id = v_deptno;

END;/

Page 78: PL/SQL

Combinación de filasCombinación de filas

La declaración MERGE inserta o actualiza filas en una tabla, usando los datos de otra tabla. Cada fila es insertada o actualizada en la tabla objetivo, dependiendo de una condición de equijoin.

El ejemplo muestra un enlace de la clave de empleado en la tabla COPY_EMP a la clave de empleado en la tabla EMPLOYEES. Si se encuentra un enlace, la fila es actualizada para enlazar la fila en la tabla Empleados. Si la fila no se encuentra, esta es insertada dentro de la tabla COPY_EMP.

Page 79: PL/SQL

DECLAREv_empno EMPLOYEES.EMPLOYEE_ID%TYPE := 100;

BEGINMERGE INTO copy_emp c

USING employees eON (e.employee_id = v_empno)

WHEN MATCHED THENUPDATE SET

c.first_name = e.first_name,c.last_name = e.last_name,c.email = e.mail,c.phone_number = e.phone_number,c.hire_date = e.hire_date,c.job_id = e.job_id,c.salary = e.salary,c.commission_pct = e.commission_pct,c.manager_id = e.manager_id,c.department_id = e.department_id

WHEN NOT MATCHED THENINSERT VALUES(e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.departament_id);

END;/

Page 80: PL/SQL

Convenciones de nombresConvenciones de nombres

Evite la ambigüedad en la cláusula WHERE adhiriéndose a una convención de nombres que distingue nombres de columna de base de datos de nombres de variables PL/SQL, en resumen:

Use una convención de nombres para evitar ambigüedad en la cláusula WHERE.

Los nombres de las columnas de la base de datos e identificadores deben tener nombres distintos.

Page 81: PL/SQL

Errores en la sintaxis pueden surgir porque PL/SQL primero verifica la base de datos por columna en l atabla.

Los nombres de variables locales y parámetros formales preceden a los nombres de las tablas de la base de datos.

Los nombres de las columnas de las tablas de la base de datos preceden a los nombres de las variables locales.

Page 82: PL/SQL

La siguiente tabla muestra una configuración de prefijos y sufijos que distinguen identificadores de otros identificadores, objetos de datos y otros nombres de objetos.

Page 83: PL/SQL

Cursor SQLCursor SQL

Siempre que usted ejecute una sentencia SQL, el servidor Oracle abre un área de memoria en la cual el comando es analizado y ejecutado. Esta área es llamada cursor.

Cuando la parte ejecutable de un bloque ejecuta una sentencia SQL, PL/SQL crea un cursor implícito, el cual PL/SQL maneja automáticamente. El programador explícitamente declara y nombra un cursor explícito. Existen cuatro atributos válidos en PL/SQL que pueden ser aplicados a cursores.

Page 84: PL/SQL

En resumen:

Un cursor es un área de trabajo privada de SQL.

Existen dos tipos de cursores:Cursores implícitosCursores explícitos

El servidor Oracle utiliza los cursores implícitos para analizar y ejecutar sus sentencias SQL.

Los cursores explícitos son explícitamente declarados por el programador.

Page 85: PL/SQL

Atributos de un cursor SQLAtributos de un cursor SQL

Utilizando los atributos de cursor de SQL, usted puede probar el resultado de sus sentencias.

SQL%ROWCOUNT

Número de filas afectadas por la sentencia SQL más reciente (valor íntegro)

SQL%FOUND Atributo booleano que evalúa a VERDADERO (TRUE) si la declaración SQL más reciente afecta una o varias filas.

SQL%NOTFOUND Atributo booleano que evalúa a VERDADERO (TRUE) si la declaración SQL más reciente no afecta alguna fila.

SQL%ISOPEN Siempre evalúa a falso porque PL/SQL cierra los cursores implícitos inmediatamente después de su ejecución.

Page 86: PL/SQL

Los atributos de los cursores SQL permiten evalúar lo que pasó cuando un cursor implícito fue usado. Use estos atributos en sentencias PL/SQL, pero no en sentencias SQL.

Se pueden utilizar los atributos SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND, y SQL%ISOPEN en la sección de excepciones de un bloque para unir información acerca de la ejecución de una sentencia DML. PL/SQL no retorna errores si una sentencia DML no afecta a alguna fila en la tabla subyacente. Sin embargo, si una sentencia SELECT no retorna alguna fila, PL/SQL retorna una excepción.

Page 87: PL/SQL

Ejemplo:

Borrar las filas de un empleado específico de la tabla empleados. Imprima el número de filas borradas.

VARIABLE rows_deleted VARCHAR2(30)DECLARE

v_employee_id employees.employee_id%TYPE := 176.BEGIN

DELETE FROM employeesWHERE employee_id = v_employee_id;:rows_deleted :=(SQL%ROWCOUNT || ‘row deleted.’);

End;/Print rows_deleted

Este ejemplo borra las filas de la tabla Empleados para el número de empleado 176. Usando el atributo SQL%ROWCOUNT, se puede imprimir el número de filas borradas.

Page 88: PL/SQL

Sentencias de control de

transaccionesSentencias de control de

transaccionesUsted controla la lógica de las transacciones con las sentencias SQL COMMIT y ROLLBACK, dando a algunos grupos de la base de datos cambios permanentes mientras se descartan otros. Con el servidor Oracle, las transacciones de DML comienzan con el primer comando seguido de un COMMIT o ROLLBACK. Estas acciones pueden ocurrir dentro de un bloque PL/SQL o como resultado de algún evento en el entorno de un host (por ejemplo, en más casos finalizando una sesión automáticamente de iSQL*Plus se confirman las transacciones pendientes). Para crear un punto intermedio en el proceso de una transacción, use SAVEPOINT.

Page 89: PL/SQL

COMMIT [WORK];SAVEPOINT savepoint_name;ROLLBACK [WORK]ROLLBACK [WORK] TO [SAVEPOINT] savepoint_name;En donde : WORK ies para conformidad con el estándar ANSI.

NOTA:Los comandos de control de transacciones son todos válidos dentro de PL/SQL, aunque el ambiente del host puede tener algunas restricciones sobre su uso.

Page 90: PL/SQL

Usted puede incluir comandos de bloqueo explícitos en un bloque que toman efecto hasta el final de la transacción. También, un bloque PL/SQL no necesariamente implica una transacción.

Page 91: PL/SQL
Page 92: PL/SQL
Page 93: PL/SQL

Controlando Flujo de Ejecución de PL/SQLUtliza la condición IF para cambiar la

ejecución logica de las sentencias. Las condiciones de las sentencias IF son:

IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF

Page 94: PL/SQL

SENTENCIA IFSINTAXIS:IF condicion THEN sentencia; [ELSIF condicion THEN sentencias;] [ELSE sentencia;]END IF;

Page 95: PL/SQL

SENTENCIAS IF SIMPLESLas sentencias simples tienen la siguiente

sintaxis:IF condicion THEN sentenciaEND IF;

Page 96: PL/SQL

SENTENCIAS IF COMPUESTASLas sentencias IF compuestas usan operadores

logicos como AND Y NOTSINTAXIS:IF condición AND condicion THEN sentencia;END IF;

Page 97: PL/SQL

FLUJO DE EJECECUCIÓN DE SENTENCIAS IF-THEN-ELSEIF

TRUE NOT TRUE

TRUE NOT TRUE

IF condici

on

Acción THEN

Acción ELSE

condicion

ELSIF

Acción THEN

Page 98: PL/SQL

Flujo de la ejecución de Sentencias IF-THEN-ELSE TRUE NOT TRUE

IF condici

on

Acción THEN (incluye

una sentencia

IF)

Acción ELSE

(incluye una

sentencia IF)

Page 99: PL/SQL

SENTENCIAS IF-THEN-ELSEPara dar un valor, calcular un porcentaje de el

valor basado en una condicion.Ejemplo.IF v_start > 100 THEN v_start = 0.2 v_start;ELSIF v_start >= 50 THEN v_start := 0.5 v_start;ELSE v_start := 0.1 v_startEND IF;

Page 100: PL/SQL

Expresiones CASEUna expresión CASE selecciona un resultado

y lo retorna.Para seleccionar el resultado , la expresión

CASE usa una expresión cuyo valor es usado para seleccionar una o varias alternativas.

CASE selector WHEN expression1 THEN result1 WHEN expression2 THEN result2 ….. WHEN expressionN THEN resultN [ELSE resultN+1;] END;

Page 101: PL/SQL

Expresiones CASE : EjemploSET SERVERPUT ONDECLARE

v_grade CHAR(1) := UPPER (‘&p_grade’);v_appraisal VARCHAR2(20);

BEGINv_appraisal :=

CASE v_gradeWHEN ‘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;/

Page 102: PL/SQL

Manipulando Nulos Cuando trabajamos con Nulos, puede evitar

algunos errores comunes ,. Teniendo en cuenta las siguentes reglas:

Comparaciones simples que involucran nulos siempre producen nulos

Aplicando el operador lógico NOT al nulo produce nulo

En sentencias de control condicional, si la condición produce NULL, se asociación de secuencias no es ejecutada.

Page 103: PL/SQL

Tablas Lógicas Construir una condición booleana simple con

un operador de comparación

ANDTRUE

FALSE

NULL

TRUE TRUEFALSE

NULL

FALSE

FALSE

FALSE

FALSE

NULL NULLFALSE

NULL

ORTRUE

FALSE

NULL

TRUE TRUE TRUE TRUE

FALSE TRUE

FALSE

NULL

NULL TRUE NULL NULL

NOT

TRUE FALSE

FALSE TRUE

NULL NULL

Page 104: PL/SQL

Tablas Lógicas Comparaciones booleanas con operadores lógicosUd. Puede construir una condición simple

booleana combinando números, caracteres i expresiones de tiempo con operadores lógicos.

Ud. Puede construir una condición booleana compuesta componiendo condiciones simples booleanas con operadores lógicos AND, OR y NOT. En las tablas lógicas mostradas anteriormente:

FALSE toma precedencia en una condición AND y TRUE toma precedencia en una condición OR

AND retorna TRUE solo si ambos operandos son TRUE

OR retorna TRUE si ambos operadores son FALSENULL y TRUE siempre evalúan el NULL

Page 105: PL/SQL

Condiciones Booleanas Cual es el valor de V_FLAG en cada caso ?

v_flag := v_recorder_flag AND v_available_flag;

Respuestas 1. TRUE 2. FALSE 3. NULL 4. FALSE

V_REORDER_FLAG V_AVAILABLE_FLAG V_FLAG

TRUE TRUE ?

TRUE FALSE ?

FALSE TRUE ?

FALSE FALSE ?

Page 106: PL/SQL

Control Iterativo : Sentencias LOOPLOOPs repite una sentencia o secuencia de

múltiples sentencias Hay tres tipos de ciclos

Ciclo básico – ejecuta acciones repetitivas sin condiciones de conjunto

Ciclo for - ejecuta control iterativo de acciones basadas en un conteo

Ciclo while – ejecuta control iterativo de acciones basadas en una condición

Use la sentencia EXIT para terminar el ciclo.

Page 107: PL/SQL

Ciclos Básicos

LOOP -- delimitado statement1; -- sentencias … EXIT [WHEN condition] -- Termina sentenciaEND LOOP; -- delimitador

Ciclos Básicos La mas simple forma de las sentencias LOOP es la básica, la cual encierra una secuencia de sentencias entre las palabras reservadas LOOP y END LOOP. Un ciclo básico permite la ejecución de al menos una sentencia como mínimo.LA sentencia EXITUsted puede usar EXIT para terminar el ciclo.

Condicion: Es una variable booleana o expresión (TRUE, FALSE, o NULL)

Page 108: PL/SQL

Ciclos While

En la sintaxis:Condition es una variable booleana (TRUE, FALSE, NULL)Statement puede ser una o mas sentencias PL/SQL o SQL

Si las variables involucradas en las condiciones no cabían durante el cuerpo del ciclo, luego la condicion continua con TRE y el ciclo no termina

Nota: Si la condicion produce un NULL, el ciclo es desviado al control de la próxima sentencia

WHILE condition LOOP -- La condicion es evaluada al comienzo statement1; -- de cada iteración statement2; …END LOOP;Use el WHILE para repetir sentencias mientras una condicion es verdadera

Page 109: PL/SQL

Ciclos WHILE : Ejemplo DECLARE

V_ country_id locations.country_id%TYPE:=‘CA’;V_location_id locations.location_id%TYPE;V_city locations.city%TYPE:=‘Montreal’;V_counter NUMBER := 1;BEGIN

SELECT MAX (location_id) INTO v_location_id FROM locationsWHERE country_id = vcountry_id;WHILE v_counter <=3 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;

END LOOP;END;/

Page 110: PL/SQL

Ciclos FOR

REVERSE causa al contador decrementar con cada iteración desde el salto alto al bajo

Lower_bound especifica el salto mas bajo del rango de valores del contador

upper_bound especifica el salto mas alto del rango de valores del contador

FOR counter IN [REVERSE] lower_bound .. Upper_bound LOOP statement1; -- de cada iteración statement2; …END LOOP;

Use un ciclo FOR para conseguir un atajo para el numero de iteraciones No declare un contador; este es declarado implícitamente como un entero‘lower_bound .. Upper_bound’ es sintaxis requerida

Page 111: PL/SQL

Ciclo FORInserte tres nuevas location_id para el código

de la ciudad CA y la ciudad de MontrealDECLARE V_country_id locations.country_id%TYPE := ‘CA’; V_location_id locations.location_id%TYPE ; v_city locations.city%TYPE := ‘Montreal’;BEGIN SELECT MAX (locatio_id) INTO v_location_id FROM locations WHERE country_id = V_country_id; FOR i IN 1…3 LOOP INSERT INTO locations (location_id, city, country_id) VALUES ((v_location_id + i ), v_city, v_country_id); END LOOP;END;

Page 112: PL/SQL

Ciclo FOR Líneas directivasReferencian al contador solo dentro del ciclo,

es indefinido fuera del ciclo No referencia al contador como el objetivo de

una asignación.

Page 113: PL/SQL

Líneas directivas mientras se usan ciclos

Use el ciclo básico cuando las sentencias dentro del ciclo deban ejecutarse al menos una vez

Use el ciclo WHILE si la condicion debe ser evaluada al comienzo de cada iteración,

Use un ciclo FOR si se conoce el numero de iteraciones.

Page 114: PL/SQL

Ciclos Anidados y etiquetasCiclos anidados para múltiples etiquetasUse etiquetas para distinguir entre bloques y ciclos.Salga del ciclo exterior con la sentencia EXIT que

referencia la etiqueta

Usted puede anidar ciclos a múltiples niveles. Usted puede anidar ciclos básicos, FOR, While dentro de otro.

La finalización de un ciclo anidado no determina la culminación del ciclo al menos que una excepción fue levantada. Sin embargo, Usted puede etiquetar ciclos y salir del ciclo externo con la sentencia EXIT.

Page 115: PL/SQL

Ciclos Anidados y etiquetas … BEGIN

<<outer_loop>>LOOP

v_counter := v_counter +1;EXIT WHEN v_counter>10 ;<<Inner_loop>>

LOOP …EXIT outer_loop WHEN total_done = ‘YES’ ;-- Leave both loops

EXIT WHEN inner_done = ‘YES’;-- Leave inner loop only … END LOOP Inner_loop;

…END LOOP outer_loop:

END

Page 116: PL/SQL

Resumen En esta lección debiste haber aprendido a :Cambiar el flujo lógico de las sentencias

usando estructuras de control Condicionales (Sentencia IF)Expresiones CASECiclos:

Ciclos Basicos Ciclos FOR Ciclos While

Sentencias de salida EXIT

Page 117: PL/SQL

Capitulo 5

Page 118: PL/SQL

CAPITULO 5 Marcela Gómez

Page 119: PL/SQL

Después de completar ésta lección, usted será capaz de hacer lo siguiente:

Crear registros PL/SQL definidos por el usuario

Crear un registro con el atributo %ROWTYPECrear un índice por tablaCrear un índice por tabla de registros Describir las diferencias entre registros,

tablas, y tablas de registros

OBJETIVOS

Page 120: PL/SQL

Son de dos tipos :Registros PL/SQL Colecciones PL/SQL

Indices por tablaTablas anidadasVarray

Contienen componentes internos Son reusables

Composición de tipos de datos

Page 121: PL/SQL

Registros PL/SQLDebe contener uno o mas componentes de

cualquier escalar , archivo o índice (tipo de tabla de datos), llamados archivos

Son similares en estructura para registros en lenguaje de tercera generación

No son los mismos como filas en una tabla de base de datos

Tarta una conexión de archivos como una unidad lógica

Son convenientes para ir a buscar una fila de datos desde una tabla para procesarlos

Page 122: PL/SQL

Creando un archivo PL/SQL

Cuando field_declaration es:

SINTAXIS:TYPE type_name IS RECORD (field_declaration [, field_declaration]…);Identifier type_name;

Field_name {field_type | variable%TYPE | table.column%TYPE | table %ROWTYPE} [[NOT NULL] {:= | DEFAULT} expr]

Definiendo y declarando un registtro PL/SQL En la sintaxis: Type_name es el nombre del tipo de registro Field_name es el nombre del campo dentro del registro Field_type es el tipo de dato del campo Expr es el field_type o un valor inicial La restricción NOT NULL previene asignaciones nulas a estos campos.

Debe estar seguro de inicializar campos NOT NULL

Page 123: PL/SQL

Creando un registro PL/SQL Declare variables para para almacenar el

nombre, trabajo y salario de un nuevo empleadoEjemplo

…TYPE emp_record_type IS RECORD(last_name VARCHAR2(25), job_id VARCHAR2(10), salary NUMBER(8,2));Emp_record emp_record_type;…

Page 124: PL/SQL

Estructura de registros PL/SQL

Field 1 (data type) Field2(data type) Field3 (data type)

Ejemplo:

Field 1 (data type) Field2(data type) Field3 (data type)Employee_id number(6) last_name varchar2(25) job_id varchar2(10)

100 King AD_PRES

Page 125: PL/SQL

El atributo %ROWTYPEDeclara un variable de acuerdo a una

colección de columnas en una tabla de base de datos

El prefijo %ROWTYPE con la tabla de base de datos

Campos en el registro toma sus nombres y tipos de datos desde la columna de las tablas o vistas.

Page 126: PL/SQL

Declarando registros con el atributo %ROWTYPE

Sintaxis

DECLARE identifier reference%ROWTYPE;Where: identifier es el nombre escogido por el registro como un todo reference es el nombre

Asignando valores y registrosUsted puede asignar una lista de valores comunes a un registro usando sentencias SELECT o FETCH. Asegúrese que el nombre de columnas aparezcan en el mismo orden como los campos en su registro. Usted también puede asignar un registroa otro si ellos tienen el mismo tipo de datos.

Page 127: PL/SQL

Ventajas de usar %ROWTYPEEl numero de tipo de datos de la columnas de

base de datos subrayada necesita ser conocida

El numero y tipo de datos de las columnas de la base de datos subrayada debe cambiarse en tiempo de ejecución

El atributo es aprovechable cuando se recupera una fila con la sentencia SELECT.

Page 128: PL/SQL

Los atributos %ROWTYPEEjemplos: Declare una variable para guardar la información

acerca de un departamento de la tabla departamentos.

Dept_record departtments%ROWTYPE;

Declare una variable para guardar la información acerca de un empleado de la tabla employees.Emp_record demployees%ROWTYPE;

Page 129: PL/SQL

Índices por tablasSon compuestos por dos componentes:

Llave primaria o tipo de dato BINARY_INTEGER

Columna o escalar o tipo de dato registroPuede incrementan en tamaño

dinámicamente porque ellos son sin restricción

Page 130: PL/SQL

Creando un índice por tabla Sintaxis:

TYPE type_name IS TABLE OF {column_type | variable%TYPE | table.column%TYPE} [NOT NULL] | table.%ROWTYPE [INDEX BY BINARY_INTEGER];Identifier type_name;

Declare un índice por tabla para almacenar nombresEjemplo:

…TYPE ename_table_type IS TABLE OF employees.last_name%TYPE INDEX BY BINARY_INTEGER;Ename_table ename_table_type;

Page 131: PL/SQL

Índice por estructura de la tabla

1

2

3

Identificador Único Columna

Jones

Smith

Maduro

Binary_Integer Scalar

Page 132: PL/SQL

Creando un Índice por TablaDECLARE

TYPE ename_table_type IS TABLE OF employees.las_name%TYPEINDEX BY BINARY_INTEGER;

TYPE hiredate_table_type IS TABLE OF DATEINDEX BY BINARY_INTEGER;

ename_table ename_table_type; hiredate_table hiredate_table_type;BEGIN

ename_table (1) := ‘CAMERON’;hiredate_table(8) :=SYSDATE + 7;

IF ename_table.EXIST(1) THEN INSERT INTO …

…END;/

Page 133: PL/SQL

Usando Métodos de índice por tabla

Los siguientes métodos hacen un índice por tablas mas fácil de usar:

EXISTS. Retorna Verdadero si el elemento en PL/SQL existe

COUNT. Retorna el numero de elementos que la tabla contiene

FIRST AND LAST. Retorna el primer y ultimo índice PRIOR. Retorna el numero del índice que precede al índice

n NEXT. Retorna el numero del índice que sucede al índice n TRIM. Remueve un elemento del el final de la tabla PL/SQL DELETE. Elimina todos los elementos de la tabla PL/SQL

Page 134: PL/SQL

Índices por tablas de registrosDefine una tabla variable con un tipo de dato

PL/SQL permitido.Declara una variable PL/SQL para mantener

información del departamentoEjemplo:

DECLARETYPE dept_table_type IS TABLE OF

departments%ROWTYPEINDEX BY BINARY_INTEGER;

Dept_table dept_table_type;-- cada elemento de dep_table es un registro

Page 135: PL/SQL

Ejemplo de índices por tabla de Registros

SET SERVEROUTPUT ONDECLARE

TYPE emp_table_type IS TABLE OF employees.%ROWTYPEINDEX BY BINARY_INTEGER;

my_emp_table emp_table_type;v_count NUMBER(3):= 104;

BEGINFOR i IN 100 .. V_countLOOP

SELECT * INTO my_emp_table(I) FROM employees;WHERE employee_id = i;

END LOOP;FOR i IN my_emp_table.FIRST.. My_emp_table.LASTLOOP

DBMS_OUTPUT.PUT_LINE (my_emp_table(i).last_name); END LOOP;END;/

Page 136: PL/SQL

ResumenEn esta lección, usted debió haber aprendido

a : Definir y referenciar las variables PL/SQL de

tipos de datos compuestos: Registros PL/SQL Índices por tablas Índices por tabla de registros

Definir un registro PL/SQL usando el atributo %ROWTYPE

Page 137: PL/SQL

CAPITULO 6

Page 138: PL/SQL

ESCRIBIR CURSORES EXPLICITOS

Page 139: PL/SQL

Objetivos Después de completar esta lección, usted

deberá estar en la capacitad de hacer lo siguiente:Distinguir entre un cursor implícito y un

explicitoDiscutir cuándo y por qué usar un cursor

explicitoUsar una variable de registro PL/SQLEscribe un cursor de ciclo FOR

Page 140: PL/SQL

Acerca de los CursoresCada sentencia SQL ejecutada por el servidor

SQL tiene un cursor individual asociado con este:Cursores implícitos: Declarados para todas las

sentencias SELECT DML y PL/SQL. Cursores Explícitos: Declarados y nombrados

por el programador

Page 141: PL/SQL

Funciones de cursores Explícitos

Cursores explícitos Use cursores explícitos para procesos individuales, cada

fila retornada por múltiples filas con la sentencia SELECT.El grupo de filas retornado por las consultas a filas

múltiples es llamada el conjunto activo.Las funciones de los cursores explícitos son :

Pueden procesar mas allá de la primera fila retornada por la consulta, fila por fila

Mantiene el rastro de cuales filas están siendo procesadas Permite al programador el control manual de los cursores explícitos

el bloque PL/SQL

Conjunto Activo

Cursor

100 King AD_PRES101Kochar AD_VP..140 Patel ST_CLERK

Page 142: PL/SQL

Controlando cursores explícitos

Controlando cursores explícitos1. Declare el cursor nombrándolo y definiendo la estructura de la

consulta a ser ejecutada dentro de este.2. Abrir el cursor, la sentencia OPEN ejecuta la consulta y une variables

que son referenciadas. Las filas definidas por la consulta son llamadas grupo activo y ahora están habilitadas para el fetching.

3. Los datos Fetch del cursor. En el diagrama de flujo se meuestra enla diapositiva, despues de cada fetch, ustred prueba el cursor para la existencia de cada fila si hay o no mas filas para procesar, luego se debe cerrar el cursor.

4. Cerrar el cursor. La sentencia Close libera los grupos activos de filas, esto es ahora posible para reabrir el cursor para establecer un grupo activo actual

declare open fetch close

Crea un área SQL

Identifica el conjunto activo

Carga la fila actual dentro de las variable

Prueba las filas existente

Retorna a fetch si las filas son encontradas

EMPTY?

Libera el conjunto activo

NoSi

Page 143: PL/SQL

Controlando cursores explícitos Abrir el cursorFetch una filaCerrar el cursor

Abrir el cursor

Cursor puntero

Page 144: PL/SQL

Controlando cursores explícitosAbrir el cursor Ir a buscar una fila Cerrar el cursor

Ir a buscar el cursor

Puntero del cursor

Continua hasta quedarse vacio

Page 145: PL/SQL

Controlando cursores explícitos Abrir el cursor Ir a buscar la fila Cerrar el cursor

Cerrar el cursor.

Puntero del cursor

.

Page 146: PL/SQL

Declarando el cursorSintaxis:

CURSOR cursor_name IS Select_statement;

No incluye la clausula INTO en la declaración del cursor

Si las filas se procesan en una secuencia especifica es requerido, usar la clausula ORDER BY en una consulta

Page 147: PL/SQL

Declarando un cursor DECLARE

CURSOR emp_cursor IS SELECT employee_id, last_nameFROM employees;

CURSOR dept_cursor IS SELECT * FROM departmentsWHERE locarion_id = 170;

BEGIN …

Page 148: PL/SQL

Abriendo el cursorSintaxis

OPEN cursor_name;

Abrir el cursor para ejecutar la consulta e identificar el conjunto activo

Si la consulta no retorna filas, ninguna excepción es levantada

Usar atributos del cursor para probar el resultado después de un fetch

Page 149: PL/SQL

Datos fetching de el cursor Sintaxis

FETCH cursor_name INTO [variable1, variable2, …] |record_name];

Recuperar los valores de la fila actual en variables

Incluir el mismo numero de variablesCorresponder cada variable a la columna

posicionalmenteProbar y ver si el cursor contiene filas

Page 150: PL/SQL

Buscando datos desde el cursorEjemplo:

LOOP FETCH emp_cursor INTO v_empno, v_ename;EXIT WHEN …;…--- Process the retrieve data…

END LOOP;

Page 151: PL/SQL

Cerrando el cursor Sintaxis

CLOSE cursor_name;

Cerrar el cursor después de completar el procesamiento de las filas

Reabrir el cursor si se lo requiereNo Intentar ir a buscar los datos desde un

cursor después de que haya sido cerrado

Page 152: PL/SQL

Atributos explícitos de los cursoresObtener el estado de información acerca del cursor

Atributo Tipo Descripción

%ISOPEN Booleana

Evaluar VERDADERO si el cursor el abierto

%NOTFOUND Booleana

Evaluar V si el mas reciente fetch no retorna una fila

%FOUND Booleana

Evalúa Verdadero si el mas reciente fetch retorna una fila; complementa %NOTFOUND

%ROWCOUNT Numeral

Evalúa el numero total de filas retornadas a distancia

Page 153: PL/SQL

El atributo %ISOPEN Se va a buscar filas solo si el cursor esta abierto Se usa el atributo %ISOPEN antes de ejecutar

un fetch para probar si el cursor es abierto.Ejemplo:

IF NOT emp_cursor%ISOPEN THENOPEN emp_cursor;

END IF ;LOOP

FETCH emp_cursor …

Page 154: PL/SQL

Controlando fetches múltiples

Procesar varias filas desde un cursor explicito usando un ciclo cerrado.

Ir a buscar una fila con cada iteración Usar atributos de un cursor explicito para

probar el acierto de cada fetch.

Page 155: PL/SQL

Los atributos %NOTFOUND y % ROWCOUNT

Usar el atributo del cursor %ROWCOUNT para recuperar un numero exacto de filas

Use el atributo del cursor %NOTFOUND para determinar cuando existe el ciclo.

Page 156: PL/SQL

Ejemplo:DECLARE

v_empno employees.employee_id%TYPE;v_ename employees.last_name%TYPE;CURSOR emp_cursor IS

SELECT employee_id last_namefrom employees

BEGIN OPEN emp_cursor;LOOP

FETCH emp_cursor into v_empno, v_ename;EXIT WHEN emp_cursor %ROWCOUNT >10 ORemp_cursor %ROWFOUND ;DBMS_OUTPUT. PUT_LINE(TO_CHAR(vempno)||”” ||

v_ename);END LOOP;

CLOSE emp_cursor;END

Page 157: PL/SQL

CURSORES Y REGISTROSProcesar las filas del conjunto activo buscando valores de un archivo

PL/SQL.DECLARE

CURSOR emp_cursor IS SELECT employee_id last_nameFROM employees;emp_record emp_cursor %ROWTYPE;BEGINOPEN emp_cusor;LOOP

FETCH emp_cursor int emp_record;…

emp_recordEmployee_id last_name

100 King

Page 158: PL/SQL

Ciclos LOOP de CursoresSintaxisFOR record_name IN cursor_name LOOP

statement1;Statement2;…END LOOP;

•El ciclo For es un atajo al proceso explicito de cursores•Implicito Open, fetch, exit, y close ocurre•El registro es declarado implícitamente

Page 159: PL/SQL

Ciclos FOR para cursoresImprime una lista de empleados los cuales

trabajan para el departamento de ventas

DECLARECURSOR emp_cursor IS

SELECT last_name, department_id last_nameFROM employees

BEGINFOR emp_record IN emp_cursor LOOP

-- implicit open and implicit fetch occurIF emp_record.department_id = 80 THEN…END LOOP; -- implicit close occurs

END;

Page 160: PL/SQL

Ciclos FOR para cursores usando subconsultas

No se necesita declarar el cursorEjemplo:

BEGINFOR emp_record IN (SELECT last_name, department_id

FROM employees) LOOP IF emp_record.department_id = 80 THEN …END LOOP; -- implicit close occurs

END;

Page 161: PL/SQL

ResumenEn esta lección, usted debió haber aprendido

a:Distinguir tipos de cursores:

Cursores implícitos: usados por todas las sentencias DML y consultas a filas simples

Cursores explícitos: usados por consultas de cero, uno, o mas filas

Manipular cursores explicitosEvaluar estados del cursor usando atributos

del cursorUsar cursores con ciclos FOR

Page 162: PL/SQL

CAPITULO 7

Page 163: PL/SQL

CONCEPTOS AVANZADOS DE CURSORES EXPLICITOS

Page 164: PL/SQL

Objetivos Después de completar esta lección, usted

deberá ser capaz de hacer lo siguiente:Escribir un cursor cuando es requerida una

actualización FOR en el cursor .Determinar cuando una clausura de

actualización FOR en un cursor es requerida.Determinar cuando usar la sentencia WHERE

CURRENT OFEscribir un cursor que usa subconsultas

Page 165: PL/SQL

Cursores con parámetrosSintaxis:

CURSOR cursor_name[(parameter_name datatype, …)]IS Select_statement;

Pasar valores de los parámetros a un cursor cuando el cursor es abierto y la consulta es ejecutada.

Abrir un cursor explicito algunas veces con un diferente conjunto activo cada vez

OPEN cursor_name (parameter_value, . . .);

Page 166: PL/SQL

Cursores con parametrosPasar el numero de departamento y titulo de trabajo a

la sentencia where, en el cursor o sentencia SELECT

DECLARECURSOR emp_cursor(p_deptno NUMBER, p_job VARCHAR2) IS SELECT employee_id, last_name FROM employeesWHERE department_id = p_deptnoAND job_id = p_job;

BEGINOPEN emp_cursor (80, ‘SA_REP’);…CLOSE emp_cursor;OPEN emp_cursor (60, ‘IT_PROG’);…

END;

Page 167: PL/SQL

La clausula FOR UPDATESintaxis:

SELECT…FROMFOR UPDATE [OF column_reference] [NOWAIT];

•Use trabas explicitas para denegar acceso para la duración de la transacción.

•Cerrar las filas antes de la actualización o eliminación

Page 168: PL/SQL

La clausula FOR UPDATERecuperar los empleados que trabajen en el departamento 80 y actualice sus

salario

DECLARECURSOR emp_cursor IS

SELECT employees_id, last_name, department_name

FROM employees , departmentsWHERE employees, departments_id =

departments.department_idAND employees.department_id =80FOR UPDATE OF salary NOWAIT;

Page 169: PL/SQL

La clausula WHERE CURRENT OFSyntaxis:

WHERE CURRENT OF cursor:

•Use cursores para actualizar o eliminar la fila actual.•Incluya la sentencia FOR UPDATE en la consulta del cursor para bloquear primero las filas.•Use la clausula WHERE CURRENT OF para referenciar la fila actual de un cursor explicito.

Page 170: PL/SQL

La clausula WHERE CURRENT OF

DECLARECURSOR sal_cursor IS

SELECT e.department_id, employee_id, last_name, salary

FROM employees e, departments dWHERE d.department.id c = e. department_id AND d.department id ca =60FOR UPDATE OF salary NOWAIT;

BEGINFOR emp_record in sal_cursorLOOP if emprecord.salary <5000 THENUPDATE employees SET salary = emp_record.salary * 1.10WHERE CURRENT OF sal_cursor;AND IFEND LOOP;END

Page 171: PL/SQL

Cursores con SUBCONSULTASEjemplo:

DECLARECURSOR my_cursor IS

SELECT t1.department_id, t1.department_name, t2.staff

FROM departments t1,(select departmen_id,COUNT(*) AS STAFF

FROM employees GROUP BY department_id) t2

WHERE t1.department_id =t2.department_idAND t2.stuff >=3;

Page 172: PL/SQL

RESUMEN

En esta leccion debiste haber aprendido a:Retornar diferentes conjuntos activos usando

cursores con parametros.Definir cursores con subconsultas y

subconsultas correlacionados.Manipular cursores explicitos con comandos

usando las:- Clausula FOR UPDATE - Clausula WHERE CURRENT OF

Page 173: PL/SQL

La clausula FOR UPDATERecuperar los empleados que trabajen en el departamento 80 y actualice sus

salario

DECLARECURSOR emp_cursor IS

SELECT employees_id, last_name, department_name

FROM employees , departmentsWHERE employees, departments_id =

departments.department_idAND employees.department_id =80FOR UPDATE OF salary NOWAIT;

Page 174: PL/SQL

CAPITULO 8

Page 175: PL/SQL

MANIPULANDO EXCEPCIONES

Page 176: PL/SQL

Objetivos Despues de completar esta leccion, sera

capaza de hacer lo siguiente:Definir excepciones PL/SQLReconocer excepciones que no son manipulablesListar diferentes tipos de excepciones

manejables PL/SQLAtrapar errores no anticipadosDescribir los efectos de la propagación de

excepciones en cloques anidadosAdaptar mensajes de excepciones PL/SQL

Page 177: PL/SQL

Manejando excepciones con PL/SQL

Una excepción es un identificador en PL/SQL que es levantada durante la ejecución.

Como es levantada?Un error Oracle ocurreSe levanta explícitamente

Como se los manipula?Atraparlo con un manipuladorPropagarlo en un entorno de invocación

Page 178: PL/SQL

Manejando excepciones

Page 179: PL/SQL

Tipos de ExcepcionesImplícitamente levantadoPredefinir el servidor OracleNo predefinir el servidor Oracle

Explícitamente levantadoUsuario definido

Page 180: PL/SQL

Atrapando excvepcionesSintaxis:

EXCEPTION WHEN exception1 [OR exception2 . . . ] THEN statement1; statement2; … [WHEN exception3 [OR exception4 …] THEN statement1; statement2; …] [WHEN OTHERS THEN statement1; statement2; …]

Page 181: PL/SQL

Atrapando excepciones con líneas de guías

La palabra reservada EXCEPTION empieza la sección exception-handling

Algunos manejadores de excepciones son permitidas

Solo un manejador es procesado antes de dejar el bloque

WHEN OTHERS es la ultima clausula

Page 182: PL/SQL

Atrapando errores predefinidos en el servidor Oracle

Referencia el nombre estándar en la rutina de manejo de excepciones

Probar excepciones predefinidas:NO_DATA_FOUNDTOO_MANY_ROWS

INVALID_CURSORSZERO_DIVIDEDUP_VAL_ON_INDEX

Page 183: PL/SQL

Excepciones predefinidasSintaxis:BEGIN…EXCEPTION WHEN NO DATA FOUND THEN

statement1;statement2;WHEN TOO_MANY_ROWS THENstatement1;

WHEN NO OTHERS THEN statement1;statement2;statement3;

END;

Page 184: PL/SQL

Atrapando errores no predefinidos del Servidor Oracle

Nombrar la excepción Codificar el pragma Manejar el levantamiento de la EXCEPTION_INIT excepcion

Sección de declaración Seccion Exception-

handling

Declare Associate reference

Page 185: PL/SQL

Errores no predefinidos Atrapar los errores del servidor Oracle numero -2292, una violación de integridad

DEFINE p_deptno = 10DECLARE

e_emps_remaining EXCEPTION;PRAGMA EXCEPTION_INIT(e_emps_remaining, -2292);

BEGINDELETE FROM departmentsWHERE department_id = &p_deptno;COMMIT;

EXCEPTIONWHEN e_emps_remaining THEN DBMS_OUTOPUT.PUT_LINE (‘no puede eliminmar

dept’ ||)TO_CHAR (&p_deptno ) || ‘. Employees existe. ’);

END;

Page 186: PL/SQL

Funciones para atrapar excepciones

SQLCODE: regresa el valor numérico por el código de error

SQLERRM: regresa el mensaje asociado con el número de error

Page 187: PL/SQL

Funciones para atrapar excepciones

DECLARE

v_error_code NUMBER;v_error_message VARCHAR2(255);

BEGIN…EXCEPTION…

WHEN OTHERS THEN ROLLBACK;v_error_code := SQLCODE;v_error_mesage := SQLERRM;INSERT INTO errorsVALUES (v_error_code , v_error_message);

END;

Page 188: PL/SQL

Sección ejecutable

Atrapando excepciones User-defined

Sección de declaración

Seccion Exception-handling

Declare Raise reference

Nombre de la excepción

Levantar explícitamenteLa excepción usando la Sentencia RAISE

Manipular la excepción De levantamiento

Page 189: PL/SQL

Excepciones user-definedDEFINE p_departmente_desc = ‘Information tecnologhy’DEFINE p_departmente_number= 300

DECLAREe_invalid_department EXCEPTION;

BEGINUPDATE departments;SET department_name = ‘&p_department_desc’WHERE department_id = &p_department_number;IF SQL%NOTFOUND THEN

RAISE e_invalid_department;END IF;COMMIT;

EXCEPTIOWHEN e_invalid_department THEN DBMS_OUTPUT.PUT_LINE (‘no such department id’);

END;

Page 190: PL/SQL

Llamando entornosiSQL *Plus Despliega el numero

de error y mensaje a la pantalla

Constructor de procedimiento

Despliega el numero de error y mensaje a la pantalla

Formas del desarrollador de Oracle

Accesa al numero de error y mensaje en un trigger

Aplicación Precompilada

Accesa al numero de error a traves de la estructura de datos SQLCA

Un Bloque PL/SQL incluído

Atrapa excepciones en routinas de exeption-handling del bloque incluído

Page 191: PL/SQL

Propagando excepciones DECLARE

e_no_rows EXCEPTION;e_integrity EXCEPTION;PRAGMA EXCEPTION_INIT (e_integrity, -2292)

BEGINFOR c_record IN emp_cursor LOOPBEGIN

SELECT … UPDATE …IF SQL%NOTFOUND THEN

RAISE e_no_rows;END IF;

END; END LOOP;EXCEPTIONWHEN e_integrity THEN … WHEN e_no_rows THEN …

END;

Page 192: PL/SQL

Procedimiento RAISE_APLICATION_ERROR

Sintaxis:Raise_aplication_error (erroe_number, message [, {TRUE |

FALSE } ]);

• Usted puede usar este procedimiento para publicar mensajes de error de subprogramas almacenados.

• Usted puede reportar errores a su aplicación y permitir el retorno de excepciones no manejables

Page 193: PL/SQL

Procedimiento RAISE_APLICATION_ERROR

Se usan en dos diferentes lugares:Sección Ejecutable

Sección de excepción

Retorna condiciones de error al usuario en manera consistente con otros errores del servidor Oracle

Page 194: PL/SQL

RAISE_APLICATION_ERRORSección ejecutable:BEGIN…DELETE FROM EMPLOYEES

WHERE manager_id = v_mgr;IF SQL%NOTFOUND THEN

RAISE APLICATION_ERROR (-20202, ‘este no es un manejador valido’);END IF;…

Sección de excepción:…EXCEPTION

WHEN NO_DATA_FOUND THENRAISE_APPLICATION ERROR(-20201, ‘el administrador no

es empleado valido’);END;

Page 195: PL/SQL

ResumenEn esta lección, usted debió haber aprendido

que :Tipos de excepciones:

Error predefinido por el servidor Oracle Error no predefinido por el servidor Oracle Error definido por el usuario

Atrapar excepcionesManejar excepciones:

Atrapar la excepción dentro del bloque PL/SQL Propagar la excepción

Page 196: PL/SQL

CAPITULO 9

Page 197: PL/SQL

ObjetivosDespués de completar esta lección, usted

será capaz de hacer lo siguiente:Distinguir bloques anónimos PL/SQL de

bloques PL/SQL con nombre (subprogramas)Describir subprogramasListar los beneficios de usar subprogramasListar los diferentes entornos de donde los

subprogramas pueden ser envocados.

Page 198: PL/SQL

objetivosDespués de completar esta lección, usted

será capaz de hacer lo siguiente:Ddescribir bloques PL/SQL y subprogramasDescribir los usos de procedimientosCrear procedimeintosDiefrenciar entre parametros formales y

actualesCrear procedimientos si parametrosInvocar un procedimeintoManejar excepciones en procedimeintosEliminar un procedimiento

Page 199: PL/SQL

Vista general de subprogramas Un subprograma:

Es un bloque con nombre PL/SQL que puede aceptar parametros y ser invocado desde una llamada del entorno Es de dos tipos:un procedimiento que ejecuta una accion Una funcion que calcula un valor

Es basado en estructutras estandar de bloques PL/SQL

Provee modularidad, reusabilidad, extensibilidad y manetnimeinto.

Provee facil mantenimiento, mejora la seguridad de datos , integridad, funcionamiento y claridad del codigo