Beruflich Dokumente
Kultur Dokumente
CAPITULO VI
• Variables y tipos
• Estructuras de control como: if – then – else, ciclos
• Procedimientos y funciones.
Arquitectura de ORACLE
ORACLE Tools
SQL
ORACLE 7
O/S
Data
6. 3
Herramientas de ORACLE
Motor PL/SQL
Motor PL/SQL
6. 6
Servidor
ORACLE
con PL/SQL
Bloque PL/SQL
SQL
IF ... THEN
SQL
ELSE
SQL
END_IF
APLICACIÓN
Servidor ORACLE con motor PL/SQL incluído.
6. 7
SQL* Forms
Motor PL/SQL
TRIGGER Bloque PL/SQL E
J S
Bloque PL/SQL DECLARE E E
P
Procedural C R
N
DECLARE Procedural U O
T
Procedural T C
E
Procedural BEGIN O E
N
Procedural R D
C
BEGIN SQL U
I
Procedural Procedural D R
A
SQL SQL E A
S
Procedural L
SQL END; E
S
END;
DECLARE
v_StudentRecord studens%ROWTYPE;
v_Counter BINARY_INTEGER;
BEGIN
v_Counter := 7;
SELECT *
INTO v_StudentRecord
FROM students
WHERE id = 10001;
END;
UPDATE classes
SET max_studetns = 70
WHERE department = ‘HIS’
AND course = 101;
Aplicación Cliente
Máquina PL/SQL
Ejecutor de sentencias
procedurales
Ejecutor de
sentencias SQL
DECLARE
v_StudentRecord studens%ROWTYPE;
v_Counter BINARY_INTEGER;
BEGIN
v_Counter := 7;
SELECT *
INTO v_StudentRecord
FROM students
WHERE id = 10001;
END;
UPDATE classes
SET max_studetns = 70
WHERE department = ‘HIS’
AND course = 101;
Máquina PL/SQL
Ejecutor de sentencias
procedurales
Aplicación Cliente
Máquina PL/SQL
Ejecutor de sentencias
procedurales
Ejecutor de
sentencias SQL
Connected to:
Personal ORACLE7 Release 7.1.4.1.0 – Production Release
PL/SQL Release 2.1.4.0.0-Production
• Bloques anónimos
• Subprogramas
• Triggers
6. 12
DECLARE
BEGIN
EXCEPTION
END;
• Sección de declaración
• Sección ejecutable
DECLARE
BEGIN
NATURAL
LONG
NUMBER VARCHAR
FLOAT O
VARCHAR2
DECIMAL
BOOLEAN
REAL
DATE
INTEGER
RAW
SMALLINT
LONG RAW
Sintaxis:
Ejemplos:
DECLARE
firstname CHAR(20); ---- legal
lastname CHAR(20); ---- legal
• NUMBER/BINARY_INTEGER
cnt BINARY_INTEGER;
renueve NUMBER(9,2);
seconds_per_day CONSTANT NUMBER := 60*60*24;
running_total BINARY_INTEGER := 0;
• CHAR/VARCHAR2
mid_initial CHAR;
last_name VARCHAR2 (10) NOT NULL := ‘PEEBLES’;
company_name CONSTANT VARCHAR2(12) := ‘ORACLE’;
6. 18
• DATE
• BOOLEAN
1. TABLE
Sintaxis:
Ejemplo:
DECLARE
TYPE ename_tab_type IS TABLE OF VARCHAR2 (10)
INDEX BY BINARY_INTEGER;
ename_tab ename_tab_type;
Nota:
• ename_tab representa una tabla
• Referencias se hacen mediante: ename_tab(i)
2. RECORD
Sintaxis:
Ejemplo:
DECLARE
TYPE dept_rec_type IS RECORD OF
(deptno NUMBER(2) NOT NULL,
dname dept.dname%TYPE,
loc dept.loc%TYPE);
dept_rec dept_rec_type;
DECLARE
books_printed NUMBER(6);
books_sold books.printed%TYPE;
maiden_name emp.ename%TYPE;
DECLARE
dept_row dept%ROWTYPE;
6. 21
Sintaxis:
a) Asignación escalar
variable_plsql := expresión_plsql;
b) Asignación de tablas
c) Asignación de registros
nombre_registro.nombre_campo := expresión_plsql;
6. 22
Ejemplo:
DECLARE
TYPE dept_rec_type IS RECORD
(deptno NUMBER(2) NOT NULL,
dname dept.dname%TYPE);
TYPE ename_tab_type IS TABLE OF CHAR(10)
INDEX BY BINARY_INTEGER;
dept_rec1 dept_rec_type;
dept_rec2 dept_rec_type;
ename_tab ename_tab_type;
cnt BINARY_INTEGER;
over_budget BOOLEAN;
last_name VARCHAR2(10);
BEGIN
cnt := cnt + 1;
over_budget := TRUE;
last_name := ‘JONES’;
ename_tab(3) := last_name;
dept_rec1 := dept_rec2;
END;
DECLARE
credit_limit CONSTANT NUMBER (6,2) := 2000;
account NUMBER;
BEGIN
SUB-BLOQUE 1
DECLARE
account CHAR(10);
new_balance NUMBER(9,2);
BEGIN
SUB-BLOQUE 2
DECLARE
old_balance NUMBER(9,2);
BEGIN
END;
account credit_limt
6. 24
BEGIN
EXCEPTION
END;
6. 25
BEGIN
INSERT INTO emp (empno, ename, job, hiredate, sal, deptno)
VALUES (2741, my_ename, ‘CHAUFFEUR’, my_hiredate, my_sal, 20);
END;
6. 26
B. UPDATE
DECLARE
max_allowed CONSTANT NUMBER := 5000;
good_cust CHAR(8) := ‘VIP’;
BEGIN
UPDATE accounts SET credit_limit = max_allowed
WHERE status = ‘EMPLOYEE’ or status = good_cust;
END;
C. DELETE
DECLARE
year_var NUMBER := 1800;
BEGIN
DELETE FROM invention
WHERE year < year_var;
END;
6. 27
D. SELECT INTO
EMP
EMPNO ENAME SAL
SELECT
APLICACIÓN INTO 7844 TURNER 1500
VAR2
VAR3
Sintaxis SELECT:
Ejemplo SELECT:
DECLARE
part_name parts.name%TYPE;
num_in_stock parts.num%TYPE;
BEGIN
SELECT name, num INTO part_name, num_in_stock
FROM parts WHERE part_id = 624;
END;
6. 28
BEGIN
EXCEPTION
END;
Sección ejecutable
6. 30
Comparaciones lógicas:
Comparaciones nulas:
Ejemplos:
TRUE TRUE T T T
T F N
T F N
FALSE F F F FALSE
T N N
NULL NULL
N F N
NOT
TRUE F
T
FALSE
N
NULL
B. Sentencia IF-THEN-ELSE
Sintaxis:
IF <condición> THEN
<secuencia de sentencias>
[ELSIF <condición> THEN
<secuencia de sentencias>]
-- ELSEIF`s pueden ser repetidos
[ELSE
<secuencia de sentencias> ]
END IF;
6. 32
DECLARE
num_jobs NUMBER(7);
BEGIN
SELECT COUNT(*) INTO num_jobs FROM auditions
WHERE actorid = &&actor_id AND called_back = ‘YES’;
COMMIT;
END;
6. 33
C. Sentencias de ciclo
4 Tipos de Loops:
• Ciclo simple
• Ciclo FOR numérico
• Ciclo WHILE
• Ciclo FOR de cursores
1. Ciclo simple
LOOP
<secuencia de sentencias>
END LOOP; -- a veces llamado ciclo infinito
Sintaxis de Exit:
Ejemplos:
DECLARE
ctr NUMBER(3) := 0;
BEGIN
LOOP
INSERT INTO LOG VALUES
(ctr, ‘ITERACION COMPLETA’);
ctr : = ctr + 1;
IF ctr = 500 THEN
EXIT;
END IF;
END LOOP;
END;
DECLARE
ctr NUMBER(3) := 0;
BEGIN
LOOP
UPDATE TABLE1 SET comment = ‘ACTUALIZADO’
WHERE count_col = ctr;
ctr : = ctr + 1;
EXIT WHEN ctr = 100;
END LOOP;
END;
6. 35
Ejemplos:
BEGIN
FOR i IN 1..500 LOOP
INSERT INTO temp (col1, message)
VALUES (i, ‘No me dormiré en clases’);
END LOOP;
END;
DECLARE
my_index CHAR(20) := ‘Fetuccini Alfredo’;
BEGIN
FOR my_index IN REVERSE 21..30 LOOP
/* redeclaración de my_index*/
INSERT INTO temp (col1)
VALUES (my_index);
/*Inserta los números 30 a 21*/
END LOOP;
END;
6. 36
...
FOR i IN 1..256 LOOP
x := x + i; --legal
i := i + 5; -- ilegal
END LOOP;
...
3. Ciclo WHILE
Sintaxis:
Ejemplo:
DECLARE
ctr NUMBER(3) := 0;
BEGIN
WHILE ctr < 500 LOOP
INSERT INTO temp (col1, message)
VALUES (ctr, ‘Bien, podría dormir sólo un poquito’);
ctr := ctr + 1;
END LOOP;
END;
4. Sentencia GO TO
Sintaxis:
Legal Ilegal
<<dinner>> GO TO your_brothers;
x := x + 1; IF a > b THEN
y := y + x; b := b – c;
IF a > b THEN <<your_brothers>>
b := b + c; x := x + 1;
GO TO dinner; END IF;
END IF;
Ejemplo:
<<outer_block>>
DECLARE
n NUMBER;
BEGIN
n := 5;
/* Comienzo de un sub bloque */
DECLARE
x NUMBER := 10;
n CHAR(10) := ‘Quince’;
BEGIN
INSERT INTO temp (col1, col2, message)
VALUES (outer_block.n, x, n);
COMMIT;
END; /*fin del sub bloque */
END outer_block
Ejemplo:
<<sample>>
DECLARE
deptno NUMBER := 20;
BEGIN
UPDATE emp SET sal = sal * 1.1;
WHERE deptno = sample.deptno;
COMMIT;
END sample;
6. 40
Ejemplo:
<<compute_loop>>
FOR i IN 1..10 LOOP
<sentencias>
DECLARE
i NUMBER := 0;
BEGIN
INSERT INTO temp (col1, col2, message)
VALUES (i, compute_loop.i, ‘COMPLETE’);
END;
END LOOP compute_loop; -- debe incluir el nombre del loop aquí
Ejemplo:
...
<<loop_externo>> WHILE a > b LOOP
b := b + 1;
<<loop_interno>> WHILE b > c LOOP
c := c + 2;
EXIT loop_externo WHEN c > 200;
END LOOP loop_interno;
END LOOP loop_externo;
...
6. 41
6.11 Cursores
A. Conceptos
DECLARE
BEGIN
• INSERT
• UPDATE
• DELETE
• SELECT INTO
• COMMIT
• ROLLBACK
B. Tipos de cursor
Tipo Descripción
Explícito Sentencias SELECT con
múltiples filas en el resultado.
Implícito Todas las sentencias INSERT
Todas las sentencias UPDATE
Todas las sentencias DELETE
Sentencias SELECT .. INTO
6. 43
.
. Obtiene una fila
.
Cursor
Cursor
DECLARE
x NUMBER(7,2);
total NUMBER(5);
limite_inferior_salario CONSTANT NUMBER(4) := 1200;
CURSOR c1 IS SELECT ename FROM emp
WHERE sal > limite_inferior_salario;
BEGIN. . .
OPEN <nombre_cursor>;
CLOSE <nombre_cursor>
Ejemplo %NOTFOUND:
LOOP
FETCH my_cursor INTO my_ename, my_sal;
EXIT WHEN my_cursor%NOTFOUND;
-- procesamiento de datos aquí
END LOOP;
Ejemplo %FOUND:
Ejemplo %ROWCOUNT:
LOOP
FETCH my_cursor INTO my_ename, my_sal;
EXIT WHEN (my_cursor%NOTFOUND)
OR (my_cursor%ROWCOUNT > 10);
-- procesamiento de datos aquí
END LOOP;
Ejemplo %ISOPEN:
IF my_cursor%ISOPEN THEN
FETCH my_cursor INTO my_ename, my_sal;
ELSE
OPEN my_cursor;
END IF;
6. 48
Ejemplo:
DECLARE
sal_limit NUMBER(4) := 0
my_ename emp.ename%TYPE;
my_sal emp.sal%TYPE;
CURSOR my_cursor IS SELECT ename, sal FROM emp
WHERE sal > sal_limit;
BEGIN
sal_limit := 1200;
OPEN my_cursor; -- use 1200 como sal_limit
LOOP
FETCH my_cursor INTO my_ename, my_sal;
EXIT WHEN my_cursor%NOTFOUND; -- nada retornado
INSERT INTO new_table VALUES (my_ename, my_sal);
END LOOP;
CLOSE my_cursor;
COMMIT;
END;
6. 49
Ejemplo:
DECLARE
CURSOR my_cur IS SELECT ename, sal FROM emp
FOR UPDATE of sal;
emp_name emp.ename%TYPE;
salary emp.sal%TYPE;
BEGIN
OPEN my_cur;
LOOP
FETCH my_cur INTO emp_name, salary;
EXIT WHEN my_cur%NOTFOUND;
IF salary > 3000 THEN
DELETE FROM emp WHERE CURRENT OF my_cur;
END IF;
...
END LOOP;
6. 51
DECLARE
TYPE ename_tab_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY INTEGER;
TYPE sal_tab_type IS TABLE OF emp.sal%TYPE
INDEX BY BINARY INTEGER;
ename_tab ename_tab_type;
sal_tab sal_tab_type;
i BINARY_INTEGER := 0;
CURSOR empcur IS SELECT ename, sal FROM emp;
BEGIN
-- cargar nombres de empleados y salarios dentro
-- de las tablas PL/SQL.
FOR emprec IN empcur LOOP
i := i + 1;
ename_tab(i) := emprec.ename;
sal_tab(i) := emprec.sal;
END LOOP;
-- procesos de tablas PL/SQL
...
END;
6. 54
Ejemplo:
DECLARE
CURSOR emp_cur (sal_value NUMBER) IS
SELECT ename FROM emp WHERE sal > sal_value;
BEGIN
OPEN emp_cur (1200);
...
END;
Es equivalente a:
DECLARE
sal_value NUMBER;
CURSOR emp_cur IS
SELECT ename FROM emp WHERE sal > sal_value;
BEGIN
sal_value := 1200;
OPEN emp_cur;
...
END;
6. 55
Sección de excepciones
BEGIN
EXCEPTION
END;
6. 57
Ejemplo:
DECLARE
employee_num emp.empno%TYPE;
BEGIN
SELECT empno INTO employee_num FROM emp
WHERE ename = ‘BLAKE’;
INSERT INTO temp (col1, message)
VALUES (employee_num, ‘Blake’’s employee number.’);
DELETE FROM emp WHERE ename = ‘BLAKE’;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
INSERT INTO temp (message)
VALUES (‘BLAKE no encontrado’);
COMMIT;
WHEN TOO_MANY_ROWS THEN
ROLLBACK;
INSERT INTO temp (message)
VALUES (‘Más de un BLAKE encontrado’);
COMMIT;
WHEN OTHERS THEN
ROLLBACK;
END;
6. 59
DECLARE
x NUMBER;
my_exception EXCEPTION; -- un nuevo tipo de objeto
...
RAISE my_exception;
Debe considerarse:
• Una vez que la excepción es levantada manualmente,
se trata exactamente como si fuese una excepción
interna predefinida.
• El alcance de la declaración de excepciones es igual
que con las variables.
• Una excepción predefinida por el usuario es chequeada
manualmente y levantada si es apropiado.
6. 60
Ejemplo:
DECLARE
my_ename emp.ename%TYPE := ‘BLAKE’;
assigned_projects NUMBER;
too_few_projects EXCEPTION;
BEGIN
-- obtiene los números de proyectos asignados a BLAKE
...
IF assigned_projects < 3 THEN
RAISE too_few_projects;
END IF;
C. Propagación de Excepciones
Pasos en la propagación:
Ejemplo:
BEGIN
...
BEGIN
IF X = 1 THEN
RAISE A;
ELSEIF X = 2 THEN
RAISE B;
ELSE
RAISE C;
EXCEPTION
WHEN A THEN Exception A es
... manejada localmente y
la ejecución se reasume
END; en el bloque externo
_________
_________
_________
EXCEPTION
WHEN B THEN
...
END;
6. 63
Ejemplo:
BEGIN
...
BEGIN
IF X = 1 THEN
RAISE A;
ELSIF X = 2 THEN
RAISE B;
ELSE
RAISE C;
EXCEPTION
WHEN A THEN
Excepción B se propaga
...
al primer bloque externo
END;
con un manejador
apropiado
EXCEPTION
WHEN B THEN
... Excepción B es manejada
y el control es pasado de
END; vuelta al ambiente.
6. 64
Ejemplo:
BEGIN
...
BEGIN
IF X = 1 THEN
RAISE A;
ELSEIF X = 2 THEN
RAISE B;
ELSE
RAISE C;
EXCEPTION
WHEN A THEN
... La excepción C no tiene
manejador y resultará en
END;
una excepción no manejada
WHEN B THEN
...
END;
6. 65
Sintaxis:
RAISE;
Ejemplos:
TOO_MANY_ROWS (ORA-01427)
--- un SELECT de única fila, retornó más de una fila
NO_DATA_FOUND (ORA-01403)
--- un SELECT de única fila, no retornó datos
INVALID_CURSOR (ORA-01001)
--- Ocurrió una operación ilegal con el cursor
VALUE_ERROR (ORA-06502)
--- Ocurrió un error aritmético, de conversión, truncamiento o de restricción.
INVALID_NUMBER (ORA-01722)
--- Falló la conversión de un string de caracteres a un número en una sentencia SQL.
ZERO_DIVIDE (ORA-01476)
--- Intento de dividir por cero
DUP_VAL_ON_INDEX (ORA-00001)
--- Intento de insertar un valor duplicado dentro de una columna, la que tiene un
índice asociado que permite valores únicos en la columna.
CURSOR_ALREADY_OPEN (ORA-06511)
--- Intento de abrir un cursor ya abierto
6. 67
E. Pragma EXCEPTION_INIT
Las excepciones sólo pueden ser manejadas por el nombre y
no a través del número de error ORACLE.
Sintaxis:
Ejemplo:
DECLARE
dead_lock_detected EXCEPTION;
PRAGMA EXCEPTION_INIT (dead_lock_detected, -60);
6. 68
Ejemplo:
Se levantará la excepción definida por un usuario
e_MissingNull si se encuentra el error “ORA-1400: columna
obligatoria NOT NULL falta o es NULL durante la
inserción” en tiempo de ejecución.
DECLARE
e_MissingNull EXCEPTION;
PRAGMA EXCEPTION_INIT (e_MissingNull, -1400);
BEGIN
INSERT INTO students (id) VALUES (NULL);
EXCEPTION
WHEN e_MissingNull then
INSERT INTO log_table (info) VALUES (‘ORA-1400 ocurre’);
END;
F. Función RAISE_APLICATION_ERROR
RAISE_APPLICATION_ERROR(número de error,
mensaje de error, [guarda errores]);
Donde:
Ejemplo:
El siguiente procedimiento chequea si existe suficiente
espacio en una sala de clase antes de incorporar a un nuevo
estudiante.
6. 70
EXCEPTION
WHEN NO_DATA_FOUND THEN
/* La información de la clase pasada a este procedimiento no existe. Levantar un
error para que el programa que llamó conozca esto */
RAISE_APPLICATION_ERROR(-20001, p_Department | | ‘ ‘ | |
p_Course | | ‘no existe!’);
END Register;
SQLCODE:
• Retorna el número de error ORACLE de la excepción,
o 1 si fue una excepción definida por el usuario.
SQLERRM:
• Retorna el mensaje de error ORACLE asociado con el
valor actual de SQLCODE.
• También puede usar cualquier número de error
ORACLE, como un argumento.
Ejemplo:
DECLARE
sqlcode_val NUMBER;
sqlerrm_val CHAR(55);
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
sqlcode_val := SQLCODE;
-- No se puede insertar directamente SQLCODE.
6.13.1 Conceptos
Los subprogramas:
• Proveen extensibilidad
• Proveen modularidad
• Promueven la reusabilidad
• Promueven la mantenibilidad
• Ayudan a la abstracción
6. 75
DECLARE
...
PROCEDURE . . . IS
BEGIN
[EXCEPTION]
END;
...
BEGIN
...
Procedure_name . . . ;
...
6.13.2 Procedimientos
PROCEDURE ... IS
BEGIN
[EXCEPTION]
END;
6. 77
calc_bonus(employee_num, bonus_amt);
PROCEDURE create_dept
(new_dname CHAR DEFAULT ‘TEMP’,
new_loc CHAR DEFAULT ‘TEMP’) IS
BEGIN
INSERT INTO dept
VALUES (deptno_seq.NEXTVAL, new_dname, new_loc);
END create_dept;
BEGIN
...
create_dept;
create_dept(‘MARKETING’);
create_dept(‘MARKETING’, ‘NEW YORK’);
...
END;
6. 84
Sobrecarga (OVERLOADING)
PL/SQL permite la sobrecarga de los nombres de los subprogramas.
Ejemplo:
DECLARE
TYPE DateTabTyp IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
TYPE RealTabTyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
hiredate_tab DateTabTyp;
comm_tab RealTabTyp;
indx BINARY_INTEGER;
...
BEGIN
indx := 50;
initialize(hiredate_tab, indx); -- llama a la primera versión
initialize(comm_tab, indx); -- llama a la segunda versión
END;
6. 86
6.13.3 Funciones
Una función PL/SQL es un bloque con nombre, que se puede
llamar para que ejecute una acción especifica y retorne un
valor.
BEGIN
[EXCEPTION]
END;
6. 87
Debe considerarse:
• Las funciones son específicas de ORACLE7 y ORACLE 8.
• En la versión 1.0 de PL/SQL, una función sólo puede tomar
parámetros IN.
• Una función debe ser llamada como parte de una expresión.
• Los llamados a funciones definidas por el usuario, pueden
aparecer en sentencias procedurales, pero no en sentencias SQL.
6. 88
Ejemplo:
FUNCTION odd (n NATURAL) RETURN BOOLEAN;
--declaración está más adelante
SQL
Servidor Cliente
Lógica de Interfaz
Relational Aplicación
BD DBMS Usuario
Data
Calls
Servidor Cliente
RDBMS
Presentación Interfaz
Lógica de
BD Aplicación Usuario
Data
Servidor Cliente
D Servicio L Form
BD
B O
SQL M RPC G
Servicio Form
S I
C
Servicio A Form
6.14.4 Funciones
Sintaxis:
OR REPLACE schema.
( argument datatype )
IN
OUT
IN OUT
AS
6. 94
Ejemplo:
CREATE FUNCTION get_bal(acc_no IN NUMBER)
RETURN NUMBER
IS
acc_bal NUMBER(11,2);
BEGIN
SELECT balance
INTO acc_bal
FROM accounts
WHERE account_id = acc_no;
RETURN(acc_bal);
END;
6.14.5 Procedimientos
Sintaxis:
Comando CREATE PROCEDURE ::=
OR REPLACE schema.
( argument datatype )
IN
OUT
IN OUT
IS cuerpo_subprograma_PL/SQL
AS
6. 95
Ejemplo:
CREATE PROCEDURE sam.credit (acc_no IN NUMBER,
amount IN NUMBER)
AS BEGIN
UPDATE accounts
SET balance = balance + amount
WHERE account_id = acc_no;
END;
• user_objects
• user_source
• user_errors
:= 7
Dependencias de RecordFullClases
La función AlmostFull
depende directamente
de classes.
AlmostFull
classes
El procedimiento
RecordFullClasses
depende directamente de
temp_table y AlmostFull e
indirectamente de classes.
temp_table RecordFullClasses
6. 100
6.14.9 Paquetes
PACKAGE <nombre_paquete> IS
/*
** ESPECIFICACION DEL PAQUETE
** Declaraciones públicas de tipos de datos, variables,
constantes, excepciones y cursores.
** Especificaciones públicas de procedimientos y funciones
(declaraciones “forward”)
*/
END [nombre_paquete];
donde:
nombre_paquete, es un nombre único dentro del
alcance de un esquema de base de datos
6. 102
Sintaxis:
OR REPLACE schema.
IS pl/sql_package_spec
AS
Ejemplo:
CREATE PACKAGE emp_mgmt AS
FUNCTION hire (ename VARCHAR2, job VARCHAR2,
mgr NUMBER, sal NUMBER, comm NUMBER,
deptno NUMBER)
RETURN NUMBER;
Sintaxis:
OR REPLACE schema.
IS pl/sql_package_body
AS
6. 105
Ejemplo:
CREATE PACKAGE BODY emp_mgmt AS
tot_emps NUMBER;
tot_depts NUMBER;
Ejemplo:
Trigger REORDER
Sentencia de triggering
AFTER UPDATE OF parts_on_hand ON inventory
SINTAXIS:
donde:
nombre_trigger: es el nombre del trigger; debe ser
único dentro del esquema de la base de datos.
nombre_tabla: es el nombre de la tabla a la cual se
asocia el trigger.
Opción WHEN
• Opcionalmente, una condición booleana puede ser
especificada para un trigger de fila.
• Si se especifica, la condición WHEN es evaluada para cada
fila afectada por la operación de la tabla.
• Si la condición del WHEN se evalúa a TRUE para una fila
afectada por la operación sobre la tabla, el trigger es
disparado para esa fila.
6. 116
Opciones condicionales
Debido a que un trigger de base de datos puede ser creado
para múltiples operaciones de una tabla (por ejemplo,
“INSERT OR DELETE OR UPDATE OF...”), las opciones
condicionales o predicados pueden ser usados en el cuerpo
del trigger para distinguir entre que operación ha causado el
disparo del trigger.
Por ejemplo:
INSERT OR UPDATE ON item . . .
6. 117
Ejemplo:
CREATE TRIGGER . . .
. . .UPDATE OF item_cost, item_name ON item. . .
BEGIN
IF UPDATING (‘ITEM_COST’) THEN
...
END IF;
END;
6. 118
:old y :new
Sentencias :old :new
del Trigger
INSERT Indefinido. Todos los campos Valores que serán insertados
son nulos. cuando la sentencia está
completa.
UPDATE Valores originales para la fila Nuevos valores que serán
antes de la actualización. actualizado cuando la
sentencia está completa.
DELETE Valores originales antes de Indefinido. Todos los
que la fila sea eliminada. campos son nulos.
6. 119
Ejemplo:
SQL> SELECT trigger_type, table_name, triggering_event
2 FROM user_triggers
3 WHERE trigger_name = ‘UPDATEMAJORSTATS’;
G. Ejemplo
Este ejemplo crea un trigger de fila BEFORE, llamado
SALARY_CHECK en el esquema SCOTT. Cuando se
agregue un nuevo empleado a la tabla employee o a un
empleado existente se le cambie el salario o el trabajo, este
trigger garantiza que el salario del empleado cae dentro del
rango de salario establecido para los empleados de ese
trabajo.
6. 121
SABD
B.D.
6. 123
SQL> RUN
O
SQL> /
6. 125
C. Creación de un script
Ejemplo:
CLEAR BREAKS;
CLEAR COLUMNS;
COLUMN ENAME HEADING NAME;
TTITLE ‘CLERICAL STAFF’;
DECLARE
avg_sal NUMBER(7,2);
BEGIN
SELECT AVG(sal) INTO avg_sal FROM emp;
IF avg_sal < 1500 THEN
UPDATE emp SET sal = sal * 1.05 WHERE job = ‘CLERK’;
END IF;
END;
/
SELECT ENAME, SAL FROM EMP WHERE JOB = ‘CLERK’;
6.18.1 Introducción
BEGIN
CREATE TABLE temp_table (
num_value NUMBER,
char_value CHAR (10));
Ahora con la
versión nueva de
PL/SQL
table_name VARCHAR2,
deptnumber NUMBER,
deptname VARCHAR2,
location VARCHAR2) IS
stmt_str VARCHAR2(200);
BEGIN
DECLARE
sql_stmt VARCHAR2(200);
plsql_block VARCHAR2(500);
emp_id NUMBER(4) := 7566;
salary NUMBER(7,2);
dept_id NUMBER(2) := 50;
dept_name VARCHAR2(14) := ’PERSONNEL’;
location VARCHAR2(13) := ’DALLAS’;
emp_rec emp%ROWTYPE;
BEGIN
EXECUTE IMMEDIATE ’CREATE TABLE
bonus (id NUMBER, amt NUMBER)’;
DECLARE
BEGIN
END;
6. 135