Beruflich Dokumente
Kultur Dokumente
EVALUACIÓN
OBJETIVO:
Otorgar al alumno los conocimientos necesarios para comprender las
funcionalidades y ventajas que ofrece el lenguaje procedural de Oracle
llamado PL/SQL. Bases que permitirán al alumno prepararse para obtener
la certificación Oracle 1z0-147: Oracle 9i. Programación con PL/SQL.
Oracle 9i. Programación
con PL/SQL
1 Tarea ….………............(10 %)
Proyecto ………..……….(55 %)
Octubre de 2010
1 Examen ..….….………...(35 %)
© LANIA
01/10/20
A.C.
2
10
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
EVALUACIÓN
PROYECTO:
• Construir una aplicación web para la compra-venta de modelos clásicos
de transporte a escala.
© LANIA
01/10/20
A.C.
3
10
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
1
01/10/2010
5 6
7 8
2
01/10/2010
PL/SQL Delimitadores
El código en PL/SQL puede contener: delimitadores, Tipo de operador Operadores
identificadores, literales, comentarios Operador de asignación := (dos puntos + igual)
Operadores aritméticos + (suma)
Unidades Descripción - (resta)
Delimitador Símbolo simple o compuesto con un fin específico, * (multiplicación)
representado por operadores aritméticos, lógicos o / (división)
relacionales ** (exponente)
Comentario Existen dos tipos, de línea simple y multilínea. Operadores relacionales o de comparación = (igual a)
<> (distinto de)
Identificador Permite nombrar objetos o unidades de programas: < (menor que)
constantes, cursores, variables, subprogramas, > (mayor que)
excepciones, paquetes. PL/SQL no es CASE- >= (mayor o igual a)
SENSITIVE <= (menor o igual a)
Operadores lógicos AND (y lógico)
Literal Valor de tipo número, carácter, cadena o lógico con un NOT (negacion)
valor explícito OR (o lógico)
Operador de concatenación ||
9 10
Comentarios Identificadores
Un identificador consiste de una letra seguida opcionalmente de:
-- Esto es un comentario de una sola línea A..Z, 0..9, _, #, $
DECLARE
v_lastname VARCHAR2(30); -- válido
/* v_last_name VARCHAR2(30); -- válido, _ permitido
Esto es un comentario de varias líneas v_last$name VARCHAR2(30); -- válido, $ permitido
*/ v_last#name VARCHAR2(30); -- válido, # permitido
-- v_last-name no válido
-- v_last/name no válido
-- v_last name no válido
-- V_LASTNAME no válido, es igual que v_lastname
-- v_LastName no válido, es igual que v_lastname y V_LASTNAME
11 12
3
01/10/2010
2 Sección EJECUTABLE
13
B C 3 14
Sección de
Manejo de [EXCEPCIONES]
-- Sección ejecutable
identif%TYPE
BEGIN
tipo identif%ROWTYPE
pay_per_day := 21/8;
tipo_escalar NUMBER
DBMS_OUTPUT.PUT_LINE('The pay per day is ' || DATE
TO_CHAR(number_of_days_worked)); CHAR TRUE
VARCHAR FALSE
BOOLEAN NULL
-- Sección de manejo de excepciones(OPCIONAL)
EXCEPTION
WHEN ZERO_DIVIDE THEN
pay_per_day := 0; [CONSTANT] indica la definición de una constante cuyo valor es fijo.
[NOT NULL] impide que a una variable se le asigne un valor nulo.
END; [:=valor_inicial] debe ser del mismo tipo del identificador definido.
[DEFAULT] Inicializa el valor de una variable.
15 16
4
01/10/2010
v_nombre tabla_empleados.nombre%TYPE;
v_emp_name employees.last_name%TYPE;
17
v_emp_rec employees%ROWTYPE; 18
5
01/10/2010
IF condition THEN
CASE selector
statements;
WHEN exp1 THEN result1
[ELSIF condition THEN
WHEN exp2 THEN result2
statements;]
…
[ELSE
[ELSE result;]
statements;]
END;
END IF;
v_exp_grade:=
CASE v_grade
IF UPPER (v_last_name) = ‘GIETZ’ THEN WHEN ‘A’ THEN ‘Excellent’
v_mgr:=102; WHEN ‘B’ THEN ‘Very Good’
ELSE WHEN ‘C’ THEN ‘Good’
v_mgr:=1; ELSE ‘No such grade’
END IF; END;
21 22
23 24
6
01/10/2010
25
Cuando se declara un cursor, lo que se obtiene es una variable • Con cada cursor implícito debe existir la palabra clave INTO.
puntero, el cual inicialmente no apunta a nada.
• Las variables que reciben los datos devueltos por el cursor tienen
que contener el mismo tipo de dato que las columnas de la tabla.
Cuando el cursor es abierto, la memoria es asignada y la estructura
del cursor es creada. La variable cursor ahora apunta al cursor. • Los cursores implícitos solo pueden devolver una única fila.
7
01/10/2010
8
01/10/2010
DECLARE
CURSOR cpaises (p_continente VARCHAR2)
IS
SELECT CO_PAIS, DESCRIPCION, CONTINENTE
FROM PAISES
WHERE CONTINENTE = p_continente;
registro cpaises%ROWTYPE;
BEGIN
OPEN cpaises('EUROPA');
FETCH cpaises INTO registro;
CLOSE cpaises;
END;
9
01/10/2010
BEGIN
DBMS_OUTPUT.PUT_LINE (‘Hola’);
END; /
10
01/10/2010
PRÁCTICA!!
Subtemas
Subprogramas
Invocación de
procedimientos/funciones
Definición y creación de
procedimientos almacenados Procedimientos Almacenados
42
41
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
11
01/10/2010
45 46
12
01/10/2010
49 END;
Bloque anónimo 50
13
01/10/2010
El parámetro actual es pasado por El parámetro actual es pasado por El parámetro actual es pasado por
END; referencia (un apuntador al valor) valor (una copia del valor es pasado valor (una copia del valor es pasado
fuera) a menos que sea especificado dentro y fuera) a menos que sea
NOCOPY especificado NOCOPY
53 54
55 56
?
14
01/10/2010
PROCEDURE create_dept (
new_dname VARCHAR2 DEFAULT ’TEMP’,
new_loc VARCHAR2 DEFAULT ’TEMP’) IS
BEGIN
?
INSERT INTO dept
VALUES (deptno_seq.NEXTVAL, new_dname, new_loc);
...
END;
57 58
15
01/10/2010
63 64
16
01/10/2010
Privilegios
• Notación Nominal: Especifica el nombre de cada parámetro con
Para borrar un procedimiento:
su respectivo valor. Una flecha (=>) indica la asociación. El orden
El usuario debe tener el privilegio DROP ANY PROCEDURE,
de los parámetros no es significativo.
ó
Éste debe estar en el esquema del usuario
• Notación Mixta: Especifica primero los parámetros por notación
posicional y después con notación nominal. (A la inversa no es
Un procedimiento que existe dentro de un paquete NO PUEDE ser posible)
borrado.
67 68
17
01/10/2010
69 70
PROCEDURE create_dept (
new_dname VARCHAR2 DEFAULT ’TEMP’, Sólo aplica a
new_loc VARCHAR2 DEFAULT ’TEMP’) IS
BEGIN parámetros con
INSERT INTO dept modo IN, no es
VALUES (deptno_seq.NEXTVAL, new_dname, new_loc); válido para
...
END;
OUT, IN OUT.
create_dept;
create_dept(’MARKETING’);
create_dept(’MARKETING’, ’NEW YORK’);
18
01/10/2010
PL/SQL y Web
73
74
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
19
01/10/2010
Ejemplo Ejemplo
CREATE OR REPLACE PROCEDURE p_displayOrgs IS
BEGIN
CREATE OR REPLACE PROCEDURE html_page IS htp.p('<HTML>');
htp.p('<HEAD>');
BEGIN htp.p('<TITLE>Organization Records</TITLE>');
HTP.HTMLOPEN; -- generates <HTML> htp.p('</HEAD>');
HTP.HEADOPEN; -- generates <HEAD> htp.p('<BODY>');
HTP.TITLE('Title'); -- generates <TITLE>Hello</TITLE> htp.p('<H1>Organization Records</H1>');
HTP.HEADCLOSE; -- generates </HEAD> htp.p('<TABLE BORDER="1 ">');
-- generates <BODY TEXT="#000000" BGCOLOR="#FFFFFF"> htp.p('<TR><TH>Hierarchy</TH><TH>Org Long Name</TH></TR>');
HTP.BODYOPEN( cattributes => 'TEXT="#000000" BGCOLOR="#FFFFFF"'); for idx in (select h.hrc_descr, o.org_long_name from org_tab o,
hrc_tab h where o.hrc_code = h.hrc_code order by
-- generates <H1>Heading in the HTML File</H1> h.hrc_code ) loop htp.p('<TR>');
HTP.HEADER(1, 'Heading in the HTML File'); htp.p('<TD>'||idx.hrc_descr||'</TD>');
HTP.PARA; -- generates <P> htp.p('<TD>'||idx.org_long_name||'</TD>');
HTP.PRINT('Some text in the HTML file.'); htp.p('</TR>');
HTP.BODYCLOSE; -- generates </BODY> end loop;
htp.p('</TABLE>');
HTP.HTMLCLOSE; -- generates </HTML>
htp.p('</BODY>');
END; htp.p('</HTML>');
end; /
77 78
79 80
20
01/10/2010
81 82
Función
Es un subprograma almacenado que calcula un valor y lo
Subtemas devuelve mediante la cláusula RETURN.
84
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
21
01/10/2010
85 86
87 88
22
01/10/2010
Debe ser una función almacenada, no una función definida Incrementa la productividad. Al permitir la realización de tareas
en un bloque o subprograma. no disponibles en SQL.
Una función llamada de un query o DML no puede modificar Incrementa la eficiencia de las consultas.
tablas de la base de datos, ni ejecutar los comandos INSERT,
UPDATE o DELETE.
Manipula cadenas para representar tipos de datos especiales
(por ejemplo, latitud, longitud o temperatura).
Una función llamada de un DML no puede leer o modificar la
tabla a actualizar.
Provee la ejecución de consultas en forma paralela.
89 90
declare
v_ocupa VARCHAR2(15);
begin
v_ocupa := ocupa_clase(„Informática‟, 3);
dbms_output.put_line(v_ocupa);
end;
91 92
23
01/10/2010
END;
93 94
PRÁCTICA!!
Subtemas
Descripción y creación de un paquete
Invocación de constructores dentro de
paquetes
Creación de
Borrado de paquetes
paquetes
Beneficios
Sobrecarga de constructores
Variables, inicialización, estados de
persistencias
Restricciones de los paquetes
Invocar funciones de paquetes en SQL
Uso de tablas y registros en paquetes
Paquetes de Oracle 96
95
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
24
01/10/2010
Paquetes Paquetes
Agrupación lógica de elementos de PL/SQL tales como: tipos,
El cuerpo y especificación de un paquete están almacenados
elementos y subprogramas
por separado en la base de datos.
1. Especificación del Paquete 1
Es la interfaz de la aplicación. Declaración del
Si el cuerpo del paquete cambia, pero la especificación no,
Declara tipos, variables, constantes, Procedimiento A 2 las llamadas a los constructores del paquete son válidas.
excepciones, cursores y
subprogramas Si la especificación del paquete cambia, las llamadas a los
4
constructores del paquete son invalidadas, así como el cuerpo
2. Cuerpo del Paquete Definición del
3 del paquete.
Procedimiento B
Define cursores, subprogramas
implementando así la
especificación Definición del
Procedimiento A 2
1 Variable pública 2 Procedimiento público
5
4 Variable privada 3 Procedimiento privado
97
5 Variable local
98
99 100
25
01/10/2010
END comm_package;
/
103 104
26
01/10/2010
105 106
27
01/10/2010
110
Procedimiento Descripción
Borrado del cuerpo del paquete : PUT Agrega texto del procedimiento a la línea actual de
DROP PACKAGE BODY package_name; la salida del buffer
NEW_LINE Coloca una marca de fin de línea en la salida del
buffer
PUT_LINE Combina la acción PUT y NEW_LINE
GET_LINE Regresa la línea actual de la salida del buffer en el
procedimiento.
GET_LINES Regresa un arreglo de líneas de la salida del
buffer al procedimiento
ENABLE/DISABLE Habilita de deshabilita las llamadas a
109 DBMS_OUTPUT
UTL_FILE PRÁCTICA!!
Procedimiento Descripción
112
111
28
01/10/2010
Trigger
Es un bloque o procedimiento PL/SQL asociado a una Tabla, Vista,
Subtemas
Esquema o Base de datos que se ejecuta implícitamente si ocurre
un evento
Descripción y tipos de Triggers
Creación de un Trigger DML
Creación de un Trigger a nivel renglón
Creación de un Trigger a nivel
instrucción Triggers
OLD y NEW
Store Procedure vs Triggers
Borrado de Triggers
Trigger de base de datos
Creación de un Trigger DDL
Privilegios y vistas asociadas a Triggers
113
114
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
4. Body:
Declare 2. Event: INSERT,
TRIGGER
Begin UPDATE o DELETE
TRIGGER
de base de datos: Se dispara si ocurre un evento: End Tabla: On table, view
115 116
29
01/10/2010
117 118
30
01/10/2010
123 124
31
01/10/2010
125 126
X En lugar de…
INSERT
ON view_name
[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
Trigger_body;
my_view
UPDATE
127 128
32
01/10/2010
131 132
33
01/10/2010
Ejemplo PRÁCTICA!!
CREATE OR REPLACE TRIGGER logon_trig
AFTER LOGON ON SCHEMA
BEGIN
Inserta un registro
INSERT INTO después de que un
log_table(user_id,date,loggin)
usuario se conecta a su
VALUES (USER,SYSDATE,‟ON‟); cuenta
END;
135 136
34
01/10/2010
137
138
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
35
01/10/2010
Dependencia indirecta
Objeto Objeto
Referenciado Dependiente
141 142
143 144
36
01/10/2010
puede ser usado inmediatamente cuando es
referenciado
INVALID El objeto del esquema debe ser compilado
antes que pueda ser usado
Objeto
Referenciado
145
Objeto
Dependiente
146
Columna Descripción
TIMESTAMP NAME Nombre del objeto dependiente
TYPE El tipo del objeto dependiente
(PROCEDURE, FUNCTION, PACKAGE,
Revisar Horario. Cada objeto de Revisar Firma. Cada objeto de PACKAGE BODY, TRIGGER, VIEW)
PL/SQL guarda un horario de PL/SQL guarda una firma que REFERENCED_OWNER Esquema del objeto referenciado
cuando es creado o contiene la siguiente
recompilado. La comparación información: nombre del REFERENCED_NAME Nombre del objeto referenciado
de horario se realiza cuando es constructor, tipos, cantidad y REFERENCED_TYPE Tipo del objeto referenciado
llamado un procedimiento modos de parámetros
remoto. REFERENCED_LINK_NA Vínculo a la base de datos usado para
ME acceder al objeto referenciado
147 148
37
01/10/2010
150
149
Rébsamen 80 Xalapa, Veracruz 91000, México T. (52) (228) 841.61.01 | LANIA A.C. | Todos los derechos reservados
Parámetros Modo: IN/OUT/IN OUT, iSQL *Plus: comando DESCRIBE OBJECT_TYPE Tipo de objeto: TABLE, PROCEDURE, FUNCTION, PACKAGE,
tipo de dato TRIGGER
CREATED Fecha cuando el objeto fue creado
P-código Código de objetos No es accesible
compilados LAST_DDL_TIME Fecha cuando el objeto fue modificado
Errores de Sintaxis de errores La vista USER_ERRORS del
TIMESTAMP Fecha y hora cuando el objeto fue compliado
compilación PL/SQL diccionario de datos o en iSQL
*Plus: comando SHOW ERRORS
STATUS VALID o INVALID
Información de Variables y mensajes El paquete otorgado por Oracle
debug en tiempo de de debug especificados DBMS_OUTPUT
ejecución por el usuario
151 152
38
01/10/2010
USER_SOURCE USER_ERRORS
Utilizado para obtener el texto de un procedimiento o función Utilizado para obtener el texto de los errores de compilación
almacenada
Columna Descripción
Columna Descripción NAME Nombre del objeto
NAME Nombre del objeto TYPE Tipo de objeto: PROCEDURE, FUNCTION, PACKAGE,
TRIGGER
TYPE Tipo de objeto: PROCEDURE, FUNCTION, PACKAGE
LINE Número de línea del código fuente donde ocurrió el error
LINE Número de línea del código fuente
TEXT Texto del mensaje de error
TEXT Texto de la línea de código fuente
SEQUENCE Número de secuencia, para el ordenamiento
153 154
USER_TRIGGERS Ejemplo
select trigger_name, trigger_type,
Columna Descripción triggering_event,table_name, referencing_names,
TRIGGER_NAME Nombre del trigger when_clause, status, trigger_body
from USER_TRIGGERS
TRIGGER_TYPE BEFORE, AFTER, INSTEAD OF
39