Post on 02-Feb-2016
Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
11
Visión General de PL/SQLVisión General de PL/SQL
1-2 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Visión GlobalVisión Global
AplicacionesAplicaciones
Cliente
Servidor
HerramientasHerramientas
SQL, PL/SQLSQL, PL/SQL
DatosDatos
Sistema OperativoSistema Operativo
Oracle8Oracle8
1-3 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Estructura de Bloque en Bloques Anónimos PL/SQL
Estructura de Bloque en Bloques Anónimos PL/SQL
• DECLARE (opcional)
Define objetos PL/SQL que serán utilizados dentro del mismo bloque
• BEGIN (obligatorio)
Sentencias Ejecutables
• EXCEPTION (opcional)
Qué hacer si la acción ejecutada causa un error
• END; (obligatorio )
• DECLARE (opcional)
Define objetos PL/SQL que serán utilizados dentro del mismo bloque
• BEGIN (obligatorio)
Sentencias Ejecutables
• EXCEPTION (opcional)
Qué hacer si la acción ejecutada causa un error
• END; (obligatorio )
1-4 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Estructura de Bloque en Subprogramas PL/SQL
Estructura de Bloque en Subprogramas PL/SQL
CabeceraCabecera
ISIS
Sección DeclarativaSección Declarativa
BEGINBEGIN
Sección EjecutableSección Ejecutable
EXCEPTIONEXCEPTION
Sección de ExcepcionesSección de Excepciones
END;END;
CabeceraCabecera
ISIS
Sección DeclarativaSección Declarativa
BEGINBEGIN
Sección EjecutableSección Ejecutable
EXCEPTIONEXCEPTION
Sección de ExcepcionesSección de Excepciones
END;END;
1-5 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Tipos de BloquesTipos de BloquesAnónimo:Anónimo: [DECLARE][DECLARE]
BEGINBEGIN
sentencias ejecutables;sentencias ejecutables;
[EXCEPTION][EXCEPTION]
END;END;
Procedimiento:Procedimiento: PROCEDUREPROCEDURE nombre_procedimiento nombre_procedimiento
ISIS
[declaración - opcional][declaración - opcional]
BEGINBEGIN
sentencias ejecutables;sentencias ejecutables;
[EXCEPTION][EXCEPTION]
END;END;
Función:Función: FUNCTIONFUNCTION nombre_funcion nombre_funcion
RETURN RETURN tipo de dato a devolvertipo de dato a devolver
ISIS [declaración - opcional][declaración - opcional]
BEGINBEGIN
sentencias ejecutables;sentencias ejecutables;
RETURNRETURN value; value;
[EXCEPTION][EXCEPTION]
END;END;
Anónimo:Anónimo: [DECLARE][DECLARE]
BEGINBEGIN
sentencias ejecutables;sentencias ejecutables;
[EXCEPTION][EXCEPTION]
END;END;
Procedimiento:Procedimiento: PROCEDUREPROCEDURE nombre_procedimiento nombre_procedimiento
ISIS
[declaración - opcional][declaración - opcional]
BEGINBEGIN
sentencias ejecutables;sentencias ejecutables;
[EXCEPTION][EXCEPTION]
END;END;
Función:Función: FUNCTIONFUNCTION nombre_funcion nombre_funcion
RETURN RETURN tipo de dato a devolvertipo de dato a devolver
ISIS [declaración - opcional][declaración - opcional]
BEGINBEGIN
sentencias ejecutables;sentencias ejecutables;
RETURNRETURN value; value;
[EXCEPTION][EXCEPTION]
END;END;
1-6 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Entornos de DesarrolloEntornos de Desarrollo
• SQL*Plus
Utiliza el motor PL/SQL en el servidor Oracle
• Procedure Builder
Utiliza el motor PL/SQL en la herramienta cliente o en el servidor Oracle
• SQL*Plus
Utiliza el motor PL/SQL en el servidor Oracle
• Procedure Builder
Utiliza el motor PL/SQL en la herramienta cliente o en el servidor Oracle
1-7 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
ResumenResumen
• Los bloques anónimos, son bloques PL/SQL sin nombre.
• Los subprogramas son bloques PL/SQL con nombre, declarados como funciones o procedimientos.
• Hay dos entornos de desarrollo PL/SQL principales:
– SQL*Plus
– Procedure Builder
• Los bloques anónimos, son bloques PL/SQL sin nombre.
• Los subprogramas son bloques PL/SQL con nombre, declarados como funciones o procedimientos.
• Hay dos entornos de desarrollo PL/SQL principales:
– SQL*Plus
– Procedure Builder
1-8 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
VARIABLES en PL/SQLVARIABLES en PL/SQL
1-9 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Uso de las variablesUso de las variables
Las variables se usan para:Las variables se usan para:
- Almacenamiento temporal de los datos- Almacenamiento temporal de los datos
- Manipulación de valores almacenados, - Manipulación de valores almacenados,
- Reusabilidad (se pueden utilizar repetidas - Reusabilidad (se pueden utilizar repetidas veces dentro de una aplicación)veces dentro de una aplicación)
Las variables se usan para:Las variables se usan para:
- Almacenamiento temporal de los datos- Almacenamiento temporal de los datos
- Manipulación de valores almacenados, - Manipulación de valores almacenados,
- Reusabilidad (se pueden utilizar repetidas - Reusabilidad (se pueden utilizar repetidas veces dentro de una aplicación)veces dentro de una aplicación)
1-10 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Gestión de Variables en PL/SQLL
Gestión de Variables en PL/SQLL
• Declarar e inicializar las variables dentro Declarar e inicializar las variables dentro de la sección declaradorade la sección declaradora
• Asignar nuevos valores a las variables Asignar nuevos valores a las variables dentro de la sección de códigodentro de la sección de código
• Pasar valores a los bloques PL/SQL a Pasar valores a los bloques PL/SQL a través de los parámetrostravés de los parámetros
• Ver los resultados a través de variables Ver los resultados a través de variables de salida.de salida.
• Declarar e inicializar las variables dentro Declarar e inicializar las variables dentro de la sección declaradorade la sección declaradora
• Asignar nuevos valores a las variables Asignar nuevos valores a las variables dentro de la sección de códigodentro de la sección de código
• Pasar valores a los bloques PL/SQL a Pasar valores a los bloques PL/SQL a través de los parámetrostravés de los parámetros
• Ver los resultados a través de variables Ver los resultados a través de variables de salida.de salida.
1-11 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Declaración de Variables PL/SQL
Declaración de Variables PL/SQL
Sintaxis
Ejemplos
Sintaxis
Ejemplos
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
Declare v_hiredate DATE; v_deptno NUMBER(2) NOT NULL := 10; v_location VARCHAR2(13) := 'Atlanta'; c_comm CONSTANT NUMBER := 1400;
Declare v_hiredate DATE; v_deptno NUMBER(2) NOT NULL := 10; v_location VARCHAR2(13) := 'Atlanta'; c_comm CONSTANT NUMBER := 1400;
1-12 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Recomendaciones Declaración Variables
Recomendaciones Declaración Variables
• Seguir las convenciones de nombresSeguir las convenciones de nombres
• Inicializar las ctes. y variables Inicializar las ctes. y variables designadas como NOT NULLdesignadas como NOT NULL
• Inicializar usando el parámetro de Inicializar usando el parámetro de asignación := o la palabra DEFAULTasignación := o la palabra DEFAULT
• Declarar como máximo un identificador Declarar como máximo un identificador por líneapor línea
• Seguir las convenciones de nombresSeguir las convenciones de nombres
• Inicializar las ctes. y variables Inicializar las ctes. y variables designadas como NOT NULLdesignadas como NOT NULL
• Inicializar usando el parámetro de Inicializar usando el parámetro de asignación := o la palabra DEFAULTasignación := o la palabra DEFAULT
• Declarar como máximo un identificador Declarar como máximo un identificador por líneapor línea
1-13 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Principales variables escalaresPrincipales variables escalares
VARCHAR2 (VARCHAR2 (maximum_lengthmaximum_length))
NUMBER [(NUMBER [(precision, scaleprecision, scale)])]
DATEDATE
CHAR [(CHAR [(maximum_lengthmaximum_length)])]
LONGLONG
LONG RAWLONG RAW
BOOLEANBOOLEAN (true,false or NULL)(true,false or NULL)
BINARY_INTEGERBINARY_INTEGER
VARCHAR2 (VARCHAR2 (maximum_lengthmaximum_length))
NUMBER [(NUMBER [(precision, scaleprecision, scale)])]
DATEDATE
CHAR [(CHAR [(maximum_lengthmaximum_length)])]
LONGLONG
LONG RAWLONG RAW
BOOLEANBOOLEAN (true,false or NULL)(true,false or NULL)
BINARY_INTEGERBINARY_INTEGER
1-14 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Inicialización de variablesInicialización de variables
USO:USO:
• := Operador de asignación:= Operador de asignación
• DEFAULTDEFAULT
• NOT NULLNOT NULL
USO:USO:
• := Operador de asignación:= Operador de asignación
• DEFAULTDEFAULT
• NOT NULLNOT NULL
1-15 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Declaración de variables escalares
Declaración de variables escalares
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; ...
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; ...
EjemplosEjemplosEjemplosEjemplos
1-16 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
El atributo %TYPEEl atributo %TYPE
Declarar una variable basada en: Declarar una variable basada en:
• Otras variables previamente declaradas
• La definición de una columna de la bbdd
Preceder %TYPE por:Preceder %TYPE por:
• La tabla y la columna de la bbdd
• El nombre de la variable definia con anterioridad
Declarar una variable basada en: Declarar una variable basada en:
• Otras variables previamente declaradas
• La definición de una columna de la bbdd
Preceder %TYPE por:Preceder %TYPE por:
• La tabla y la columna de la bbdd
• El nombre de la variable definia con anterioridad
1-17 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Declaración de variables con el Atributo %TYPE
Declaración de variables con el Atributo %TYPE
Ejemplos:Ejemplos:Ejemplos:Ejemplos:
... v_name employees.last_name%TYPE; v_balance NUMBER(7,2); v_min_balance v_balance%TYPE := 10;...
... v_name employees.last_name%TYPE; v_balance NUMBER(7,2); v_min_balance v_balance%TYPE := 10;...
1-18 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Interación con elServidor Oracle 8Interación con elServidor Oracle 8
1-19 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Sentencias SQL en PL/SQLSentencias SQL en PL/SQL
• PL/SQL soporta:PL/SQL soporta:
Sentencias SQL, para extraer Sentencias SQL, para extraer información o aplicar cambios a la bbddinformación o aplicar cambios a la bbdd
• PL/SQL no soporta:PL/SQL no soporta:
- el lenguaje de definición de datos (DDL), - el lenguaje de definición de datos (DDL), como CREATE TABLE, ALTER TABLE o como CREATE TABLE, ALTER TABLE o DROP TABLEDROP TABLE
- Lenguaje de control de datos (DCL), - Lenguaje de control de datos (DCL), como GRANT y REVOKEcomo GRANT y REVOKE
• PL/SQL soporta:PL/SQL soporta:
Sentencias SQL, para extraer Sentencias SQL, para extraer información o aplicar cambios a la bbddinformación o aplicar cambios a la bbdd
• PL/SQL no soporta:PL/SQL no soporta:
- el lenguaje de definición de datos (DDL), - el lenguaje de definición de datos (DDL), como CREATE TABLE, ALTER TABLE o como CREATE TABLE, ALTER TABLE o DROP TABLEDROP TABLE
- Lenguaje de control de datos (DCL), - Lenguaje de control de datos (DCL), como GRANT y REVOKEcomo GRANT y REVOKE
1-20 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Sentencias SQL en PL/SQLSentencias SQL en PL/SQL
• Extraer una fila de datos de la bbdd Extraer una fila de datos de la bbdd utilizando el comando SELECT. Sólo utilizando el comando SELECT. Sólo puede ser devuelta una filapuede ser devuelta una fila
• Realizar cambios a las filas de una tabla Realizar cambios a las filas de una tabla de bbdd, utilizando comandos DML de bbdd, utilizando comandos DML ( INSERT, UPDATE, DELETE)( INSERT, UPDATE, DELETE)
• Extraer una fila de datos de la bbdd Extraer una fila de datos de la bbdd utilizando el comando SELECT. Sólo utilizando el comando SELECT. Sólo puede ser devuelta una filapuede ser devuelta una fila
• Realizar cambios a las filas de una tabla Realizar cambios a las filas de una tabla de bbdd, utilizando comandos DML de bbdd, utilizando comandos DML ( INSERT, UPDATE, DELETE)( INSERT, UPDATE, DELETE)
1-21 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Sentencias SELECT de PL/SQLSentencias SELECT de PL/SQL
Recuperar datos de tablas de una bbdd Recuperar datos de tablas de una bbdd mediante SELECT, y con la clausula INTO mediante SELECT, y con la clausula INTO obligatoriaobligatoria
Sintaxis:Sintaxis:
Recuperar datos de tablas de una bbdd Recuperar datos de tablas de una bbdd mediante SELECT, y con la clausula INTO mediante SELECT, y con la clausula INTO obligatoriaobligatoria
Sintaxis:Sintaxis:
SELECT select_listINTO {variable_name[, variable_name]...
| record_name} FROM tableWHERE condition;
1-22 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Sentencias SELECT de PL/SQLSentencias SELECT de PL/SQL
Ejemplo:Ejemplo:Ejemplo:Ejemplo:DECLARE v_deptno NUMBER(4); v_location_id NUMBER(4);BEGIN SELECT department_id, location_id INTO v_deptno, v_location_id FROM departments WHERE department_name = 'Sales'; ...END;/
DECLARE v_deptno NUMBER(4); v_location_id NUMBER(4);BEGIN SELECT department_id, location_id INTO v_deptno, v_location_id FROM departments WHERE department_name = 'Sales'; ...END;/
1-23 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Sentencias SELECT de PL/SQLSentencias SELECT de PL/SQL
Ejemplo:Ejemplo:Ejemplo:Ejemplo:
DECLARE v_hire_date employees.hire_date%TYPE; v_salary employees.salary%TYPE; BEGIN SELECT hire_date, salary INTO v_hire_date, v_salary FROM employees WHERE employee_id = 100;
...END;/
DECLARE v_hire_date employees.hire_date%TYPE; v_salary employees.salary%TYPE; BEGIN SELECT hire_date, salary INTO v_hire_date, v_salary FROM employees WHERE employee_id = 100;
...END;/
1-24 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
INSERT
UPDATE
DELETE
Manipulación de Datos Utilizando PL/SQL
Manipulación de Datos Utilizando PL/SQL
Modificar las tablas de la bbdd utilizando Modificar las tablas de la bbdd utilizando comandos DMLcomandos DML
• INSERT
• UPDATE
• DELETE
Modificar las tablas de la bbdd utilizando Modificar las tablas de la bbdd utilizando comandos DMLcomandos DML
• INSERT
• UPDATE
• DELETEMERGE
1-25 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Inserción de DatosInserción de Datos
Añadir nuevos registros a tabla de bbddAñadir nuevos registros a tabla de bbdd
Ejemplo:Ejemplo:
Añadir nuevos registros a tabla de bbddAñadir nuevos registros a tabla de bbdd
Ejemplo:Ejemplo:
BEGIN INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary) VALUES (employees_seq.NEXTVAL, 'Ruth', 'Cores', 'RCORES', sysdate, 'AD_ASST', 4000);END;/
BEGIN INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary) VALUES (employees_seq.NEXTVAL, 'Ruth', 'Cores', 'RCORES', sysdate, 'AD_ASST', 4000);END;/
1-26 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Actualización de datosActualización de datos
Ejemplo:Ejemplo:Ejemplo:Ejemplo:
DECLARE v_sal_increase employees.salary%TYPE := 800; BEGIN UPDATE employees SET salary = salary + v_sal_increase WHERE job_id = 'ST_CLERK';END;/
1-27 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Supresión de datosSupresión de datos
Ejemplo:Ejemplo:Ejemplo:Ejemplo:
DECLARE v_deptno employees.department_id%TYPE := 10; BEGIN DELETE FROM employees WHERE department_id = v_deptno;END;/
DECLARE v_deptno employees.department_id%TYPE := 10; BEGIN DELETE FROM employees WHERE department_id = v_deptno;END;/
Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
11
Creación de Estructuras de Control
Creación de Estructuras de Control
1-29 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Control del Flujo de Ejecución PL/SQL
•Se puede modificar el flujo lógico de Se puede modificar el flujo lógico de sentencias utilizando sentencias IF sentencias utilizando sentencias IF condicionales y estructuras de control de condicionales y estructuras de control de buclesbucles
•Sentencias IFSentencias IF condicionales: condicionales:
• IF-THEN-END IF
• IF-THEN-ELSE-END IF
• IF-THEN-ELSIF-END IF
1-30 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Sentencias IF
IF condition THEN statements;[ELSIF condition THEN statements;][ELSE statements;]END IF;
IF condition THEN statements;[ELSIF condition THEN statements;][ELSE statements;]END IF;
Sintaxis
Asignar el ID de director 22 si el nombre del empleado es Osborne
Sintaxis
Asignar el ID de director 22 si el nombre del empleado es OsborneIF v_last_name = 'OSBORNE' THEN v_mgr := 22;END IF;
IF v_last_name = 'OSBORNE' THEN v_mgr := 22;END IF;
1-31 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Flujo de ejecución de la Sentencia IF-THEN-ELSE
IF conditionIF conditionTRUE
THEN actionsTHEN actions(including further IFs)(including further IFs)
THEN actionsTHEN actions(including further IFs)(including further IFs)
FALSE
ELSE actionsELSE actions(including further IFs)(including further IFs)
ELSE actionsELSE actions(including further IFs)(including further IFs)
1-32 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
IF-THEN-ELSIF Statement Execution Flow
IF conditionIF conditionTRUE
THEN actionsTHEN actionsTHEN actionsTHEN actions
FALSE
ELSIFELSIFconditioncondition
ELSIFELSIFconditioncondition
TRUE
THEN actionsTHEN actionsTHEN actionsTHEN actions
FALSE
ELSEELSEactionsactionsELSEELSE
actionsactions
1-33 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Bucle básico
SyntaxSyntax
LOOP statement1; . . . EXIT [WHEN condition];END LOOP;
LOOP statement1; . . . EXIT [WHEN condition];END LOOP;
condition is a Boolean variable or expression (TRUE, FALSE,
or NULL);
condition is a Boolean variable or expression (TRUE, FALSE,
or NULL);
-- delimiter-- delimiter
-- statements-- statements
-- EXIT statement-- EXIT statement
-- delimiter-- delimiter
1-34 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
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;/
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;/
Bucle BásicoEjemploEjemplo
1-35 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
bucle WHILE
SintáxisSintáxis
Usar el bucle WHILE para repetir Usar el bucle WHILE para repetir sentencias mientras una condición sea sentencias mientras una condición sea TRUETRUE
WHILE condition LOOP statement1; statement2; . . .END LOOP;
WHILE condition LOOP statement1; statement2; . . .END LOOP;
Condition isCondition isevaluated at the evaluated at the beginning ofbeginning ofeach iteration.each iteration.
1-36 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
bucle WHILEEjemploEjemplo
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 locations WHERE country_id = v_country_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;/
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 locations WHERE country_id = v_country_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;/
1-37 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Bucle FORSintaxisSintaxis
• Utilizar un bucle FOR para reducir el num de repeticiones
• No declarar el contador, se declara implícitamente
FOR counter in [REVERSE] lower_bound..upper_bound LOOP statement1; statement2; . . .END LOOP;
FOR counter in [REVERSE] lower_bound..upper_bound LOOP statement1; statement2; . . .END LOOP;
1-38 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Bucle FORInsertar las 10 primeras líneas del pedido Insertar las 10 primeras líneas del pedido del num 101del num 101
. . . v_ordid item.ordid%TYPE:=101;BEGIN. . .FOR i IN 1..10 LOOP INSERT INTO item(ordid,itemid) VALUES(v_ordid, i); END LOOP;END;/
. . . v_ordid item.ordid%TYPE:=101;BEGIN. . .FOR i IN 1..10 LOOP INSERT INTO item(ordid,itemid) VALUES(v_ordid, i); END LOOP;END;/
1-39 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Cursores explícitosCursores explícitos
1-40 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Acerca de cursores explícitosAcerca de cursores explícitos
• Declarados y nombrados por el Declarados y nombrados por el programadorprogramador
• Manipulados por medio de sentencias Manipulados por medio de sentencias específicas en las acciones ejecutables específicas en las acciones ejecutables del bloque.del bloque.
• Utilizarlos para procesar Utilizarlos para procesar individualmente las filas devueltas por individualmente las filas devueltas por una sentencia SELECT de varias filasuna sentencia SELECT de varias filas
• Declarados y nombrados por el Declarados y nombrados por el programadorprogramador
• Manipulados por medio de sentencias Manipulados por medio de sentencias específicas en las acciones ejecutables específicas en las acciones ejecutables del bloque.del bloque.
• Utilizarlos para procesar Utilizarlos para procesar individualmente las filas devueltas por individualmente las filas devueltas por una sentencia SELECT de varias filasuna sentencia SELECT de varias filas
1-41 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Control de cursores ExplícitosControl de cursores Explícitos
• Declarar
DECLAREDECLAREDECLAREDECLARE
• Abrir el cursor
OPENOPENOPENOPEN
• Recuperar datos del cursor, fila a fila
FETCHFETCHFETCHFETCH
• Comprueba si hay registros
EMPTY?
• Devuelve el control a FECH si encuentra registros
NoNo
• Cierra el cursor
CLOSECLOSECLOSECLOSEYesYes
1-42 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Control de cursores ExplícitosControl de cursores ExplícitosAbrir cursor
CursorCursor
Puntero
CursorCursor
Puntero
Recuperar fila del cursor
Continuar hasta que quede vacío
CursorCursor
Puntero
Cerrar el cursor
1-43 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Declaración del CursorDeclaración del CursorSintaxisSintaxis
• No incluir la cláusula INTO en la declaración del cursorNo incluir la cláusula INTO en la declaración del cursor
• Si es necesario procesar filas en una secuencia, utilizar la cláusula ORDER BY en la consultaSi es necesario procesar filas en una secuencia, utilizar la cláusula ORDER BY en la consulta
SintaxisSintaxis
• No incluir la cláusula INTO en la declaración del cursorNo incluir la cláusula INTO en la declaración del cursor
• Si es necesario procesar filas en una secuencia, utilizar la cláusula ORDER BY en la consultaSi es necesario procesar filas en una secuencia, utilizar la cláusula ORDER BY en la consulta
CURSOR cursor_name IS
select_statement;
CURSOR cursor_name IS
select_statement;
1-44 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Declaración del cursorDeclaración del cursor
EjemploEjemploEjemploEjemplo
DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees;
CURSOR dept_cursor IS SELECT * FROM departments WHERE department_id = 10;BEGIN ...
DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees;
CURSOR dept_cursor IS SELECT * FROM departments WHERE department_id = 10;BEGIN ...
1-45 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Apertura del cursorApertura del cursor
Sintaxis:Sintaxis:Sintaxis:Sintaxis:
OPEN cursor_name;OPEN cursor_name;
1-46 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Recuperación de Datos del Cursor
Recuperación de Datos del Cursor
SintaxisSintaxis
•Recupera las filas del juego de Recupera las filas del juego de resultados, una a unaresultados, una a una
• Después de cada recuperación, el cursor Después de cada recuperación, el cursor avanza a la siguiente filaavanza a la siguiente fila
SintaxisSintaxis
•Recupera las filas del juego de Recupera las filas del juego de resultados, una a unaresultados, una a una
• Después de cada recuperación, el cursor Después de cada recuperación, el cursor avanza a la siguiente filaavanza a la siguiente fila
FETCH cursor_name INTO [variable1, variable2, …];FETCH cursor_name INTO [variable1, variable2, …];
1-47 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Recuperación de Datos del Cursor
Recuperación de Datos del Cursor
Ejemplos Ejemplos Ejemplos Ejemplos
...OPEN defined_cursor;LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN ...; ... -- Process the retrieved data …END LOOP;END;
...OPEN defined_cursor;LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN ...; ... -- Process the retrieved data …END LOOP;END;
FETCH emp_cursor INTO v_empno, v_ename;FETCH emp_cursor INTO v_empno, v_ename;
1-48 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Cierre del cursorCierre del cursor
SintaxisSintaxis
Cerrar el cursor una vez completado el Cerrar el cursor una vez completado el procesamiento de las filasprocesamiento de las filas
Se puede volver a abrir el cursor si es Se puede volver a abrir el cursor si es necesarionecesario
SintaxisSintaxis
Cerrar el cursor una vez completado el Cerrar el cursor una vez completado el procesamiento de las filasprocesamiento de las filas
Se puede volver a abrir el cursor si es Se puede volver a abrir el cursor si es necesarionecesario
CLOSE cursor_name;CLOSE cursor_name;
1-49 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
SintaxisSintaxis
• Facilita el procesamiento de cursores Facilita el procesamiento de cursores explícitosexplícitos
• Apertura, recuperación y cierre implícitosApertura, recuperación y cierre implícitos
• No declarar la variable registro, se declara No declarar la variable registro, se declara implícitamenteimplícitamente
SintaxisSintaxis
• Facilita el procesamiento de cursores Facilita el procesamiento de cursores explícitosexplícitos
• Apertura, recuperación y cierre implícitosApertura, recuperación y cierre implícitos
• No declarar la variable registro, se declara No declarar la variable registro, se declara implícitamenteimplícitamente
Bucles FOR de cursorBucles FOR de cursor
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;
FOR record_name IN cursor_name LOOP
statement1;
statement2;
. . .
END LOOP;
1-50 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.
Bucles FOR de CursorBucles FOR de Cursor
ejemplo:ejemplo:ejemplo:ejemplo:
DECLARE CURSOR emp_cursor IS SELECT last_name, department_id FROM employees;BEGIN FOR emp_i IN emp_cursor LOOP -- implicit open and implicit fetch occur IF emp_i.department_id = 80 THEN ... END LOOP; -- implicit close occursEND;/
DECLARE CURSOR emp_cursor IS SELECT last_name, department_id FROM employees;BEGIN FOR emp_i IN emp_cursor LOOP -- implicit open and implicit fetch occur IF emp_i.department_id = 80 THEN ... END LOOP; -- implicit close occursEND;/