1 Visión General de PL/SQL
1-2 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-3 Estructura de Bloque en Subprogramas PL/SQL CabeceraIS Sección Declarativa BEGIN Sección Ejecutable EXCEPTION Sección de Excepciones END;CabeceraIS Sección Declarativa BEGIN Sección Ejecutable EXCEPTION Sección de Excepciones END;
1-4 Tipos de Bloques Anónimo: [DECLARE] BEGIN sentencias ejecutables; [EXCEPTION]END; Procedimiento: PROCEDURE nombre_procedimiento IS [declaración - opcional] BEGIN sentencias ejecutables; [EXCEPTION]END; Función: FUNCTION nombre_funcion RETURN tipo de dato a devolver IS[declaración - opcional] BEGIN sentencias ejecutables; RETURN value; [EXCEPTION]END; Anónimo: [DECLARE] BEGIN sentencias ejecutables; [EXCEPTION]END; Procedimiento: PROCEDURE nombre_procedimiento IS [declaración - opcional] BEGIN sentencias ejecutables; [EXCEPTION]END; Función: FUNCTION nombre_funcion RETURN tipo de dato a devolver IS[declaración - opcional] BEGIN sentencias ejecutables; RETURN value; [EXCEPTION]END;
1-5 VARIABLES en PL/SQL
1-6 Uso de las variables Las variables se usan para: - Almacenamiento temporal de los datos - Manipulación de valores almacenados, - Reusabilidad (se pueden utilizar repetidas veces dentro de una aplicación) Las variables se usan para: - Almacenamiento temporal de los datos - Manipulación de valores almacenados, - Reusabilidad (se pueden utilizar repetidas veces dentro de una aplicación)
1-7 Gestión de Variables en PL/SQLL Declarar e inicializar las variables dentro de la sección declaradora Declarar e inicializar las variables dentro de la sección declaradora Asignar nuevos valores a las variables dentro de la sección de código Asignar nuevos valores a las variables dentro de la sección de código Pasar valores a los bloques PL/SQL a través de los parámetros Pasar valores a los bloques PL/SQL a través de los parámetros Ver los resultados a través de variables de salida. Ver los resultados a través de variables de salida. Declarar e inicializar las variables dentro de la sección declaradora Declarar e inicializar las variables dentro de la sección declaradora Asignar nuevos valores a las variables dentro de la sección de código Asignar nuevos valores a las variables dentro de la sección de código Pasar valores a los bloques PL/SQL a través de los parámetros Pasar valores a los bloques PL/SQL a través de los parámetros Ver los resultados a través de variables de salida. Ver los resultados a través de variables de salida.
1-8 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_hiredateDATE; v_deptnoNUMBER(2) NOT NULL := 10; v_locationVARCHAR2(13) := 'Atlanta'; c_commCONSTANT NUMBER := 1400; Declare v_hiredateDATE; v_deptnoNUMBER(2) NOT NULL := 10; v_locationVARCHAR2(13) := 'Atlanta'; c_commCONSTANT NUMBER := 1400;
1-9 Recomendaciones Declaración Variables Seguir las convenciones de nombres Seguir las convenciones de nombres Inicializar las ctes. y variables designadas como NOT NULL Inicializar las ctes. y variables designadas como NOT NULL Inicializar usando el parámetro de asignación := o la palabra DEFAULT Inicializar usando el parámetro de asignación := o la palabra DEFAULT Declarar como máximo un identificador por línea Declarar como máximo un identificador por línea Seguir las convenciones de nombres Seguir las convenciones de nombres Inicializar las ctes. y variables designadas como NOT NULL Inicializar las ctes. y variables designadas como NOT NULL Inicializar usando el parámetro de asignación := o la palabra DEFAULT Inicializar usando el parámetro de asignación := o la palabra DEFAULT Declarar como máximo un identificador por línea Declarar como máximo un identificador por línea
1-10 Principales variables escalares VARCHAR2 (maximum_length) NUMBER [(precision, scale)] DATE CHAR [(maximum_length)] LONG LONG RAW BOOLEAN(true,false or NULL) BINARY_INTEGER VARCHAR2 (maximum_length) NUMBER [(precision, scale)] DATE CHAR [(maximum_length)] LONG LONG RAW BOOLEAN(true,false or NULL) BINARY_INTEGER
1-11 Inicialización de variables USO: := Operador de asignación := Operador de asignación DEFAULT DEFAULT NOT NULL NOT NULLUSO: := Operador de asignación := Operador de asignación DEFAULT DEFAULT NOT NULL NOT NULL
1-12 Declaración de variables escalares DECLARE v_jobVARCHAR2(9); v_countBINARY_INTEGER := 0; v_total_salNUMBER(9,2) := 0; v_orderdateDATE := SYSDATE + 7; c_tax_rateCONSTANT NUMBER(3,2) := 8.25; v_validBOOLEAN NOT NULL := TRUE;... DECLARE v_jobVARCHAR2(9); v_countBINARY_INTEGER := 0; v_total_salNUMBER(9,2) := 0; v_orderdateDATE := SYSDATE + 7; c_tax_rateCONSTANT NUMBER(3,2) := 8.25; v_validBOOLEAN NOT NULL := TRUE;... EjemplosEjemplos
1-13 El atributo %TYPE Declarar una variable basada en: Otras variables previamente declaradas La definición de una columna de la bbdd Preceder %TYPE por: La tabla y la columna de la bbdd El nombre de la variable definia con anterioridad Declarar una variable basada en: Otras variables previamente declaradas La definición de una columna de la bbdd Preceder %TYPE por: La tabla y la columna de la bbdd El nombre de la variable definia con anterioridad
1-14 Declaración de variables con el Atributo %TYPE 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-15 Sentencias SQL en PL/SQL PL/SQL soporta: PL/SQL soporta: Sentencias SQL, para extraer información o aplicar cambios a la bbdd PL/SQL no soporta: PL/SQL no soporta: - el lenguaje de definición de datos (DDL), como CREATE TABLE, ALTER TABLE o DROP TABLE - el lenguaje de definición de datos (DDL), como CREATE TABLE, ALTER TABLE o DROP TABLE - Lenguaje de control de datos (DCL), como GRANT y REVOKE - Lenguaje de control de datos (DCL), como GRANT y REVOKE PL/SQL soporta: PL/SQL soporta: Sentencias SQL, para extraer información o aplicar cambios a la bbdd PL/SQL no soporta: PL/SQL no soporta: - el lenguaje de definición de datos (DDL), como CREATE TABLE, ALTER TABLE o DROP TABLE - el lenguaje de definición de datos (DDL), como CREATE TABLE, ALTER TABLE o DROP TABLE - Lenguaje de control de datos (DCL), como GRANT y REVOKE - Lenguaje de control de datos (DCL), como GRANT y REVOKE
1-16 Sentencias SQL en PL/SQL Extraer una fila de datos de la bbdd utilizando el comando SELECT. Sólo puede ser devuelta una fila Extraer una fila de datos de la bbdd utilizando el comando SELECT. Sólo puede ser devuelta una fila Realizar cambios a las filas de una tabla de bbdd, utilizando comandos DML ( INSERT, UPDATE, DELETE) Realizar cambios a las filas de una tabla de bbdd, utilizando comandos DML ( INSERT, UPDATE, DELETE) Extraer una fila de datos de la bbdd utilizando el comando SELECT. Sólo puede ser devuelta una fila Extraer una fila de datos de la bbdd utilizando el comando SELECT. Sólo puede ser devuelta una fila Realizar cambios a las filas de una tabla de bbdd, utilizando comandos DML ( INSERT, UPDATE, DELETE) Realizar cambios a las filas de una tabla de bbdd, utilizando comandos DML ( INSERT, UPDATE, DELETE)
1-17 Sentencias SELECT de PL/SQL Recuperar datos de tablas de una bbdd mediante SELECT, y con la clausula INTO obligatoria Sintaxis: Sintaxis: SELECT select_list INTO {variable_name[, variable_name]... | record_name} FROM table WHERE condition;
1-18 Sentencias SELECT de PL/SQL Ejemplo:Ejemplo: DECLARE v_deptno NUMBER(4); v_location_idNUMBER(4); BEGIN SELECTdepartment_id, location_id INTOv_deptno, v_location_id FROMdepartments WHEREdepartment_name = 'Sales';... END; / DECLARE v_deptno NUMBER(4); v_location_idNUMBER(4); BEGIN SELECTdepartment_id, location_id INTOv_deptno, v_location_id FROMdepartments WHEREdepartment_name = 'Sales';... END; /
1-19 Sentencias SELECT de PL/SQL 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-20 INSERTUPDATEDELETE Manipulación de Datos Utilizando PL/SQL Modificar las tablas de la bbdd utilizando comandos DML INSERT UPDATE DELETE Modificar las tablas de la bbdd utilizando comandos DML INSERT UPDATE DELETE MERGE
1-21 Inserción de Datos Añadir nuevos registros a tabla de bbdd Ejemplo: Ejemplo: BEGIN INSERT INTO employees (employee_id, first_name, last_name, , 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, , hire_date, job_id, salary) VALUES (employees_seq.NEXTVAL, 'Ruth', 'Cores', 'RCORES', sysdate, 'AD_ASST', 4000); END; /
1-22 Actualización de datos Ejemplo:Ejemplo: DECLARE v_sal_increase employees.salary%TYPE := 800; BEGIN UPDATEemployees SETsalary = salary + v_sal_increase WHEREjob_id = 'ST_CLERK'; END; /
1-23 Supresión de datos 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; /
1 Creación de Estructuras de Control
1-25 Control del Flujo de Ejecución PL/SQL Se puede modificar el flujo lógico de sentencias utilizando sentencias IF condicionales y estructuras de control de bucles Se puede modificar el flujo lógico de sentencias utilizando sentencias IF condicionales y estructuras de control de bucles Sentencias IF condicionales: Sentencias IF condicionales: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF Se puede modificar el flujo lógico de sentencias utilizando sentencias IF condicionales y estructuras de control de bucles Se puede modificar el flujo lógico de sentencias utilizando sentencias IF condicionales y estructuras de control de bucles Sentencias IF condicionales: Sentencias IF condicionales: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF
1-26 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 Osborne IF v_last_name = 'OSBORNE' THEN v_mgr := 22; END IF; IF v_last_name = 'OSBORNE' THEN v_mgr := 22; END IF;
1-27 Flujo de ejecución de la Sentencia IF-THEN-ELSE IF condition TRUE THEN actions (including further IFs) THEN actions (including further IFs) FALSE ELSE actions (including further IFs) ELSE actions (including further IFs)
1-28 IF-THEN-ELSIF Statement Execution Flow IF condition TRUE THEN actions FALSE ELSIFconditionELSIFcondition TRUE THEN actions FALSE ELSEactionsELSEactions
1-29 Bucle básico SyntaxSyntax LOOP statement1;... EXIT [WHEN condition]; END LOOP; LOOP statement1;... EXIT [WHEN condition]; END LOOP; conditionis a Boolean variable or expression (TRUE, FALSE, or NULL); conditionis a Boolean variable or expression (TRUE, FALSE, or NULL); -- delimiter -- statements -- EXIT statement -- delimiter
1-30 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ásico EjemploEjemplo
1-31 bucle WHILE Sintáxis Usar el bucle WHILE para repetir sentencias mientras una condición sea TRUE Sintáxis WHILE condition LOOP statement1; statement2;... END LOOP; WHILE condition LOOP statement1; statement2;... END LOOP; Condition is evaluated at the beginning of each iteration.
1-32 bucle WHILE EjemploEjemplo 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-33 Bucle FOR Sintaxis Utilizar un bucle FOR para reducir el num de repeticiones No declarar el contador, se declara implícitamenteSintaxis 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-34 Bucle FOR Insertar las 10 primeras líneas del pedido del num v_ordiditem.ordid%TYPE:=101; BEGIN... FOR i IN LOOP INSERT INTO item(ordid,itemid) VALUES(v_ordid, i); END LOOP; END; /... v_ordiditem.ordid%TYPE:=101; BEGIN... FOR i IN LOOP INSERT INTO item(ordid,itemid) VALUES(v_ordid, i); END LOOP; END; /
1-35 Cursores explícitos
1-36 Acerca de cursores explícitos Declarados y nombrados por el programador Declarados y nombrados por el programador Manipulados por medio de sentencias específicas en las acciones ejecutables del bloque. Manipulados por medio de sentencias específicas en las acciones ejecutables del bloque. Utilizarlos para procesar individualmente las filas devueltas por una sentencia SELECT de varias filas Utilizarlos para procesar individualmente las filas devueltas por una sentencia SELECT de varias filas Declarados y nombrados por el programador Declarados y nombrados por el programador Manipulados por medio de sentencias específicas en las acciones ejecutables del bloque. Manipulados por medio de sentencias específicas en las acciones ejecutables del bloque. Utilizarlos para procesar individualmente las filas devueltas por una sentencia SELECT de varias filas Utilizarlos para procesar individualmente las filas devueltas por una sentencia SELECT de varias filas
1-37 Control de cursores Explícitos Declarar DECLAREDECLARE Abrir el cursor OPENOPEN Recuperar datos del cursor, fila a fila FETCHFETCH Comprueb a si hay registros EMPTY? Devuelve el control a FECH si encuentra registros No Cierra el cursor CLOSECLOSE Yes
1-38 Control de cursores Explícitos Abrir cursor Cursor Puntero Cursor Recuperar fila del cursor Continuar hasta que quede vacío Cursor Puntero Cerrar el cursor
1-39 Declaración del Cursor Sintaxis No incluir la cláusula INTO en la declaración del cursor No 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 consulta Si es necesario procesar filas en una secuencia, utilizar la cláusula ORDER BY en la consultaSintaxis No incluir la cláusula INTO en la declaración del cursor No 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 consulta Si 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-40 Declaración del cursor EjemploEjemplo 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-41 Apertura del cursor Sintaxis:Sintaxis: OPENcursor_name;
1-42 Recuperación de Datos del Cursor Sintaxis Recupera las filas del juego de resultados, una a una Recupera las filas del juego de resultados, una a una Después de cada recuperación, el cursor avanza a la siguiente fila Después de cada recuperación, el cursor avanza a la siguiente filaSintaxis Recupera las filas del juego de resultados, una a una Recupera las filas del juego de resultados, una a una Después de cada recuperación, el cursor avanza a la siguiente fila Después de cada recuperación, el cursor avanza a la siguiente fila FETCH cursor_name INTO[variable1, variable2, …];
1-43 Recuperación de Datos del Cursor EjemplosEjemplos... 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;
1-44 Cierre del cursor Sintaxis Cerrar el cursor una vez completado el procesamiento de las filas Se puede volver a abrir el cursor si es necesario Sintaxis Cerrar el cursor una vez completado el procesamiento de las filas Se puede volver a abrir el cursor si es necesario CLOSEcursor_name;
1-45 Sintaxis Facilita el procesamiento de cursores explícitos Facilita el procesamiento de cursores explícitos Apertura, recuperación y cierre implícitos Apertura, recuperación y cierre implícitos No declarar la variable registro, se declara implícitamente No declarar la variable registro, se declara implícitamenteSintaxis Facilita el procesamiento de cursores explícitos Facilita el procesamiento de cursores explícitos Apertura, recuperación y cierre implícitos Apertura, recuperación y cierre implícitos No declarar la variable registro, se declara implícitamente No declarar la variable registro, se declara implícitamente Bucles 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-46 Bucles FOR de Cursor 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 occurs END; / 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 occurs END; /