Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

50
Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 1 Visión General de PL/SQL

Transcript of Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

Page 1: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.

11

Visión General de PL/SQLVisión General de PL/SQL

Page 2: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visió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

Page 3: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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 )

Page 4: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 5: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 6: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 7: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 8: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

1-8 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.

VARIABLES en PL/SQLVARIABLES en PL/SQL

Page 9: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de 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)

Page 10: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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.

Page 11: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 12: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 13: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 14: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 15: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 16: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 17: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;...

Page 18: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

1-18 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.

Interación con elServidor Oracle 8Interación con elServidor Oracle 8

Page 19: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 20: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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)

Page 21: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 22: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 23: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 24: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 25: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 26: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 27: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 28: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.

11

Creación de Estructuras de Control

Creación de Estructuras de Control

Page 29: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 30: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 31: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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)

Page 32: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 33: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 34: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 35: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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.

Page 36: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 37: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 38: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/

Page 39: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

1-39 Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002.

Cursores explícitosCursores explícitos

Page 40: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 41: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 42: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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

Page 43: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 44: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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 ...

Page 45: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 46: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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, …];

Page 47: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 48: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 49: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;

Page 50: Javier Balbuena / José Manuel Ferrer. Curso 2.001 / 2.002. 1 Visión General de PL/SQL.

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;/