asjfahfakfsahasfas

32
D Copyright © 2004, Oracle. Todos los Derechos Reservados. Revisión de PL/SQL

description

jdajskja

Transcript of asjfahfakfsahasfas

  • DCopyright 2004, Oracle. Todos los Derechos Reservados.

    Revisin de PL/SQL

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Estructura en Bloque para BloquesPL/SQL Annimos

    DECLARE (opcional) Declarar objetos PL/SQL que se deben utilizar en

    este bloque BEGIN (obligatorio)

    Definir las sentencias ejecutables EXCEPTION (opcional)

    Definir las acciones que tienen lugar si se produce un error o una excepcin

    END; (obligatorio)

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Declaracin de Variables PL/SQL

    Sintaxis: Ejemplos:

    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; v_count BINARY_INTEGER := 0; v_valid BOOLEAN NOT NULL := TRUE;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Declaracin de Variables con el Atributo %TYPE

    Ejemplos: ... v_ename employees.last_name%TYPE; v_balance NUMBER(7,2); v_min_balance v_balance%TYPE := 10; ...

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Creacin de un Registro PL/SQL

    Declarar variables para almacenar el nombre, el trabajo y el salario de un nuevo empleado. Ejemplo: ... TYPE emp_record_type IS RECORD (ename VARCHAR2(25), job VARCHAR2(10), sal NUMBER(8,2)); emp_record emp_record_type; ...

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Atributo %ROWTYPE

    Ejemplos: Declarar una variable para almacenar la misma

    informacin sobre un departamento que se almacena en la tabla DEPARTMENTS.

    Declarar una variable para almacenar la misma informacin sobre un empleado que se almacena en la tabla EMPLOYEES.

    dept_record departments%ROWTYPE;

    emp_record employees%ROWTYPE;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Creacin de una Tabla PL/SQL

    DECLARE TYPE ename_table_type IS TABLE OF employees.last_name%TYPE INDEX BY BINARY_INTEGER; TYPE hiredate_table_type IS TABLE OF DATE INDEX 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.EXISTS(1) THEN INSERT INTO ... ... END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Sentencias SELECT en PL/SQL

    La clusula INTO es obligatoria. Ejemplo: DECLARE v_deptid NUMBER(4); v_loc NUMBER(4); BEGIN SELECT department_id, location_id INTO v_deptno, v_loc FROM departments WHERE department_name = 'Sales'; ... END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Insercin de Datos

    Agregar nueva informacin de empleado a la tabla EMPLOYEES. Ejemplo: DECLARE v_empid employees.employee_id%TYPE; BEGIN SELECT employees_seq.NEXTVAL INTO v_empno FROM dual; INSERT INTO employees(employee_id, last_name, job_id, department_id) VALUES(v_empno, 'HARDING', 'PU_CLERK', 30); END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Actualizacin de Datos

    Aumentar el salario de todos los empleados de la tabla EMPLOYEES que sean oficinistas en el departamento de compras. Ejemplo: DECLARE v_sal_increase employees.salary%TYPE := 2000; BEGIN UPDATE employees SET salary = salary + v_sal_increase WHERE job_id = 'PU_CLERK'; END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Supresin de Datos

    Suprimir filas que pertenecen al departamento 190 de la tabla EMPLOYEES. Ejemplo: DECLARE v_deptid employees.department_id%TYPE := 190; BEGIN DELETE FROM employees WHERE department_id = v_deptid; END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Sentencias COMMIT y ROLLBACK

    Iniciar una transaccin con el primer comando DML despus de una sentencia COMMIT o ROLLBACK.

    Utilizar las sentencias SQL COMMIT y ROLLBACK para terminar una transaccin de forma explcita.

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Atributos de Cursor SQL

    Con los atributos de cursor SQL, puede probar el resultado de las sentencias SQL.

    Nmero de filas afectadas por la sentencia SQL ms reciente (valor entero) Atributo booleano que se evala como TRUE si la sentencia SQL ms reciente afecta a una o ms filas Atributo booleano que se evala como TRUE si la sentencia SQL ms reciente no afecta a ninguna fila Siempre se evala como FALSE ya que PL/SQL cierra los cursores implcitos inmediatamente despus de que se ejecuten

    SQL%ROWCOUNT SQL%FOUND SQL%NOTFOUND SQL%ISOPEN

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Sentencias IF, THEN y ELSIF

    Para un valor concreto introducido, se puede devolver un valor calculado. Ejemplo: . . . IF v_start > 100 THEN v_start := 2 * v_start; ELSIF v_start >= 50 THEN v_start := 0,5 * v_start; ELSE v_start := 0,1 * v_start; END IF; . . .

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Bucle Bsico

    Ejemplo:

    DECLARE v_ordid order_items.order_id%TYPE := 101; v_counter NUMBER(2) := 1; BEGIN LOOP INSERT INTO order_items(order_id,line_item_id) VALUES(v_ordid, v_counter); v_counter := v_counter + 1; EXIT WHEN v_counter > 10; END LOOP; END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Bucle FOR

    Inserte los primeros 10 elementos de nueva lnea para el pedido nmero 101. Ejemplo:

    DECLARE v_ordid order_items.order_id%TYPE := 101; BEGIN FOR i IN 1..10 LOOP INSERT INTO order_items(order_id,line_item_id) VALUES(v_ordid, i); END LOOP; END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Bucle WHILE

    Ejemplo:

    ACCEPT p_price PROMPT 'Enter the price of the item: ' ACCEPT p_itemtot - PROMPT 'Enter the maximum total for purchase of item: ' DECLARE ... v_qty NUMBER(8) := 1; v_running_total NUMBER(7,2) := 0; BEGIN ... WHILE v_running_total < &p_itemtot LOOP ... v_qty := v_qty + 1; v_running_total := v_qty * &p_price; END LOOP; ...

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Volver a FETCH si se encuentran filas

    No

    Control de Cursores Explcitos

    DECLARE

    Crear un rea SQL con nombre

    Identificarel juego activo

    OPEN

    Probar filas existentes

    VACO?

    Liberarel juegoactivo

    CLOSES

    Cargar la fila actualen variables

    FETCH

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Declaracin del Cursor

    Ejemplo: DECLARE CURSOR c1 IS SELECT employee_id, last_name FROM employees; CURSOR c2 IS SELECT * FROM departments WHERE department_id = 10; BEGIN ...

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Apertura del Cursor

    Sintaxis: Abrir el cursor para ejecutar la consulta e

    identificar el juego activo. Si la consulta no devuelve ninguna fila, no se

    emite ninguna excepcin. Utilizar los atributos de cursor para probar el

    resultado despus de una recuperacin.

    OPEN cursor_name;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Recuperacin de Datos del Cursor

    Ejemplos:

    FETCH c1 INTO v_empid, v_ename; ... OPEN defined_cursor; LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN ...; ... -- Process the retrieved data ... END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Cierre del Cursor

    Sintaxis: Cerrar el cursor al terminar el procesamiento de

    las filas. Volver a abrir el cursor si es necesario. No intentar recuperar datos de un cursor despus

    de cerrarlo.

    CLOSE cursor_name;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Atributos de Cursor Explcito

    Obtener informacin sobre el estado de un cursor. Atributo Tipo Descripcin

    %ISOPEN BOOLEAN Se evala en TRUE si el cursorest abierto.

    %NOTFOUND BOOLEAN Se evala en TRUE si la recuperacinms reciente no devuelve una fila.

    %FOUND BOOLEAN Se evala en TRUE si la recuperacinms reciente devuelve una fila; complementode %NOTFOUND

    %ROWCOUNT NUMBER Se evala en el nmero total de filas devueltas hasta el momento.

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Bucles FOR de Cursor

    Recuperar empleados de uno en uno hasta que no quede ninguno. Ejemplo: DECLARE CURSOR c1 IS SELECT employee_id, last_name FROM employees; BEGIN FOR emp_record IN c1 LOOP -- implicit open and implicit fetch occur IF emp_record.employee_id = 134 THEN ... END LOOP; -- implicit close occurs END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Clusula FOR UPDATE

    Recuperar los pedidos de cantidades superiores a $1.000 que se han procesado hoy. Ejemplo: DECLARE CURSOR c1 IS SELECT customer_id, order_id FROM orders WHERE order_date = SYSDATE AND order_total > 1000.00 ORDER BY customer_id FOR UPDATE NOWAIT;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Clusula WHERE CURRENT OF

    DECLARE CURSOR c1 IS SELECT salary FROM employees FOR UPDATE OF salary NOWAIT; BEGIN ... FOR emp_record IN c1 LOOP UPDATE ... WHERE CURRENT OF c1; ... END LOOP; COMMIT; END;

    Ejemplo:

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Deteccin de Errores Predefinidosdel Servidor de Oracle

    Referencia al nombre estndar de la rutina de manejo de excepciones

    Excepciones predefinidas de ejemplo: NO_DATA_FOUND TOO_MANY_ROWS INVALID_CURSOR ZERO_DIVIDE DUP_VAL_ON_INDEX

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Deteccin de Errores Predefinidosdel Servidor de Oracle: Ejemplo

    Sintaxis: BEGIN SELECT ... COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN statement1; statement2; WHEN TOO_MANY_ROWS THEN statement1; WHEN OTHERS THEN statement1; statement2; statement3; END;

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    DECLARE e_products_invalid EXCEPTION; PRAGMA EXCEPTION_INIT (

    e_products_invalid, -2292); v_message VARCHAR2(50); BEGIN . . . EXCEPTION WHEN e_products_invalid THEN :g_message := 'Product ID

    specified is not valid.'; . . . END;

    Error No Predefinido

    Detectar el error del servidor de Oracle nmero 2292, que es una violacin de la restriccin de integridad.

    21

    3

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Excepciones Definidas por el Usuario

    Ejemplo: [DECLARE] e_amount_remaining EXCEPTION; . . . BEGIN . . . RAISE e_amount_remaining; . . . EXCEPTION WHEN e_amount_remaining THEN :g_message := 'There is still an amount

    in stock.'; . . . END;

    1

    2

    3

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Procedimiento RAISE_APPLICATION_ERROR

    Sintaxis: Permite emitir mensajes de error definidos por el

    usuario desde subprogramas almacenados Se llama slo desde un subprograma almacenado

    de ejecucin

    raise_application_error (error_number, message[, {TRUE | FALSE}]);

  • Copyright 2004, Oracle. Todos los Derechos Reservados.

    Procedimiento RAISE_APPLICATION_ERROR

    Se utiliza en dos lugares diferentes: Seccin Executable Seccin Exception

    Devuelve condiciones de error al usuario de forma consistente con respecto a otros errores del servidor de Oracle

    Revisin de PL/SQL Estructura en Bloque para Bloques PL/SQL Annimos Declaracin de Variables PL/SQL Declaracin de Variables con el Atributo %TYPE Creacin de un Registro PL/SQL Atributo %ROWTYPE Creacin de una Tabla PL/SQL Sentencias SELECT en PL/SQL Insercin de Datos Actualizacin de Datos Supresin de Datos Sentencias COMMIT y ROLLBACK Atributos de Cursor SQL Sentencias IF, THEN y ELSIF Bucle Bsico Bucle FOR Bucle WHILE Control de Cursores Explcitos Declaracin del Cursor Apertura del Cursor Recuperacin de Datos del Cursor Cierre del Cursor Atributos de Cursor Explcito Bucles FOR de Cursor Clusula FOR UPDATE Clusula WHERE CURRENT OF Deteccin de Errores Predefinidos del Servidor de Oracle Deteccin de Errores Predefinidos del Servidor de Oracle: Ejemplo Error No Predefinido Excepciones Definidas por el Usuario Procedimiento RAISE_APPLICATION_ERROR Pgina 32