SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
1
PL/SQL: IntroducciPL/SQL: Introduccióónn
BDSIBDSI -- Grupo AGrupo A
IntroducciIntroduccióónn
PL/SQL: Lenguaje imperativo paraPL/SQL: Lenguaje imperativo para
manejar los datos del esquemamanejar los datos del esquema
Bucles, procedimientos, funcionesBucles, procedimientos, funciones
Tratamiento de excepcionesTratamiento de excepciones
CursoresCursores
TriggersTriggers
ÍÍndicendice
1.1. BloquesBloques
2.2. Variables y constantesVariables y constantes
3.3. SelectSelect …… intointo
4.4. Instrucciones de controlInstrucciones de control
5.5. ExcepcionesExcepciones
6.6. ProcedimientosProcedimientos
7.7. CursoresCursores
8.8. TriggersTriggers
Primer Ejemplo: bloque anPrimer Ejemplo: bloque anóónimonimo
SET SERVEROUTPUT ON;SET SERVEROUTPUT ON;
Esto es para que los mensajes que se muestran conEsto es para que los mensajes que se muestran con dbms_output.put_linedbms_output.put_line (el(el
equivalente aequivalente a writelnwriteln) se muestren por la salida est) se muestren por la salida estáándar. Por defecto estndar. Por defecto estáá
a OFF. Sa OFF. Sóólo es necesario hacerlo una vez.lo es necesario hacerlo una vez.
Un bloque anUn bloque anóónimo en PL/SQL:nimo en PL/SQL:
BEGINBEGIN
dbms_output.put_linedbms_output.put_line(('Animula vagula, blandula, …');
END;END;
El bloque se carga y ejecuta a la vez. No queda grabado y no pueEl bloque se carga y ejecuta a la vez. No queda grabado y no puede usarsede usarse
de nuevode nuevo
Estructura de un bloqueEstructura de un bloque
DECLAREDECLARE
/*variables,/*variables, typestypes,, andand locallocal subprogramssubprograms. */. */
BEGINBEGIN
/*/* ExecutableExecutable sectionsection:: proceduralprocedural andand SQLSQL statementsstatements gogo herehere. */. */
/*/* ThisThis isis thethe onlyonly sectionsection ofof thethe blockblock thatthat isis requiredrequired. */. */
EXCEPTIONEXCEPTION
/*/* ExceptionException handlinghandling sectionsection: error: error handlinghandling statementsstatements gogo herehere..
*/*/
END;END;
Ver los erroresVer los errores
A menudo obtendremos:A menudo obtendremos:
Advertencia: Procedimiento creado con errores de
compilación.
Para ver quPara ver quéé error ha habido:error ha habido:
SHOW ERRORS
Esto hay que hacerlo cada vez que hay un errorEsto hay que hacerlo cada vez que hay un error
2
VariablesVariables
DECLAREDECLARE
nombre VARCHAR(20);nombre VARCHAR(20);
---- tipo de la columna importe de ventastipo de la columna importe de ventas
precioprecio ventas.importe%Typeventas.importe%Type;;
---- tipo de la fila ventastipo de la fila ventas
filaventasfilaventas ventas%ROWTYPEventas%ROWTYPE;;
---- una constanteuna constante
limite CONSTANT NUMBER := 5000;limite CONSTANT NUMBER := 5000;
Valor por defecto de toda variable: NULLValor por defecto de toda variable: NULL
Se pueden asignar valores con :=Se pueden asignar valores con :=
Variables: ejemploVariables: ejemplo
DECLAREDECLARE
a NUMBER := 3;a NUMBER := 3;
BEGINBEGIN
a := a + 1;a := a + 1;
END;END;
---- (es un bloque totalmente in(es un bloque totalmente inúútil)til)
SelectSelect …… intointo
DECLAREDECLARE
nn trabajadores.nombre%Typetrabajadores.nombre%Type;;
aa trabajadores.apellidos%TYPEtrabajadores.apellidos%TYPE;;
BEGINBEGIN
SELECT nombre,apellidos INTO n,a
FROM trabajadores;
WHERE DNI=WHERE DNI=‘‘001001’’;;
INSERT INTO T1INSERT INTO T1 VALUES(n,aVALUES(n,a););
END;END;
Si no hay exactamente un par de valoresSi no hay exactamente un par de valores nombre,apellidosnombre,apellidos sese
provocarprovocaráá una excepciuna excepcióónn los select … into deben devolver una
única fila
Instrucciones de control:Instrucciones de control: IfIf
IF <IF <conditioncondition> THEN <> THEN <statement_liststatement_list> ELSE <> ELSE <statement_liststatement_list> END IF;> END IF;
IF <IF <conditioncondition_1> THEN ... ELSIF <_1> THEN ... ELSIF <conditioncondition_2> THEN ... ... ... ELSIF_2> THEN ... ... ... ELSIF
<<condition_ncondition_n> THEN ... ELSE ... END IF;> THEN ... ELSE ... END IF;
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1;
IF b=1 THEN
INSERT INTO T1 VALUES(b,a);
ELSE
INSERT INTO T1 VALUES(b+10,a+10);
END IF;
END;
Instrucciones de control:Instrucciones de control: looploop
DECLAREDECLARE
i NUMBER := 1;i NUMBER := 1;
BEGINBEGIN
LOOPLOOP
INSERT INTO T1INSERT INTO T1 VALUES(i,iVALUES(i,i););
i := i+1;i := i+1;
EXIT WHEN i>100;EXIT WHEN i>100;
END LOOP;END LOOP;
END;END;
Si se usaSi se usa looploop hay que poner alghay que poner algúúnn exitexit (con o sin(con o sin whenwhen))
Instrucciones de control:Instrucciones de control: whilewhile,, forfor
WHILE <WHILE <conditioncondition> LOOP> LOOP
<<loop_bodyloop_body>>
END LOOP;END LOOP;
FOR <FOR <varvar> IN <> IN <startstart>..<>..<finishfinish> LOOP> LOOP
<<loop_bodyloop_body>>
END LOOP;END LOOP;
Ejercicio: crear una tabla con un solo atributo numEjercicio: crear una tabla con un solo atributo numééricorico a yy
con 10 filas 1,2con 10 filas 1,2…….10.10
3
Ejercicio: soluciEjercicio: solucióónn
drop table t;drop table t;
create tablecreate table t(at(a number primary key);number primary key);
DECLAREDECLARE
i number;i number;
BEGINBEGIN
For i in 1..10 loopFor i in 1..10 loop
insert into tinsert into t values(ivalues(i););
end loop;end loop;
end;end;
ExcepcionesExcepciones
Ejemplo:Ejemplo:
DECLAREDECLARE
---- DeclaracionesDeclaraciones
BEGINBEGIN
---- EjecuciEjecucióónn
……………………
EXCEPTIONEXCEPTION
WHENWHEN NO_DATA_FOUNDNO_DATA_FOUND THENTHEN
---- Se ejecuta cuando ocurre una excepciSe ejecuta cuando ocurre una excepcióón de tipon de tipo NO_DATA_FOUNDNO_DATA_FOUND
WHENWHEN ZERO_DIVIDEZERO_DIVIDE THENTHEN
---- Se ejecuta cuando ocurre una excepciSe ejecuta cuando ocurre una excepcióón de tipon de tipo ZERO_DIVIDEZERO_DIVIDE
WHEN OTHERS THENWHEN OTHERS THEN
---- Se ejecuta cuando ocurre una excepciSe ejecuta cuando ocurre una excepcióón de un tipo no tratadon de un tipo no tratado
---- en los bloques anterioresen los bloques anteriores
ENDEND;;
Excepciones en Oracle (I)Excepciones en Oracle (I)
ACCESS_INTO_NULLACCESS_INTO_NULL El programa intentEl programa intentóó asignar valores a los atributos de un objeto noasignar valores a los atributos de un objeto no
inicializadoinicializado --65306530
COLLECTION_IS_NULLCOLLECTION_IS_NULL El programa intentEl programa intentóó asignar valores a una tabla anidada aasignar valores a una tabla anidada aúún non no
inicializadainicializada --65316531
CURSOR_ALREADY_OPENCURSOR_ALREADY_OPEN El programa intentEl programa intentóó abrir un cursor que ya se encontraba abierto.abrir un cursor que ya se encontraba abierto.
Recuerde que un cursor de ciclo FOR automRecuerde que un cursor de ciclo FOR automááticamente lo abre y ello no se debe especificar conticamente lo abre y ello no se debe especificar con
la sentencia OPENla sentencia OPEN --65116511
DUP_VAL_ON_INDEXDUP_VAL_ON_INDEX El programa intentEl programa intentóó almacenar valores duplicados en una columna que sealmacenar valores duplicados en una columna que se
mantiene con restriccimantiene con restriccióón de integridad de unn de integridad de un ííndicendice úúnico (nico (uniqueunique indexindex)) --11
INVALID_CURSORINVALID_CURSOR El programa intentEl programa intentóó efectuar una operaciefectuar una operacióón no vn no váálida sobre un cursorlida sobre un cursor --10011001
INVALID_NUMBERINVALID_NUMBER En una sentencia SQL, la conversiEn una sentencia SQL, la conversióón de una cadena de caracteres hacia unn de una cadena de caracteres hacia un
nnúúmero falla cuando esa cadena no representa un nmero falla cuando esa cadena no representa un núúmero vmero váálidolido --17221722
LOGIN_DENIEDLOGIN_DENIED El programa intentEl programa intentóó conectarse a Oracle con un nombre de usuario oconectarse a Oracle con un nombre de usuario o passwordpassword
invinváálidolido --10171017
NO_DATA_FOUNDNO_DATA_FOUND Una sentencia SELECT INTO no devolviUna sentencia SELECT INTO no devolvióó valores o el programavalores o el programa referencireferencióó unun
elemento no inicializado en una tabla indexada 100elemento no inicializado en una tabla indexada 100
NOT_LOGGED_ONNOT_LOGGED_ON El programa efectuEl programa efectuóó una llamada a Oracle sin estar conectadouna llamada a Oracle sin estar conectado --10121012
Excepciones en Oracle (II)Excepciones en Oracle (II)
PROGRAM_ERRORPROGRAM_ERROR PL/SQL tiene un problema internoPL/SQL tiene un problema interno --65016501
ROWTYPE_MISMATCHROWTYPE_MISMATCH Los elementos de una asignaciLos elementos de una asignacióón (el valor a asignar y la variable que lon (el valor a asignar y la variable que lo
contendrcontendráá) tienen tipos incompatibles. Tambi) tienen tipos incompatibles. Tambiéén se presenta este error cuando un parn se presenta este error cuando un paráámetrometro
pasado a un subprograma no es del tipo esperadopasado a un subprograma no es del tipo esperado --65046504
SELF_IS_NULLSELF_IS_NULL El parEl paráámetro SELF (el primero que es pasado a un mmetro SELF (el primero que es pasado a un méétodo MEMBER) es nulotodo MEMBER) es nulo --3062530625
STORAGE_ERRORSTORAGE_ERROR La memoria se terminLa memoria se terminóó o esto estáá corruptacorrupta --65006500
SUBSCRIPT_BEYOND_COUNTSUBSCRIPT_BEYOND_COUNT El programa estEl programa estáá tratando de referenciar un elemento de untratando de referenciar un elemento de un
arreglo indexado que se encuentra en una posiciarreglo indexado que se encuentra en una posicióón mn máás grande que el ns grande que el núúmero real de elementosmero real de elementos
de la coleccide la coleccióónn --65336533
SUBSCRIPT_OUTSIDE_LIMITSUBSCRIPT_OUTSIDE_LIMIT El programa estEl programa estáá referenciandoreferenciando un elemento de un arregloun elemento de un arreglo
utilizando un nutilizando un núúmero fuera del rango permitido (por ejemplo, el elementomero fuera del rango permitido (por ejemplo, el elemento ““--11””)) --65326532
SYS_INVALID_ROWIDSYS_INVALID_ROWID La conversiLa conversióón de una cadena de caracteres hacia un tipon de una cadena de caracteres hacia un tipo rowidrowid fallfallóó porqueporque
la cadena no representa un nla cadena no representa un núúmeromero --14101410
TIMEOUT_ON_RESOURCETIMEOUT_ON_RESOURCE Se excediSe excedióó el tiempo mel tiempo mááximo de espera por un recurso en Oracleximo de espera por un recurso en Oracle --5151
TOO_MANY_ROWSTOO_MANY_ROWS Una sentencia SELECT INTO devuelve mUna sentencia SELECT INTO devuelve máás de una filas de una fila --14221422
VALUE_ERRORVALUE_ERROR OcurriOcurrióó un error aritmun error aritméético, de conversitico, de conversióón o truncamiento. Por ejemplo, suceden o truncamiento. Por ejemplo, sucede
cuando se intenta calzar un valor muy grande dentro de una variacuando se intenta calzar un valor muy grande dentro de una variable mble máás peques pequeññaa --65026502
ZERO_DIVIDEZERO_DIVIDE El programa intentEl programa intentóó efectuar una divisiefectuar una divisióón por ceron por cero --14761476
Excepciones: ejemploExcepciones: ejemplo
DECLARE
v_empid emp.empid%TYPE;
BEGIN
SELECT e.empid INTO v_empid
FROM emp e
WHERE e.ename = 'BERTOLDO';
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE OT_FAILURE;
WHEN TOO_MANY_ROWS THEN
RAISE OT_FAILURE;
WHEN OTHERS THEN
out_status_code := 'FAIL';
out_msg := g_out_msg || ' ' || SUBSTR(SQLERRM, 1, 60);
END;
Excepciones del usuarioExcepciones del usuario
DECLAREDECLARE
---- Declaramos unaDeclaramos una excepcionexcepcion identificada poridentificada por VALOR_NEGATIVOVALOR_NEGATIVO
VALOR_NEGATIVOVALOR_NEGATIVO EXCEPTIONEXCEPTION;;
valorvalor NUMBERNUMBER;;
BEGINBEGIN
---- EjecucionEjecucion
valor :=valor := --1;1;
IFIF valor < 0valor < 0 THENTHEN
RAISERAISE VALOR_NEGATIVOVALOR_NEGATIVO;;
END IF;END IF;
EXCEPTIONEXCEPTION
---- ExcepcionExcepcion
WHENWHEN VALOR_NEGATIVOVALOR_NEGATIVO THENTHEN
dbms_output.put_linedbms_output.put_line('El valor no puede ser negativo');('El valor no puede ser negativo');
ENDEND;;
4
Variables de cursorVariables de cursor
Se usan en lugar de las excepciones paraSe usan en lugar de las excepciones para
controlar el efecto de una sentenciacontrolar el efecto de una sentencia selectselect,,
insertinsert,, updateupdate oo deletedelete
sql%rowcountsql%rowcount: n: núúmero de filas actualizadasmero de filas actualizadas
sql%notfoundsql%notfound: si no hay filas actualizadas. En el: si no hay filas actualizadas. En el
caso decaso de selectselect no se puede usar, siempre saltano se puede usar, siempre salta
la excepcila excepcióón.n. ÚÚtil para el resto (til para el resto (insertinsert,, deletedelete,,
updateupdate).).
Variables de cursor: ejemploVariables de cursor: ejemplo
beginbegin
updateupdate ventasventas
set importe = 10000set importe = 10000
wherewhere idvendedoridvendedor = 12;= 12;
ifif sql%notfoundsql%notfound thenthen
dbms_output.put_linedbms_output.put_line('No hay empleado 12 ...');('No hay empleado 12 ...');
endend ifif;;
exceptionexception
whenwhen no_data_foundno_data_found thenthen
dbms_output.put_linedbms_output.put_line('Error no se encuentran los datos');('Error no se encuentran los datos');
endend;;
No se ejecuta la excepciNo se ejecuta la excepcióón, sino eln, sino el ifif, porque no es un, porque no es un selectselect
Variables de cursor: ejemploVariables de cursor: ejemplo
beginbegin
updateupdate ventasventas
set importe = 10000set importe = 10000
wherewhere idvendedoridvendedor = 1;= 1;
dbms_output.put_linedbms_output.put_line('('NNúúmm filas afectadas ' ||filas afectadas ' ||
to_char(sql%rowcountto_char(sql%rowcount) );) );
exceptionexception
whenwhen no_data_foundno_data_found thenthen
dbms_output.put_linedbms_output.put_line('Error no se encuentran los datos');('Error no se encuentran los datos');
endend;;
Muestra:Muestra: Núm filas afectadas: 1
Variables de cursor: ejercicioVariables de cursor: ejercicio
Dada la tablaDada la tabla empleados(empleados(nombrenombre,,…….).)
escribir cescribir cóódigo PL/SQL para borrar aldigo PL/SQL para borrar al
empleado Bertoldo. El cempleado Bertoldo. El cóódigo debe avisardigo debe avisar
si la operacisi la operacióón se ha realizado conn se ha realizado con ééxitoxito
SoluciSolucióón:n:
ProcedimientosProcedimientos
---- esto es un comentarioesto es un comentario
CREATE OR REPLACE PROCEDURE hola ISCREATE OR REPLACE PROCEDURE hola IS
---- declaramos una variabledeclaramos una variable
usuario VARCHAR2(8) :=usuario VARCHAR2(8) := useruser;;
---- Bloque principalBloque principal
BEGINBEGIN
dbms_output.put_linedbms_output.put_line(' Hola, ' || usuario || '!');(' Hola, ' || usuario || '!');
END;END;
Llamar a un procedimientoLlamar a un procedimiento
Cuando se compile sin problemasCuando se compile sin problemas Procedimiento creado.
Para ejecutarlo:Para ejecutarlo:
EXEC hola
Hola, BERTOLDO43!
Procedimiento PL/SQL terminado correctamente..
5
ParParáámetros ymetros y SelectSelect …… intointo
CREATE OR REPLACE PROCEDURE
totalventas (vendedor VARCHAR2) IS
num_ventas NUMBER;
BEGIN
SELECT COUNT(*) INTO num_ventas
FROM ventas WHERE idvendedor = vendedor;
IF num_ventas > 1 THEN
dbms_output.put_line('Total: ' || num_ventas || ' ventas.');
ELSIF num_ventas = 1 THEN
dbms_output.put_line('sólo una venta');
ELSE dbms_output.put_line('Sin ventas.');
END IF;
END;
Llamada con parLlamada con paráámetrosmetros
exec totalventas(2);
Total: 4 ventas.
Procedimiento PL/SQL terminado
correctamente.
CursoresCursores
ÚÚtiles para trabajartiles para trabajar ““fila a filafila a fila”” con el resultado de uncon el resultado de un
selectselect
Forma de proceder:Forma de proceder:
Declarar el cursor como si se tratara de una variableDeclarar el cursor como si se tratara de una variable
Abrir el cursor con la instrucciAbrir el cursor con la instruccióónn OPENOPEN
Leer cada fila conLeer cada fila con FETCHFETCH
Cerrar el cursor y liberar los recursos con la instrucciCerrar el cursor y liberar los recursos con la instruccióónn CLOSECLOSE
¡¡No deben usarse si se pueden sustituir fNo deben usarse si se pueden sustituir fáácilmente porcilmente por
unun selectselect!!
Declarando CursoresDeclarando Cursores
En un bloque anEn un bloque anóónimo:nimo:
declaredeclare
cursorcursor c_poemasc_poemas isis
SELECTSELECT autor, poemaautor, poema FROMFROM poemas;poemas;
beginbegin
/* Sentencias del bloque ...*//* Sentencias del bloque ...*/
endend;;
En un procedimiento: tras la cabeceraEn un procedimiento: tras la cabecera
Tratando cursores (1)Tratando cursores (1)
SET SERVEROUTPUT ONSET SERVEROUTPUT ON
DECLAREDECLARE
CURSORCURSOR cpaisescpaises
ISIS
SELECTSELECT CO_PAISCO_PAIS, DESCRIPCION, CONTINENTE, DESCRIPCION, CONTINENTE
FROMFROM PAISES;PAISES;
co_paisco_pais VARCHARVARCHAR(3);(3);
descripciondescripcion VARCHARVARCHAR(50);(50);
continentecontinente VARCHARVARCHAR(25);(25);
BEGINBEGIN
OPENOPEN cpaisescpaises;;
FETCHFETCH cpaisescpaises INTOINTO co_pais,descripcion,continenteco_pais,descripcion,continente;;
WHILEWHILE cpaises%cpaises%foundfound
LOOPLOOP
dbms_output.put_line(descripciondbms_output.put_line(descripcion););
FETCHFETCH cpaisescpaises INTOINTO co_pais,descripcion,continenteco_pais,descripcion,continente;;
ENDEND LOOPLOOP;;
CLOSECLOSE cpaisescpaises;;
ENDEND;;
Tratando cursores (2)Tratando cursores (2)
DECLAREDECLARE
CURSOR c_direcciones IS
SELECT nombre, dirección FROM direcciones;
el_nombreel_nombre direcciones.nombre%TYPEdirecciones.nombre%TYPE;;
la_callela_calle direcciones.calle%TYPEdirecciones.calle%TYPE;;
contador NUMBER(1);contador NUMBER(1);
BEGINBEGIN
OPENOPEN c_direccionesc_direcciones;;
LOOPLOOP
FETCHFETCH c_direccionesc_direcciones INTOINTO el_nombreel_nombre,, la_callela_calle;;
EXIT WHENEXIT WHEN c_direcciones%NOTFOUNDc_direcciones%NOTFOUND;;
DBMS_OUTPUT.PUT_LINE(DBMS_OUTPUT.PUT_LINE(‘‘NombreNombre: ' || nombre || ', Calle: ' || calle);: ' || nombre || ', Calle: ' || calle);
END LOOP;END LOOP;
CLOSECLOSE c_direccionesc_direcciones;;
ENDEND;;
6
Tratando cursores (3)Tratando cursores (3)
SET SERVEROUTPUT ONSET SERVEROUTPUT ON
DECLAREDECLARE
v_empnov_empno employees.employee_id%TYPEemployees.employee_id%TYPE;;
v_enamev_ename employees.last_name%TYPEemployees.last_name%TYPE;;
v_count_rowv_count_row NUMBER(3);NUMBER(3);
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
BEGINBEGIN
SELECTSELECT COUNT(rownumCOUNT(rownum) INTO) INTO v_count_rowv_count_row FROMFROM employeesemployees;;
OPENOPEN emp_cursoremp_cursor;;
FOR i IN 1..FOR i IN 1..v_count_rowv_count_row LOOPLOOP
FETCHFETCH emp_cursoremp_cursor INTOINTO v_empnov_empno,, v_enamev_ename;;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_empnoDBMS_OUTPUT.PUT_LINE(TO_CHAR(v_empno)||)||’’ ‘‘||v_ename||v_ename););
END LOOP;END LOOP;
ENDEND;;
Variables tipo cursorVariables tipo cursor
Atributo
Antes de
abrir
Al
abrir
Durante la
recuperación
Al finalizar
la
recuperación
Después de
cerrar
%NOTFOUND ORA-1001 NULL FALSE TRUE ORA-1001
%FOUND ORA-1001 NULL TRUE FALSE ORA-1001
%ISOPEN FALSE TRUE TRUE TRUE FALSE
%ROWCOUNT ORA-1001 0
Número de
registros
que ha
recuperado
hasta el
momento
Número de
total de
registros ORA-1001
CursoresCursores paramparaméétricostricos
DECLAREDECLARE
CURSORCURSOR cpaisescpaises ((p_continentep_continente VARCHARVARCHAR))
ISIS
SELECTSELECT CO_PAISCO_PAIS, DESCRIPCION, CONTINENTE, DESCRIPCION, CONTINENTE
FROMFROM PAISESPAISES
WHEREWHERE CONTINENTE =CONTINENTE = p_continentep_continente;;
registroregistro cpaises%cpaises%ROWTYPEROWTYPE;;
BEGINBEGIN
OPENOPEN cpaisescpaises('EUROPA');('EUROPA');
FETCHFETCH cpaisescpaises INTOINTO registro;registro;
CLOSECLOSE cpaisescpaises;;
ENDEND;;
TriggersTriggers
UnUn trigger es un procedimiento PL/SQL asociado con unaes un procedimiento PL/SQL asociado con una
tabla de la base de datos de Oracle y que se "dispara"tabla de la base de datos de Oracle y que se "dispara"
cada vez que se ejecuta sobre dicha tabla una sentenciacada vez que se ejecuta sobre dicha tabla una sentencia
INSERTINSERT, una sentencia, una sentencia UPDATEUPDATE o una sentenciao una sentencia DELETEDELETE
Algunas aplicaciones:Algunas aplicaciones:
ParaPara grabargrabar logslogs
Para asegurar que se mantienePara asegurar que se mantiene la coherencia del esquemala coherencia del esquema,,
asociando a operaciones en una tabla operaciones en otrasasociando a operaciones en una tabla operaciones en otras
tablas cuando los mecanismos de Oracle resultan insuficientestablas cuando los mecanismos de Oracle resultan insuficientes
TriggersTriggers: caracter: caracteríísticassticas
Pueden disparar otrosPueden disparar otros triggerstriggers
Pueden llamar a otros procedimientosPueden llamar a otros procedimientos
No tienen parNo tienen paráámetrosmetros
No pueden ser llamados desde otrosNo pueden ser llamados desde otros
procedimientosprocedimientos
TriggersTriggers: ventajas: ventajas
Seguridad: permiten restringir al acceso de las tablas a: permiten restringir al acceso de las tablas a
nivel de detallenivel de detalle
EficienciaEficiencia: El plan de ejecuci: El plan de ejecucióón de unn de un triggertrigger ssóólo selo se
analiza una vez, utilizanaliza una vez, utilizáándose directamente a partir dendose directamente a partir de
entoncesentonces
Desventajas: no debe abusarse de ellos y su existencia: no debe abusarse de ellos y su existencia
debe estar bien documentada; de otra forma ladebe estar bien documentada; de otra forma la
utilizaciutilizacióón de la BBDD se vuelve difn de la BBDD se vuelve difíícil de entender.cil de entender.
7
TriggersTriggers: Tipos: Tipos
Hay 2 tipos deHay 2 tipos de TriggersTriggers: los asociados a una: los asociados a una
instrucciinstruccióón y los asociados a una filan y los asociados a una fila
AA nivel de instrucción: se ejecuta despu: se ejecuta despuéés des de
que una instruccique una instruccióónn insertinsert // deletedelete // updateupdate sese
ha llevado a cabo conha llevado a cabo con ééxitoxito
Asociado a una fila: Se puede ejecutar antes o: Se puede ejecutar antes o
despudespuéés de la instruccis de la instruccióón y se llama por cada filan y se llama por cada fila
afectadaafectada
TriggersTriggers: sintaxis: sintaxis
CREATECREATE OR REPLACE TRIGGER nombreOR REPLACE TRIGGER nombre--deldel--triggertrigger
[FOLLOWS nombre[FOLLOWS nombre--otrootro--triggertrigger]]
[BEFORE/AFTER][BEFORE/AFTER]
[INSERT/DELETE/UPDATE/[INSERT/DELETE/UPDATE/UPDATEUPDATE OF listaOF lista--
columnas]columnas]
ONON nombrenombre--tablatabla
[REFERENCING [OLD AS nombre[REFERENCING [OLD AS nombre--antiguo][NEW ASantiguo][NEW AS
nombrenombre--nuevo]]nuevo]]
[FOR EACH ROW/FOR EACH STATEMENT][FOR EACH ROW/FOR EACH STATEMENT]
[WHEN {condiciones}][WHEN {condiciones}]
{Bloque est{Bloque estáándar de sentencias PL/SQL... BEGIN,ndar de sentencias PL/SQL... BEGIN,
EXCEPTION}EXCEPTION}
TriggersTriggers: sintaxis: sintaxis
FollowsFollows: a partir de la versi: a partir de la versióón 11g; permite establecer unn 11g; permite establecer un
orden entre variosorden entre varios triggerstriggers asociados a la mismaasociados a la misma
operacioperacióón: eln: el triggertrigger declarado seguirdeclarado seguiráá al que se indicaal que se indica
WhenWhen: condici: condicióón para que se ejecute eln para que se ejecute el triggertrigger enen
disparadores a nivel de filadisparadores a nivel de fila
Diferencia entreDiferencia entre UpdateUpdate yy UpdateUpdate OfOf ListaColumnasListaColumnas: el: el
primero al hacer unprimero al hacer un updateupdate, el segundo s, el segundo sóólo si selo si se
modifican las columnas indicadasmodifican las columnas indicadas
TriggersTriggers: ejemplo: ejemplo
CREATE TRIGGERCREATE TRIGGER CompruebaEdadCompruebaEdad
BeforeBefore INSERT OR UPDATE OF edad ON PersonaINSERT OR UPDATE OF edad ON Persona
FOR EACH ROWFOR EACH ROW
BEGINBEGIN
IF (:IF (:new.edadnew.edad < 0) THEN< 0) THEN
RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERROR((--20000,20000,
‘‘edad no vedad no váálida');lida');
END IF;END IF;
END;END;
No se llega a insertar ningNo se llega a insertar ningúún daton dato
TriggersTriggers: orden de ejecuci: orden de ejecucióónn
Este es el orden de ejecuciEste es el orden de ejecucióón de una instruccin de una instruccióón DML:n DML:
1. Ejecutar, si existe, el disparador de tipo BEFORE1. Ejecutar, si existe, el disparador de tipo BEFORE
(disparador previo) con nivel de instrucci(disparador previo) con nivel de instruccióónn
2. Para cada fila a la que afecte la orden:2. Para cada fila a la que afecte la orden:
a. Ejecutar, si existe, el disparador de tipo BEFORE cona. Ejecutar, si existe, el disparador de tipo BEFORE con
nivel de fila.nivel de fila.
b. Ejecutar la propia orden.b. Ejecutar la propia orden.
c. Ejecutar, si existe, el disparador de tipo AFTERc. Ejecutar, si existe, el disparador de tipo AFTER
(disparador posterior) con nivel de fila.(disparador posterior) con nivel de fila.
3. Ejecutar, si existe, el disparador de tipo AFTER con3. Ejecutar, si existe, el disparador de tipo AFTER con
nivel de instruccinivel de instruccióónn
TriggersTriggers:: oldold yy newnew
Pseudo registros con los valores antiguos yPseudo registros con los valores antiguos y
nuevos de la filanuevos de la fila
No definido; aNo definido; a nullnullValores de la filaValores de la fila
antes de borrarseantes de borrarse
DeleteDelete
Nuevos valores de laNuevos valores de la
filafila
Valores de fila antesValores de fila antes
de la actualizacide la actualizacióónn
UpdateUpdate
Valores a insertarValores a insertarNo definido; aNo definido; a nullnullInsertInsert
::newnew::oldoldOperaciOperacióónn
8
TriggersTriggers: tabla mutando: tabla mutando……
Es habitual ver el siguiente error durante laEs habitual ver el siguiente error durante la
ejecuciejecucióón de unn de un triggertrigger::
ORA-04091: table <tablename> is mutating,
trigger/function may not see it
Ocurre cuando un disparado a nivel de filasOcurre cuando un disparado a nivel de filas
accede a la misma tabla en la que se basa y laaccede a la misma tabla en la que se basa y la
operacioperacióón no es unn no es un insertinsert de una sola filade una sola fila
Tabla mutando: EjemploTabla mutando: Ejemplo
createcreate tabletable t (col1t (col1 numbernumber, col2, col2 varcharvarchar(30));(30));
create or replace trigger t_trg before insert or update or delete on t
for each row
declare
i integer;
begin
select count(*) into i from t;
--más cosas …
end;

insertinsert intointo tt valuesvalues (1,(1, ‘‘prueba');prueba');
11 rowrow createdcreated..
updateupdate t set col1 = 2;t set col1 = 2;
update t * ERROR at line 1: ORA-04091: table SYSTEM.T is mutating, trigger/function
may not see it ORA-06512: at "SYSTEM.T_TRG", line 4 ORA-04088: error during
execution of trigger 'SYSTEM.T_TRG'
TriggersTriggers: distinguir la operaci: distinguir la operacióónn
En lugar de variosEn lugar de varios triggerstriggers para varias operaciones espara varias operaciones es
buena idea crear uno y distinguir casos:buena idea crear uno y distinguir casos:
CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER nombre_triggernombre_trigger BEFOREBEFORE
INSERT OR UPDATE OR DELETE ONINSERT OR UPDATE OR DELETE ON nombre_tablanombre_tabla
FOR EACH ROWFOR EACH ROW
BEGINBEGIN
IF INSERTING THEN...IF INSERTING THEN... ----dodo whateverwhatever END IF;END IF;
IF UPDATING THEN ...IF UPDATING THEN ... ----dodo somethingsomething elseelse END IF;END IF;
IF DELETING THEN ...IF DELETING THEN ... ----dodo somethingsomething elseelse END IF;END IF;
END;END;
TriggersTriggers: gesti: gestióónn
TriggersTriggers existentes:existentes:
select trigger_name from user_triggers;
Detalles de unDetalles de un triggertrigger::
select trigger_type, triggering_event, table_name, referencing_names,
trigger_body from user_triggers where trigger_name =
'<trigger_name>';
Borrar un trigger: drop trigger '<trigger_name>’;
En lugar de borrarlo un trigger puede desactivarse:
alter trigger <trigger_name> {disable|enable};
TriggersTriggers: tambi: tambiéén para DDLn para DDL
Ejemplo:Ejemplo:
CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER drop_triggerdrop_trigger
BEFORE DROP ONBEFORE DROP ON bertoldo.SCHEMAbertoldo.SCHEMA BEGINBEGIN
RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERROR (( numnum =>=> --20000,20000,
msgmsg =>=> ‘‘No se puede hacerNo se puede hacer dropdrop'); END;'); END;
No permite borrar ninguna fila aNo permite borrar ninguna fila a bertoldobertoldo
TriggersTriggers: tambi: tambiéén para el sistema (I)n para el sistema (I)
Ejemplo: queremos llevar unEjemplo: queremos llevar un loglog de los usuarios que sede los usuarios que se
han conectado en esta tabla:han conectado en esta tabla:
CREATE TABLECREATE TABLE session_infosession_info ((
usernameusername VARCHAR2(30),VARCHAR2(30),
logon_datelogon_date DATE,DATE,
session_idsession_id VARCHAR2(30),VARCHAR2(30),
ip_addrip_addr VARCHAR2(30),VARCHAR2(30),
hostnamehostname VARCHAR2(30),VARCHAR2(30),
auth_typeauth_type VARCHAR2(30));VARCHAR2(30));
9
TriggersTriggers: tambi: tambiéén para el sistema (II)n para el sistema (II)
CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER trg_session_infotrg_session_info
BEFORE LOGOFF ON DATABASEBEFORE LOGOFF ON DATABASE
DECLAREDECLARE
session_idsession_id VARCHAR2(30);VARCHAR2(30);
ip_addrip_addr VARCHAR2(30);VARCHAR2(30);
hostnamehostname VARCHAR2(30);VARCHAR2(30);
auth_typeauth_type VARCHAR2(30);VARCHAR2(30);
BEGINBEGIN
SELECTSELECT sys_contextsys_context ('USERENV', 'SESSIONID') INTO('USERENV', 'SESSIONID') INTO session_idsession_id FROM dual;FROM dual;
SELECTSELECT sys_contextsys_context ('USERENV', '('USERENV', 'IP_ADDRESSIP_ADDRESS') INTO') INTO ip_addrip_addr FROM dual;FROM dual;
SELECTSELECT sys_contextsys_context ('USERENV', 'HOST') INTO('USERENV', 'HOST') INTO hostnamehostname FROM dual;FROM dual;
SELECTSELECT sys_contextsys_context ('USERENV', '('USERENV', 'AUTHENTICATION_TYPEAUTHENTICATION_TYPE')')
INTOINTO auth_typeauth_type FROM dual;FROM dual;
INSERT INTOINSERT INTO session_infosession_info VALUES (VALUES (useruser,, sysdatesysdate,, session_idsession_id,, ip_addrip_addr,,
hostnamehostname,, auth_typeauth_type););
END; /END; /
FuncionesFunciones úútiles en SQL de Oracletiles en SQL de Oracle
(I)(I)
Función Descripción
String Functions
upper(s), lower(s) convert string s to upper/lower-case
initcap(s) capitalise first letter of each word
ltrim(s), rtrim(s) remove blank char. from left/right
substr(s,start,len) sub-string of length len from position start
length(s) length of s
FuncionesFunciones úútiles en SQL de Oracletiles en SQL de Oracle
(II)(II)
Date Functions
sysdate current date (on Oracle server)
to_date(date, format) date formatting
Number Functions
round(x) round real number x to integer
mod(n,p) n modulus p
abs(x) absolute value of x
dbms_random.random() generate a random integer
FuncionesFunciones úútiles en SQL de Oracletiles en SQL de Oracle
(III)(III)
Type Conversion Functions
to_char() convert to string
to_date() convert to date
to_number() convert to number
Miscellaneous Functions
user current Oracle user

Más contenido relacionado

La actualidad más candente

Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc X
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de controlFernando Solis
 
Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Renny Batista
 
Js control de flujo
Js control de flujoJs control de flujo
Js control de flujoFERNANDOZ9
 
Instrucciones para c_
Instrucciones para c_Instrucciones para c_
Instrucciones para c_GamePlayer35
 
Comenzando a programar
Comenzando a programarComenzando a programar
Comenzando a programarRubén Loredo
 
Estructuras condicionales
Estructuras condicionalesEstructuras condicionales
Estructuras condicionalesAndreina Trejo
 
Action scrip 3,0 (1) (1)
Action scrip 3,0 (1) (1)Action scrip 3,0 (1) (1)
Action scrip 3,0 (1) (1)Silvana Nuñez
 
Estructuras de Control en Lenguaje C
Estructuras de Control en Lenguaje CEstructuras de Control en Lenguaje C
Estructuras de Control en Lenguaje CMarvin Romero
 
Clase 2 Estructuras de Control
Clase 2 Estructuras de ControlClase 2 Estructuras de Control
Clase 2 Estructuras de ControlDesireé mart?ez
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivasAbrirllave
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de controlLic_Vera
 

La actualidad más candente (20)

Diagramas De Flujo
Diagramas De FlujoDiagramas De Flujo
Diagramas De Flujo
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcaciones
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 
Action scrip 3,0
Action scrip 3,0 Action scrip 3,0
Action scrip 3,0
 
Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015
 
Sentencias de control
Sentencias de controlSentencias de control
Sentencias de control
 
Operadores
OperadoresOperadores
Operadores
 
Js control de flujo
Js control de flujoJs control de flujo
Js control de flujo
 
Instrucciones para c_
Instrucciones para c_Instrucciones para c_
Instrucciones para c_
 
Comenzando a programar
Comenzando a programarComenzando a programar
Comenzando a programar
 
Estructuras condicionales
Estructuras condicionalesEstructuras condicionales
Estructuras condicionales
 
Programacion basica
Programacion basicaProgramacion basica
Programacion basica
 
Funciones
FuncionesFunciones
Funciones
 
Clase 5 php
Clase 5 phpClase 5 php
Clase 5 php
 
Action scrip 3,0 (1) (1)
Action scrip 3,0 (1) (1)Action scrip 3,0 (1) (1)
Action scrip 3,0 (1) (1)
 
Estructuras de Control en Lenguaje C
Estructuras de Control en Lenguaje CEstructuras de Control en Lenguaje C
Estructuras de Control en Lenguaje C
 
Clase 2 Estructuras de Control
Clase 2 Estructuras de ControlClase 2 Estructuras de Control
Clase 2 Estructuras de Control
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivas
 
Curso php-my sql-clase-3
Curso php-my sql-clase-3Curso php-my sql-clase-3
Curso php-my sql-clase-3
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 

Destacado

Trabajo minitab
Trabajo minitabTrabajo minitab
Trabajo minitabAlan Hdz
 
Fhotoshop actividad n#6
Fhotoshop actividad n#6Fhotoshop actividad n#6
Fhotoshop actividad n#6Kevin Narvaez
 
Manual de uso de ms outlook
Manual de uso de ms outlookManual de uso de ms outlook
Manual de uso de ms outlookmariela_soria
 
Manual de excel.
Manual de excel.Manual de excel.
Manual de excel.UTPL
 
Los ciegos y el elefante
Los ciegos y el elefanteLos ciegos y el elefante
Los ciegos y el elefanteRUKA2015
 
Reporte monitoreo prensa 20 01-2015
Reporte monitoreo prensa 20 01-2015Reporte monitoreo prensa 20 01-2015
Reporte monitoreo prensa 20 01-2015afipdocumentos
 
Cuando los-borregos-salen-a-dormir
Cuando los-borregos-salen-a-dormirCuando los-borregos-salen-a-dormir
Cuando los-borregos-salen-a-dormirRosario Larra{in
 
La enseñanza para la comprensión
La enseñanza para la comprensiónLa enseñanza para la comprensión
La enseñanza para la comprensióngenesisrvjl
 
Tarea Estadistica numero 3
Tarea Estadistica numero 3Tarea Estadistica numero 3
Tarea Estadistica numero 3paumesmar96
 
Nutricion y alimetacion saludable
Nutricion y alimetacion saludableNutricion y alimetacion saludable
Nutricion y alimetacion saludable1109297267
 

Destacado (20)

Qué son bases de datos
Qué son bases de datosQué son bases de datos
Qué son bases de datos
 
Trabajo minitab
Trabajo minitabTrabajo minitab
Trabajo minitab
 
Programacion o o
Programacion o oProgramacion o o
Programacion o o
 
Fhotoshop actividad n#6
Fhotoshop actividad n#6Fhotoshop actividad n#6
Fhotoshop actividad n#6
 
Manual de uso de ms outlook
Manual de uso de ms outlookManual de uso de ms outlook
Manual de uso de ms outlook
 
Manual de excel.
Manual de excel.Manual de excel.
Manual de excel.
 
Expshell
ExpshellExpshell
Expshell
 
Los ciegos y el elefante
Los ciegos y el elefanteLos ciegos y el elefante
Los ciegos y el elefante
 
Sueños (ilust)
Sueños (ilust)Sueños (ilust)
Sueños (ilust)
 
Trabajo
TrabajoTrabajo
Trabajo
 
Reporte monitoreo prensa 20 01-2015
Reporte monitoreo prensa 20 01-2015Reporte monitoreo prensa 20 01-2015
Reporte monitoreo prensa 20 01-2015
 
Cuando los-borregos-salen-a-dormir
Cuando los-borregos-salen-a-dormirCuando los-borregos-salen-a-dormir
Cuando los-borregos-salen-a-dormir
 
La enseñanza para la comprensión
La enseñanza para la comprensiónLa enseñanza para la comprensión
La enseñanza para la comprensión
 
Tarea Estadistica numero 3
Tarea Estadistica numero 3Tarea Estadistica numero 3
Tarea Estadistica numero 3
 
Ple
PlePle
Ple
 
Glosario
Glosario Glosario
Glosario
 
Impress
ImpressImpress
Impress
 
Portafolio digital
Portafolio digital Portafolio digital
Portafolio digital
 
Nutricion y alimetacion saludable
Nutricion y alimetacion saludableNutricion y alimetacion saludable
Nutricion y alimetacion saludable
 
El cajas (informatica)
El cajas (informatica)El cajas (informatica)
El cajas (informatica)
 

Similar a Pl

PL SQL Diplomado Oracle
PL SQL Diplomado OraclePL SQL Diplomado Oracle
PL SQL Diplomado OracleUzziel Chaidez
 
Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)José Toro
 
Forms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresForms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresEdwin Romero
 
Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScripttovi27
 
Conceptos basicos de programacion con pl sql
Conceptos basicos de programacion con pl sqlConceptos basicos de programacion con pl sql
Conceptos basicos de programacion con pl sqlAndrei Hortúa
 
Lenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de ControlLenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de ControlKarina Arguedas Ruelas
 
Estructuras control java-
Estructuras control java-Estructuras control java-
Estructuras control java-SENA
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchezsamo509
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchezsamo509
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchezsamo509
 

Similar a Pl (20)

PL SQL Diplomado Oracle
PL SQL Diplomado OraclePL SQL Diplomado Oracle
PL SQL Diplomado Oracle
 
Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)
 
1 clase de Ps /sql
    1  clase  de  Ps /sql     1  clase  de  Ps /sql
1 clase de Ps /sql
 
Forms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresForms 10g procedimientos y cursores
Forms 10g procedimientos y cursores
 
71946780 manual-pl-sql-espanol
71946780 manual-pl-sql-espanol71946780 manual-pl-sql-espanol
71946780 manual-pl-sql-espanol
 
Apunte plsql
Apunte plsqlApunte plsql
Apunte plsql
 
Unidad3.pptx
Unidad3.pptxUnidad3.pptx
Unidad3.pptx
 
Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScript
 
Conceptos basicos de programacion con pl sql
Conceptos basicos de programacion con pl sqlConceptos basicos de programacion con pl sql
Conceptos basicos de programacion con pl sql
 
Lenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de ControlLenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de Control
 
Estructuras control java-
Estructuras control java-Estructuras control java-
Estructuras control java-
 
Pl Sql
Pl SqlPl Sql
Pl Sql
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Manual de programación de Arduino
Manual de programación de Arduino Manual de programación de Arduino
Manual de programación de Arduino
 
Taller completo
Taller completoTaller completo
Taller completo
 
PLSQL y paquetes
PLSQL y paquetesPLSQL y paquetes
PLSQL y paquetes
 
Php1
Php1Php1
Php1
 

Último

c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxc3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxMartín Ramírez
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptxJunkotantik
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressionsConsueloSantana3
 
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIATRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIAAbelardoVelaAlbrecht1
 
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...JAVIER SOLIS NOYOLA
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfManuel Molina
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docxAgustinaNuez21
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALEDUCCUniversidadCatl
 
Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.José Luis Palma
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFAROJosé Luis Palma
 
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADODECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADOJosé Luis Palma
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas123yudy
 
Unidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parteUnidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parteJuan Hernandez
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialpatriciaines1993
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxYeseniaRivera50
 
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxc3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxMartín Ramírez
 

Último (20)

c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptxc3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
c3.hu3.p1.p2.El ser humano y el sentido de su existencia.pptx
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptx
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressions
 
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIATRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
TRIPTICO-SISTEMA-MUSCULAR. PARA NIÑOS DE PRIMARIA
 
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docx
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
 
Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
 
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADODECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
DECÁGOLO DEL GENERAL ELOY ALFARO DELGADO
 
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas
 
Power Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptxPower Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptx
 
Sesión de clase: Defendamos la verdad.pdf
Sesión de clase: Defendamos la verdad.pdfSesión de clase: Defendamos la verdad.pdf
Sesión de clase: Defendamos la verdad.pdf
 
Unidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parteUnidad II Doctrina de la Iglesia 1 parte
Unidad II Doctrina de la Iglesia 1 parte
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundial
 
Sesión La luz brilla en la oscuridad.pdf
Sesión  La luz brilla en la oscuridad.pdfSesión  La luz brilla en la oscuridad.pdf
Sesión La luz brilla en la oscuridad.pdf
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
 
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptxc3.hu3.p1.p3.El ser humano como ser histórico.pptx
c3.hu3.p1.p3.El ser humano como ser histórico.pptx
 

Pl

  • 1. 1 PL/SQL: IntroducciPL/SQL: Introduccióónn BDSIBDSI -- Grupo AGrupo A IntroducciIntroduccióónn PL/SQL: Lenguaje imperativo paraPL/SQL: Lenguaje imperativo para manejar los datos del esquemamanejar los datos del esquema Bucles, procedimientos, funcionesBucles, procedimientos, funciones Tratamiento de excepcionesTratamiento de excepciones CursoresCursores TriggersTriggers ÍÍndicendice 1.1. BloquesBloques 2.2. Variables y constantesVariables y constantes 3.3. SelectSelect …… intointo 4.4. Instrucciones de controlInstrucciones de control 5.5. ExcepcionesExcepciones 6.6. ProcedimientosProcedimientos 7.7. CursoresCursores 8.8. TriggersTriggers Primer Ejemplo: bloque anPrimer Ejemplo: bloque anóónimonimo SET SERVEROUTPUT ON;SET SERVEROUTPUT ON; Esto es para que los mensajes que se muestran conEsto es para que los mensajes que se muestran con dbms_output.put_linedbms_output.put_line (el(el equivalente aequivalente a writelnwriteln) se muestren por la salida est) se muestren por la salida estáándar. Por defecto estndar. Por defecto estáá a OFF. Sa OFF. Sóólo es necesario hacerlo una vez.lo es necesario hacerlo una vez. Un bloque anUn bloque anóónimo en PL/SQL:nimo en PL/SQL: BEGINBEGIN dbms_output.put_linedbms_output.put_line(('Animula vagula, blandula, …'); END;END; El bloque se carga y ejecuta a la vez. No queda grabado y no pueEl bloque se carga y ejecuta a la vez. No queda grabado y no puede usarsede usarse de nuevode nuevo Estructura de un bloqueEstructura de un bloque DECLAREDECLARE /*variables,/*variables, typestypes,, andand locallocal subprogramssubprograms. */. */ BEGINBEGIN /*/* ExecutableExecutable sectionsection:: proceduralprocedural andand SQLSQL statementsstatements gogo herehere. */. */ /*/* ThisThis isis thethe onlyonly sectionsection ofof thethe blockblock thatthat isis requiredrequired. */. */ EXCEPTIONEXCEPTION /*/* ExceptionException handlinghandling sectionsection: error: error handlinghandling statementsstatements gogo herehere.. */*/ END;END; Ver los erroresVer los errores A menudo obtendremos:A menudo obtendremos: Advertencia: Procedimiento creado con errores de compilación. Para ver quPara ver quéé error ha habido:error ha habido: SHOW ERRORS Esto hay que hacerlo cada vez que hay un errorEsto hay que hacerlo cada vez que hay un error
  • 2. 2 VariablesVariables DECLAREDECLARE nombre VARCHAR(20);nombre VARCHAR(20); ---- tipo de la columna importe de ventastipo de la columna importe de ventas precioprecio ventas.importe%Typeventas.importe%Type;; ---- tipo de la fila ventastipo de la fila ventas filaventasfilaventas ventas%ROWTYPEventas%ROWTYPE;; ---- una constanteuna constante limite CONSTANT NUMBER := 5000;limite CONSTANT NUMBER := 5000; Valor por defecto de toda variable: NULLValor por defecto de toda variable: NULL Se pueden asignar valores con :=Se pueden asignar valores con := Variables: ejemploVariables: ejemplo DECLAREDECLARE a NUMBER := 3;a NUMBER := 3; BEGINBEGIN a := a + 1;a := a + 1; END;END; ---- (es un bloque totalmente in(es un bloque totalmente inúútil)til) SelectSelect …… intointo DECLAREDECLARE nn trabajadores.nombre%Typetrabajadores.nombre%Type;; aa trabajadores.apellidos%TYPEtrabajadores.apellidos%TYPE;; BEGINBEGIN SELECT nombre,apellidos INTO n,a FROM trabajadores; WHERE DNI=WHERE DNI=‘‘001001’’;; INSERT INTO T1INSERT INTO T1 VALUES(n,aVALUES(n,a);); END;END; Si no hay exactamente un par de valoresSi no hay exactamente un par de valores nombre,apellidosnombre,apellidos sese provocarprovocaráá una excepciuna excepcióónn los select … into deben devolver una única fila Instrucciones de control:Instrucciones de control: IfIf IF <IF <conditioncondition> THEN <> THEN <statement_liststatement_list> ELSE <> ELSE <statement_liststatement_list> END IF;> END IF; IF <IF <conditioncondition_1> THEN ... ELSIF <_1> THEN ... ELSIF <conditioncondition_2> THEN ... ... ... ELSIF_2> THEN ... ... ... ELSIF <<condition_ncondition_n> THEN ... ELSE ... END IF;> THEN ... ELSE ... END IF; DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1; IF b=1 THEN INSERT INTO T1 VALUES(b,a); ELSE INSERT INTO T1 VALUES(b+10,a+10); END IF; END; Instrucciones de control:Instrucciones de control: looploop DECLAREDECLARE i NUMBER := 1;i NUMBER := 1; BEGINBEGIN LOOPLOOP INSERT INTO T1INSERT INTO T1 VALUES(i,iVALUES(i,i);); i := i+1;i := i+1; EXIT WHEN i>100;EXIT WHEN i>100; END LOOP;END LOOP; END;END; Si se usaSi se usa looploop hay que poner alghay que poner algúúnn exitexit (con o sin(con o sin whenwhen)) Instrucciones de control:Instrucciones de control: whilewhile,, forfor WHILE <WHILE <conditioncondition> LOOP> LOOP <<loop_bodyloop_body>> END LOOP;END LOOP; FOR <FOR <varvar> IN <> IN <startstart>..<>..<finishfinish> LOOP> LOOP <<loop_bodyloop_body>> END LOOP;END LOOP; Ejercicio: crear una tabla con un solo atributo numEjercicio: crear una tabla con un solo atributo numééricorico a yy con 10 filas 1,2con 10 filas 1,2…….10.10
  • 3. 3 Ejercicio: soluciEjercicio: solucióónn drop table t;drop table t; create tablecreate table t(at(a number primary key);number primary key); DECLAREDECLARE i number;i number; BEGINBEGIN For i in 1..10 loopFor i in 1..10 loop insert into tinsert into t values(ivalues(i);); end loop;end loop; end;end; ExcepcionesExcepciones Ejemplo:Ejemplo: DECLAREDECLARE ---- DeclaracionesDeclaraciones BEGINBEGIN ---- EjecuciEjecucióónn …………………… EXCEPTIONEXCEPTION WHENWHEN NO_DATA_FOUNDNO_DATA_FOUND THENTHEN ---- Se ejecuta cuando ocurre una excepciSe ejecuta cuando ocurre una excepcióón de tipon de tipo NO_DATA_FOUNDNO_DATA_FOUND WHENWHEN ZERO_DIVIDEZERO_DIVIDE THENTHEN ---- Se ejecuta cuando ocurre una excepciSe ejecuta cuando ocurre una excepcióón de tipon de tipo ZERO_DIVIDEZERO_DIVIDE WHEN OTHERS THENWHEN OTHERS THEN ---- Se ejecuta cuando ocurre una excepciSe ejecuta cuando ocurre una excepcióón de un tipo no tratadon de un tipo no tratado ---- en los bloques anterioresen los bloques anteriores ENDEND;; Excepciones en Oracle (I)Excepciones en Oracle (I) ACCESS_INTO_NULLACCESS_INTO_NULL El programa intentEl programa intentóó asignar valores a los atributos de un objeto noasignar valores a los atributos de un objeto no inicializadoinicializado --65306530 COLLECTION_IS_NULLCOLLECTION_IS_NULL El programa intentEl programa intentóó asignar valores a una tabla anidada aasignar valores a una tabla anidada aúún non no inicializadainicializada --65316531 CURSOR_ALREADY_OPENCURSOR_ALREADY_OPEN El programa intentEl programa intentóó abrir un cursor que ya se encontraba abierto.abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automRecuerde que un cursor de ciclo FOR automááticamente lo abre y ello no se debe especificar conticamente lo abre y ello no se debe especificar con la sentencia OPENla sentencia OPEN --65116511 DUP_VAL_ON_INDEXDUP_VAL_ON_INDEX El programa intentEl programa intentóó almacenar valores duplicados en una columna que sealmacenar valores duplicados en una columna que se mantiene con restriccimantiene con restriccióón de integridad de unn de integridad de un ííndicendice úúnico (nico (uniqueunique indexindex)) --11 INVALID_CURSORINVALID_CURSOR El programa intentEl programa intentóó efectuar una operaciefectuar una operacióón no vn no váálida sobre un cursorlida sobre un cursor --10011001 INVALID_NUMBERINVALID_NUMBER En una sentencia SQL, la conversiEn una sentencia SQL, la conversióón de una cadena de caracteres hacia unn de una cadena de caracteres hacia un nnúúmero falla cuando esa cadena no representa un nmero falla cuando esa cadena no representa un núúmero vmero váálidolido --17221722 LOGIN_DENIEDLOGIN_DENIED El programa intentEl programa intentóó conectarse a Oracle con un nombre de usuario oconectarse a Oracle con un nombre de usuario o passwordpassword invinváálidolido --10171017 NO_DATA_FOUNDNO_DATA_FOUND Una sentencia SELECT INTO no devolviUna sentencia SELECT INTO no devolvióó valores o el programavalores o el programa referencireferencióó unun elemento no inicializado en una tabla indexada 100elemento no inicializado en una tabla indexada 100 NOT_LOGGED_ONNOT_LOGGED_ON El programa efectuEl programa efectuóó una llamada a Oracle sin estar conectadouna llamada a Oracle sin estar conectado --10121012 Excepciones en Oracle (II)Excepciones en Oracle (II) PROGRAM_ERRORPROGRAM_ERROR PL/SQL tiene un problema internoPL/SQL tiene un problema interno --65016501 ROWTYPE_MISMATCHROWTYPE_MISMATCH Los elementos de una asignaciLos elementos de una asignacióón (el valor a asignar y la variable que lon (el valor a asignar y la variable que lo contendrcontendráá) tienen tipos incompatibles. Tambi) tienen tipos incompatibles. Tambiéén se presenta este error cuando un parn se presenta este error cuando un paráámetrometro pasado a un subprograma no es del tipo esperadopasado a un subprograma no es del tipo esperado --65046504 SELF_IS_NULLSELF_IS_NULL El parEl paráámetro SELF (el primero que es pasado a un mmetro SELF (el primero que es pasado a un méétodo MEMBER) es nulotodo MEMBER) es nulo --3062530625 STORAGE_ERRORSTORAGE_ERROR La memoria se terminLa memoria se terminóó o esto estáá corruptacorrupta --65006500 SUBSCRIPT_BEYOND_COUNTSUBSCRIPT_BEYOND_COUNT El programa estEl programa estáá tratando de referenciar un elemento de untratando de referenciar un elemento de un arreglo indexado que se encuentra en una posiciarreglo indexado que se encuentra en una posicióón mn máás grande que el ns grande que el núúmero real de elementosmero real de elementos de la coleccide la coleccióónn --65336533 SUBSCRIPT_OUTSIDE_LIMITSUBSCRIPT_OUTSIDE_LIMIT El programa estEl programa estáá referenciandoreferenciando un elemento de un arregloun elemento de un arreglo utilizando un nutilizando un núúmero fuera del rango permitido (por ejemplo, el elementomero fuera del rango permitido (por ejemplo, el elemento ““--11””)) --65326532 SYS_INVALID_ROWIDSYS_INVALID_ROWID La conversiLa conversióón de una cadena de caracteres hacia un tipon de una cadena de caracteres hacia un tipo rowidrowid fallfallóó porqueporque la cadena no representa un nla cadena no representa un núúmeromero --14101410 TIMEOUT_ON_RESOURCETIMEOUT_ON_RESOURCE Se excediSe excedióó el tiempo mel tiempo mááximo de espera por un recurso en Oracleximo de espera por un recurso en Oracle --5151 TOO_MANY_ROWSTOO_MANY_ROWS Una sentencia SELECT INTO devuelve mUna sentencia SELECT INTO devuelve máás de una filas de una fila --14221422 VALUE_ERRORVALUE_ERROR OcurriOcurrióó un error aritmun error aritméético, de conversitico, de conversióón o truncamiento. Por ejemplo, suceden o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variacuando se intenta calzar un valor muy grande dentro de una variable mble máás peques pequeññaa --65026502 ZERO_DIVIDEZERO_DIVIDE El programa intentEl programa intentóó efectuar una divisiefectuar una divisióón por ceron por cero --14761476 Excepciones: ejemploExcepciones: ejemplo DECLARE v_empid emp.empid%TYPE; BEGIN SELECT e.empid INTO v_empid FROM emp e WHERE e.ename = 'BERTOLDO'; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE OT_FAILURE; WHEN TOO_MANY_ROWS THEN RAISE OT_FAILURE; WHEN OTHERS THEN out_status_code := 'FAIL'; out_msg := g_out_msg || ' ' || SUBSTR(SQLERRM, 1, 60); END; Excepciones del usuarioExcepciones del usuario DECLAREDECLARE ---- Declaramos unaDeclaramos una excepcionexcepcion identificada poridentificada por VALOR_NEGATIVOVALOR_NEGATIVO VALOR_NEGATIVOVALOR_NEGATIVO EXCEPTIONEXCEPTION;; valorvalor NUMBERNUMBER;; BEGINBEGIN ---- EjecucionEjecucion valor :=valor := --1;1; IFIF valor < 0valor < 0 THENTHEN RAISERAISE VALOR_NEGATIVOVALOR_NEGATIVO;; END IF;END IF; EXCEPTIONEXCEPTION ---- ExcepcionExcepcion WHENWHEN VALOR_NEGATIVOVALOR_NEGATIVO THENTHEN dbms_output.put_linedbms_output.put_line('El valor no puede ser negativo');('El valor no puede ser negativo'); ENDEND;;
  • 4. 4 Variables de cursorVariables de cursor Se usan en lugar de las excepciones paraSe usan en lugar de las excepciones para controlar el efecto de una sentenciacontrolar el efecto de una sentencia selectselect,, insertinsert,, updateupdate oo deletedelete sql%rowcountsql%rowcount: n: núúmero de filas actualizadasmero de filas actualizadas sql%notfoundsql%notfound: si no hay filas actualizadas. En el: si no hay filas actualizadas. En el caso decaso de selectselect no se puede usar, siempre saltano se puede usar, siempre salta la excepcila excepcióón.n. ÚÚtil para el resto (til para el resto (insertinsert,, deletedelete,, updateupdate).). Variables de cursor: ejemploVariables de cursor: ejemplo beginbegin updateupdate ventasventas set importe = 10000set importe = 10000 wherewhere idvendedoridvendedor = 12;= 12; ifif sql%notfoundsql%notfound thenthen dbms_output.put_linedbms_output.put_line('No hay empleado 12 ...');('No hay empleado 12 ...'); endend ifif;; exceptionexception whenwhen no_data_foundno_data_found thenthen dbms_output.put_linedbms_output.put_line('Error no se encuentran los datos');('Error no se encuentran los datos'); endend;; No se ejecuta la excepciNo se ejecuta la excepcióón, sino eln, sino el ifif, porque no es un, porque no es un selectselect Variables de cursor: ejemploVariables de cursor: ejemplo beginbegin updateupdate ventasventas set importe = 10000set importe = 10000 wherewhere idvendedoridvendedor = 1;= 1; dbms_output.put_linedbms_output.put_line('('NNúúmm filas afectadas ' ||filas afectadas ' || to_char(sql%rowcountto_char(sql%rowcount) );) ); exceptionexception whenwhen no_data_foundno_data_found thenthen dbms_output.put_linedbms_output.put_line('Error no se encuentran los datos');('Error no se encuentran los datos'); endend;; Muestra:Muestra: Núm filas afectadas: 1 Variables de cursor: ejercicioVariables de cursor: ejercicio Dada la tablaDada la tabla empleados(empleados(nombrenombre,,…….).) escribir cescribir cóódigo PL/SQL para borrar aldigo PL/SQL para borrar al empleado Bertoldo. El cempleado Bertoldo. El cóódigo debe avisardigo debe avisar si la operacisi la operacióón se ha realizado conn se ha realizado con ééxitoxito SoluciSolucióón:n: ProcedimientosProcedimientos ---- esto es un comentarioesto es un comentario CREATE OR REPLACE PROCEDURE hola ISCREATE OR REPLACE PROCEDURE hola IS ---- declaramos una variabledeclaramos una variable usuario VARCHAR2(8) :=usuario VARCHAR2(8) := useruser;; ---- Bloque principalBloque principal BEGINBEGIN dbms_output.put_linedbms_output.put_line(' Hola, ' || usuario || '!');(' Hola, ' || usuario || '!'); END;END; Llamar a un procedimientoLlamar a un procedimiento Cuando se compile sin problemasCuando se compile sin problemas Procedimiento creado. Para ejecutarlo:Para ejecutarlo: EXEC hola Hola, BERTOLDO43! Procedimiento PL/SQL terminado correctamente..
  • 5. 5 ParParáámetros ymetros y SelectSelect …… intointo CREATE OR REPLACE PROCEDURE totalventas (vendedor VARCHAR2) IS num_ventas NUMBER; BEGIN SELECT COUNT(*) INTO num_ventas FROM ventas WHERE idvendedor = vendedor; IF num_ventas > 1 THEN dbms_output.put_line('Total: ' || num_ventas || ' ventas.'); ELSIF num_ventas = 1 THEN dbms_output.put_line('sólo una venta'); ELSE dbms_output.put_line('Sin ventas.'); END IF; END; Llamada con parLlamada con paráámetrosmetros exec totalventas(2); Total: 4 ventas. Procedimiento PL/SQL terminado correctamente. CursoresCursores ÚÚtiles para trabajartiles para trabajar ““fila a filafila a fila”” con el resultado de uncon el resultado de un selectselect Forma de proceder:Forma de proceder: Declarar el cursor como si se tratara de una variableDeclarar el cursor como si se tratara de una variable Abrir el cursor con la instrucciAbrir el cursor con la instruccióónn OPENOPEN Leer cada fila conLeer cada fila con FETCHFETCH Cerrar el cursor y liberar los recursos con la instrucciCerrar el cursor y liberar los recursos con la instruccióónn CLOSECLOSE ¡¡No deben usarse si se pueden sustituir fNo deben usarse si se pueden sustituir fáácilmente porcilmente por unun selectselect!! Declarando CursoresDeclarando Cursores En un bloque anEn un bloque anóónimo:nimo: declaredeclare cursorcursor c_poemasc_poemas isis SELECTSELECT autor, poemaautor, poema FROMFROM poemas;poemas; beginbegin /* Sentencias del bloque ...*//* Sentencias del bloque ...*/ endend;; En un procedimiento: tras la cabeceraEn un procedimiento: tras la cabecera Tratando cursores (1)Tratando cursores (1) SET SERVEROUTPUT ONSET SERVEROUTPUT ON DECLAREDECLARE CURSORCURSOR cpaisescpaises ISIS SELECTSELECT CO_PAISCO_PAIS, DESCRIPCION, CONTINENTE, DESCRIPCION, CONTINENTE FROMFROM PAISES;PAISES; co_paisco_pais VARCHARVARCHAR(3);(3); descripciondescripcion VARCHARVARCHAR(50);(50); continentecontinente VARCHARVARCHAR(25);(25); BEGINBEGIN OPENOPEN cpaisescpaises;; FETCHFETCH cpaisescpaises INTOINTO co_pais,descripcion,continenteco_pais,descripcion,continente;; WHILEWHILE cpaises%cpaises%foundfound LOOPLOOP dbms_output.put_line(descripciondbms_output.put_line(descripcion);); FETCHFETCH cpaisescpaises INTOINTO co_pais,descripcion,continenteco_pais,descripcion,continente;; ENDEND LOOPLOOP;; CLOSECLOSE cpaisescpaises;; ENDEND;; Tratando cursores (2)Tratando cursores (2) DECLAREDECLARE CURSOR c_direcciones IS SELECT nombre, dirección FROM direcciones; el_nombreel_nombre direcciones.nombre%TYPEdirecciones.nombre%TYPE;; la_callela_calle direcciones.calle%TYPEdirecciones.calle%TYPE;; contador NUMBER(1);contador NUMBER(1); BEGINBEGIN OPENOPEN c_direccionesc_direcciones;; LOOPLOOP FETCHFETCH c_direccionesc_direcciones INTOINTO el_nombreel_nombre,, la_callela_calle;; EXIT WHENEXIT WHEN c_direcciones%NOTFOUNDc_direcciones%NOTFOUND;; DBMS_OUTPUT.PUT_LINE(DBMS_OUTPUT.PUT_LINE(‘‘NombreNombre: ' || nombre || ', Calle: ' || calle);: ' || nombre || ', Calle: ' || calle); END LOOP;END LOOP; CLOSECLOSE c_direccionesc_direcciones;; ENDEND;;
  • 6. 6 Tratando cursores (3)Tratando cursores (3) SET SERVEROUTPUT ONSET SERVEROUTPUT ON DECLAREDECLARE v_empnov_empno employees.employee_id%TYPEemployees.employee_id%TYPE;; v_enamev_ename employees.last_name%TYPEemployees.last_name%TYPE;; v_count_rowv_count_row NUMBER(3);NUMBER(3); CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; BEGINBEGIN SELECTSELECT COUNT(rownumCOUNT(rownum) INTO) INTO v_count_rowv_count_row FROMFROM employeesemployees;; OPENOPEN emp_cursoremp_cursor;; FOR i IN 1..FOR i IN 1..v_count_rowv_count_row LOOPLOOP FETCHFETCH emp_cursoremp_cursor INTOINTO v_empnov_empno,, v_enamev_ename;; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_empnoDBMS_OUTPUT.PUT_LINE(TO_CHAR(v_empno)||)||’’ ‘‘||v_ename||v_ename);); END LOOP;END LOOP; ENDEND;; Variables tipo cursorVariables tipo cursor Atributo Antes de abrir Al abrir Durante la recuperación Al finalizar la recuperación Después de cerrar %NOTFOUND ORA-1001 NULL FALSE TRUE ORA-1001 %FOUND ORA-1001 NULL TRUE FALSE ORA-1001 %ISOPEN FALSE TRUE TRUE TRUE FALSE %ROWCOUNT ORA-1001 0 Número de registros que ha recuperado hasta el momento Número de total de registros ORA-1001 CursoresCursores paramparaméétricostricos DECLAREDECLARE CURSORCURSOR cpaisescpaises ((p_continentep_continente VARCHARVARCHAR)) ISIS SELECTSELECT CO_PAISCO_PAIS, DESCRIPCION, CONTINENTE, DESCRIPCION, CONTINENTE FROMFROM PAISESPAISES WHEREWHERE CONTINENTE =CONTINENTE = p_continentep_continente;; registroregistro cpaises%cpaises%ROWTYPEROWTYPE;; BEGINBEGIN OPENOPEN cpaisescpaises('EUROPA');('EUROPA'); FETCHFETCH cpaisescpaises INTOINTO registro;registro; CLOSECLOSE cpaisescpaises;; ENDEND;; TriggersTriggers UnUn trigger es un procedimiento PL/SQL asociado con unaes un procedimiento PL/SQL asociado con una tabla de la base de datos de Oracle y que se "dispara"tabla de la base de datos de Oracle y que se "dispara" cada vez que se ejecuta sobre dicha tabla una sentenciacada vez que se ejecuta sobre dicha tabla una sentencia INSERTINSERT, una sentencia, una sentencia UPDATEUPDATE o una sentenciao una sentencia DELETEDELETE Algunas aplicaciones:Algunas aplicaciones: ParaPara grabargrabar logslogs Para asegurar que se mantienePara asegurar que se mantiene la coherencia del esquemala coherencia del esquema,, asociando a operaciones en una tabla operaciones en otrasasociando a operaciones en una tabla operaciones en otras tablas cuando los mecanismos de Oracle resultan insuficientestablas cuando los mecanismos de Oracle resultan insuficientes TriggersTriggers: caracter: caracteríísticassticas Pueden disparar otrosPueden disparar otros triggerstriggers Pueden llamar a otros procedimientosPueden llamar a otros procedimientos No tienen parNo tienen paráámetrosmetros No pueden ser llamados desde otrosNo pueden ser llamados desde otros procedimientosprocedimientos TriggersTriggers: ventajas: ventajas Seguridad: permiten restringir al acceso de las tablas a: permiten restringir al acceso de las tablas a nivel de detallenivel de detalle EficienciaEficiencia: El plan de ejecuci: El plan de ejecucióón de unn de un triggertrigger ssóólo selo se analiza una vez, utilizanaliza una vez, utilizáándose directamente a partir dendose directamente a partir de entoncesentonces Desventajas: no debe abusarse de ellos y su existencia: no debe abusarse de ellos y su existencia debe estar bien documentada; de otra forma ladebe estar bien documentada; de otra forma la utilizaciutilizacióón de la BBDD se vuelve difn de la BBDD se vuelve difíícil de entender.cil de entender.
  • 7. 7 TriggersTriggers: Tipos: Tipos Hay 2 tipos deHay 2 tipos de TriggersTriggers: los asociados a una: los asociados a una instrucciinstruccióón y los asociados a una filan y los asociados a una fila AA nivel de instrucción: se ejecuta despu: se ejecuta despuéés des de que una instruccique una instruccióónn insertinsert // deletedelete // updateupdate sese ha llevado a cabo conha llevado a cabo con ééxitoxito Asociado a una fila: Se puede ejecutar antes o: Se puede ejecutar antes o despudespuéés de la instruccis de la instruccióón y se llama por cada filan y se llama por cada fila afectadaafectada TriggersTriggers: sintaxis: sintaxis CREATECREATE OR REPLACE TRIGGER nombreOR REPLACE TRIGGER nombre--deldel--triggertrigger [FOLLOWS nombre[FOLLOWS nombre--otrootro--triggertrigger]] [BEFORE/AFTER][BEFORE/AFTER] [INSERT/DELETE/UPDATE/[INSERT/DELETE/UPDATE/UPDATEUPDATE OF listaOF lista-- columnas]columnas] ONON nombrenombre--tablatabla [REFERENCING [OLD AS nombre[REFERENCING [OLD AS nombre--antiguo][NEW ASantiguo][NEW AS nombrenombre--nuevo]]nuevo]] [FOR EACH ROW/FOR EACH STATEMENT][FOR EACH ROW/FOR EACH STATEMENT] [WHEN {condiciones}][WHEN {condiciones}] {Bloque est{Bloque estáándar de sentencias PL/SQL... BEGIN,ndar de sentencias PL/SQL... BEGIN, EXCEPTION}EXCEPTION} TriggersTriggers: sintaxis: sintaxis FollowsFollows: a partir de la versi: a partir de la versióón 11g; permite establecer unn 11g; permite establecer un orden entre variosorden entre varios triggerstriggers asociados a la mismaasociados a la misma operacioperacióón: eln: el triggertrigger declarado seguirdeclarado seguiráá al que se indicaal que se indica WhenWhen: condici: condicióón para que se ejecute eln para que se ejecute el triggertrigger enen disparadores a nivel de filadisparadores a nivel de fila Diferencia entreDiferencia entre UpdateUpdate yy UpdateUpdate OfOf ListaColumnasListaColumnas: el: el primero al hacer unprimero al hacer un updateupdate, el segundo s, el segundo sóólo si selo si se modifican las columnas indicadasmodifican las columnas indicadas TriggersTriggers: ejemplo: ejemplo CREATE TRIGGERCREATE TRIGGER CompruebaEdadCompruebaEdad BeforeBefore INSERT OR UPDATE OF edad ON PersonaINSERT OR UPDATE OF edad ON Persona FOR EACH ROWFOR EACH ROW BEGINBEGIN IF (:IF (:new.edadnew.edad < 0) THEN< 0) THEN RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERROR((--20000,20000, ‘‘edad no vedad no váálida');lida'); END IF;END IF; END;END; No se llega a insertar ningNo se llega a insertar ningúún daton dato TriggersTriggers: orden de ejecuci: orden de ejecucióónn Este es el orden de ejecuciEste es el orden de ejecucióón de una instruccin de una instruccióón DML:n DML: 1. Ejecutar, si existe, el disparador de tipo BEFORE1. Ejecutar, si existe, el disparador de tipo BEFORE (disparador previo) con nivel de instrucci(disparador previo) con nivel de instruccióónn 2. Para cada fila a la que afecte la orden:2. Para cada fila a la que afecte la orden: a. Ejecutar, si existe, el disparador de tipo BEFORE cona. Ejecutar, si existe, el disparador de tipo BEFORE con nivel de fila.nivel de fila. b. Ejecutar la propia orden.b. Ejecutar la propia orden. c. Ejecutar, si existe, el disparador de tipo AFTERc. Ejecutar, si existe, el disparador de tipo AFTER (disparador posterior) con nivel de fila.(disparador posterior) con nivel de fila. 3. Ejecutar, si existe, el disparador de tipo AFTER con3. Ejecutar, si existe, el disparador de tipo AFTER con nivel de instruccinivel de instruccióónn TriggersTriggers:: oldold yy newnew Pseudo registros con los valores antiguos yPseudo registros con los valores antiguos y nuevos de la filanuevos de la fila No definido; aNo definido; a nullnullValores de la filaValores de la fila antes de borrarseantes de borrarse DeleteDelete Nuevos valores de laNuevos valores de la filafila Valores de fila antesValores de fila antes de la actualizacide la actualizacióónn UpdateUpdate Valores a insertarValores a insertarNo definido; aNo definido; a nullnullInsertInsert ::newnew::oldoldOperaciOperacióónn
  • 8. 8 TriggersTriggers: tabla mutando: tabla mutando…… Es habitual ver el siguiente error durante laEs habitual ver el siguiente error durante la ejecuciejecucióón de unn de un triggertrigger:: ORA-04091: table <tablename> is mutating, trigger/function may not see it Ocurre cuando un disparado a nivel de filasOcurre cuando un disparado a nivel de filas accede a la misma tabla en la que se basa y laaccede a la misma tabla en la que se basa y la operacioperacióón no es unn no es un insertinsert de una sola filade una sola fila Tabla mutando: EjemploTabla mutando: Ejemplo createcreate tabletable t (col1t (col1 numbernumber, col2, col2 varcharvarchar(30));(30)); create or replace trigger t_trg before insert or update or delete on t for each row declare i integer; begin select count(*) into i from t; --más cosas … end; insertinsert intointo tt valuesvalues (1,(1, ‘‘prueba');prueba'); 11 rowrow createdcreated.. updateupdate t set col1 = 2;t set col1 = 2; update t * ERROR at line 1: ORA-04091: table SYSTEM.T is mutating, trigger/function may not see it ORA-06512: at "SYSTEM.T_TRG", line 4 ORA-04088: error during execution of trigger 'SYSTEM.T_TRG' TriggersTriggers: distinguir la operaci: distinguir la operacióónn En lugar de variosEn lugar de varios triggerstriggers para varias operaciones espara varias operaciones es buena idea crear uno y distinguir casos:buena idea crear uno y distinguir casos: CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER nombre_triggernombre_trigger BEFOREBEFORE INSERT OR UPDATE OR DELETE ONINSERT OR UPDATE OR DELETE ON nombre_tablanombre_tabla FOR EACH ROWFOR EACH ROW BEGINBEGIN IF INSERTING THEN...IF INSERTING THEN... ----dodo whateverwhatever END IF;END IF; IF UPDATING THEN ...IF UPDATING THEN ... ----dodo somethingsomething elseelse END IF;END IF; IF DELETING THEN ...IF DELETING THEN ... ----dodo somethingsomething elseelse END IF;END IF; END;END; TriggersTriggers: gesti: gestióónn TriggersTriggers existentes:existentes: select trigger_name from user_triggers; Detalles de unDetalles de un triggertrigger:: select trigger_type, triggering_event, table_name, referencing_names, trigger_body from user_triggers where trigger_name = '<trigger_name>'; Borrar un trigger: drop trigger '<trigger_name>’; En lugar de borrarlo un trigger puede desactivarse: alter trigger <trigger_name> {disable|enable}; TriggersTriggers: tambi: tambiéén para DDLn para DDL Ejemplo:Ejemplo: CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER drop_triggerdrop_trigger BEFORE DROP ONBEFORE DROP ON bertoldo.SCHEMAbertoldo.SCHEMA BEGINBEGIN RAISE_APPLICATION_ERRORRAISE_APPLICATION_ERROR (( numnum =>=> --20000,20000, msgmsg =>=> ‘‘No se puede hacerNo se puede hacer dropdrop'); END;'); END; No permite borrar ninguna fila aNo permite borrar ninguna fila a bertoldobertoldo TriggersTriggers: tambi: tambiéén para el sistema (I)n para el sistema (I) Ejemplo: queremos llevar unEjemplo: queremos llevar un loglog de los usuarios que sede los usuarios que se han conectado en esta tabla:han conectado en esta tabla: CREATE TABLECREATE TABLE session_infosession_info (( usernameusername VARCHAR2(30),VARCHAR2(30), logon_datelogon_date DATE,DATE, session_idsession_id VARCHAR2(30),VARCHAR2(30), ip_addrip_addr VARCHAR2(30),VARCHAR2(30), hostnamehostname VARCHAR2(30),VARCHAR2(30), auth_typeauth_type VARCHAR2(30));VARCHAR2(30));
  • 9. 9 TriggersTriggers: tambi: tambiéén para el sistema (II)n para el sistema (II) CREATE OR REPLACE TRIGGERCREATE OR REPLACE TRIGGER trg_session_infotrg_session_info BEFORE LOGOFF ON DATABASEBEFORE LOGOFF ON DATABASE DECLAREDECLARE session_idsession_id VARCHAR2(30);VARCHAR2(30); ip_addrip_addr VARCHAR2(30);VARCHAR2(30); hostnamehostname VARCHAR2(30);VARCHAR2(30); auth_typeauth_type VARCHAR2(30);VARCHAR2(30); BEGINBEGIN SELECTSELECT sys_contextsys_context ('USERENV', 'SESSIONID') INTO('USERENV', 'SESSIONID') INTO session_idsession_id FROM dual;FROM dual; SELECTSELECT sys_contextsys_context ('USERENV', '('USERENV', 'IP_ADDRESSIP_ADDRESS') INTO') INTO ip_addrip_addr FROM dual;FROM dual; SELECTSELECT sys_contextsys_context ('USERENV', 'HOST') INTO('USERENV', 'HOST') INTO hostnamehostname FROM dual;FROM dual; SELECTSELECT sys_contextsys_context ('USERENV', '('USERENV', 'AUTHENTICATION_TYPEAUTHENTICATION_TYPE')') INTOINTO auth_typeauth_type FROM dual;FROM dual; INSERT INTOINSERT INTO session_infosession_info VALUES (VALUES (useruser,, sysdatesysdate,, session_idsession_id,, ip_addrip_addr,, hostnamehostname,, auth_typeauth_type);); END; /END; / FuncionesFunciones úútiles en SQL de Oracletiles en SQL de Oracle (I)(I) Función Descripción String Functions upper(s), lower(s) convert string s to upper/lower-case initcap(s) capitalise first letter of each word ltrim(s), rtrim(s) remove blank char. from left/right substr(s,start,len) sub-string of length len from position start length(s) length of s FuncionesFunciones úútiles en SQL de Oracletiles en SQL de Oracle (II)(II) Date Functions sysdate current date (on Oracle server) to_date(date, format) date formatting Number Functions round(x) round real number x to integer mod(n,p) n modulus p abs(x) absolute value of x dbms_random.random() generate a random integer FuncionesFunciones úútiles en SQL de Oracletiles en SQL de Oracle (III)(III) Type Conversion Functions to_char() convert to string to_date() convert to date to_number() convert to number Miscellaneous Functions user current Oracle user