Vous êtes sur la page 1sur 32

D

Revisin de PL/SQL

Copyright 2004, Oracle. Todos los Derechos Reservados.

Estructura en Bloque para Bloques


PL/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:

identifier [CONSTANT] datatype [NOT NULL]


[:= | DEFAULT expr];

Ejemplos:

Declare
v_hiredate
v_deptno
v_location
c_ comm
v_count
v_valid

DATE;
NUMBER(2) NOT NULL := 10;
VARCHAR2(13) := 'Atlanta';
CONSTANT NUMBER := 1400;
BINARY_INTEGER := 0;
BOOLEAN NOT NULL := TRUE;

Copyright 2004, Oracle. Todos los Derechos Reservados.

Declaracin de Variables con el


Atributo %TYPE
Ejemplos:
...
v_ename
v_balance
v_min_balance
...

employees.last_name%TYPE;
NUMBER(7,2);
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.

dept_record

departments%ROWTYPE;

Declarar una variable para almacenar la misma


informacin sobre un empleado que se almacena
en la tabla EMPLOYEES.

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.
SQL%ROWCOUNT

Nmero de filas afectadas por la sentencia


SQL ms reciente (valor entero)

SQL%FOUND

Atributo booleano que se evala como TRUE


si la sentencia SQL ms reciente afecta a
una o ms filas

SQL%NOTFOUND

Atributo booleano que se evala como TRUE


si la sentencia SQL ms reciente no afecta a
ninguna fila

SQL%ISOPEN

Siempre se evala como FALSE ya que


PL/SQL cierra los cursores implcitos
inmediatamente despus de que se ejecuten

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
v_start := 2 *
ELSIF v_start >=
v_start := 0,5
ELSE
v_start := 0,1
END IF;
. . .

THEN
v_start;
50 THEN
* v_start;
* v_start;

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.

Control de Cursores Explcitos

No
DECLARE

Crear un

OPEN

FETCH

Identificar Cargar la

el juego
rea SQL
con nombre activo

fila actual
en variables

VACO?

Probar

filas
existentes
Volver a
FETCH si se
encuentran
filas

Copyright 2004, Oracle. Todos los Derechos Reservados.

CLOSE

Liberar

el juego
activo

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:

OPEN cursor_name;

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.

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:
CLOSE

cursor_name;

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.

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 cursor


est abierto.

%NOTFOUND

BOOLEAN

Se evala en TRUE si la recuperacin


ms reciente no devuelve una fila.

%FOUND

BOOLEAN

Se evala en TRUE si la recuperacin


ms reciente devuelve una fila; complemento
de %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


Ejemplo:
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;

Copyright 2004, Oracle. Todos los Derechos Reservados.

Deteccin de Errores Predefinidos


del 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 Predefinidos


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

Error No Predefinido
Detectar el error del servidor de Oracle nmero 2292,
que es una violacin de la restriccin de integridad.
DECLARE
e_products_invalid
EXCEPTION;
PRAGMA EXCEPTION_INIT (
e_products_invalid, -2292);
v_message VARCHAR2(50);
BEGIN
3
. . .
EXCEPTION
WHEN e_products_invalid THEN
:g_message := 'Product ID
specified is not valid.';
. . .
END;
Copyright 2004, Oracle. Todos los Derechos Reservados.

1
2

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;

Copyright 2004, Oracle. Todos los Derechos Reservados.

1
2
3

Procedimiento
RAISE_APPLICATION_ERROR
Sintaxis:
raise_application_error (error_number,
message[, {TRUE | FALSE}]);

Permite emitir mensajes de error definidos por el


usuario desde subprogramas almacenados
Se llama slo desde un subprograma almacenado
de ejecucin

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

Copyright 2004, Oracle. Todos los Derechos Reservados.

Vous aimerez peut-être aussi