Sei sulla pagina 1di 12

RESUMEN DE CONTENIDOS PL/SQL PL/SQL es el lenguaje de programacin que proporciona Oracle para extender el SQL estndar con otro

tipo de instrucciones amplindolo con los elementos caractersticos de un lenguaje de programacin. Tipos de datos Este lenguaje dispone de los mismos tipos de datos que podemos encontrar en SQL, pero adems se han incorporado algunos nuevos: TIPO CARACTERISTICAS OBSERVACIONES VARCHAR2 Cadena de caracteres longitud variable Cadena de caracteres longitud variable de Entre 1 y 4000 bytes como mximo.. Como mximo admite hasta 2 GB (2000 MB). Este tipo de de datos est obsoleto, en su lugar se utilizan los datos de tipo LOB. El almacenamiento depende de la adm de bd y Admite hasta 8 terabytes (8000 GB).

LONG

Permiten almacenar y manipular LOB (BLOG, bloques grandes de datos no CLOB, estructurados (tales como texto, NCLOB, imgenes, videos, sonidos, etc) BFILE) en formato binario o de carcter NUMBER TIMESTAMP XMLType

Almacena nmeros fijos y en Se admiten hasta 38 dgitos punto flotante de precisin. Almacena datos de tipo hora, fraccionando los segundos Se asocia a un esquema Tipo de datos abstracto. En XML para la definicin de su realidad se trata de un CLOB. estructura.

Adems es importante sealar que el programador puede definir sus propios tipos de datos a partir de los ya definidos. Uso de los atributos %TYPE y %ROWTYPE %TYPE: declara una variable del mismo tipo que otra, o que una columna de una tabla. %ROWTYPE : crea una variable registro cuyos campos se corresponden con las columnas de una tabla o vista. Por ejemplo si tenemos una variable definida previamente llamada cantidad podemos definir otra de la siguiente forma: total cantidad%TYPE; De esta forma la variable total tendr las mismas caractersticas que la variable cantidad. datos vehiculo%ROWTYPE; De esta forma datos toma la forma de vehiculo.

Constantes Cmo en la mayora de los lenguajes, en este tambin podemos declaras constantes, de la siguiente forma: <nombreVariable> CONSTANT <tipo> := <valor>; Operadores
Asignacin Lgicos := AND OR NOT Is null = != <> < > <= >= between...and like in y sus correspondientes negaciones + - * / **

Concatenacin ||

Comparacin

Aritmticos

Bloques annimos Los bloques Annimos son rutinas creadas en pl/sql que estn caracterizados porque no tienen nombre y se suelen crear y ejecutar en un ambiente de PL/SQL. Todo bloque se inicia con un BEGIN y en el caso de utilizar variables o constantes, usara la sentencia DECLARE entes del inicio, y termina con un end; Un ejemplo muy sencillo de bloque seria el que nos muestra en pantalla un nombre.: BEGIN DBMS_OUTPUT.PUT_LINE('nombre'); END; Adems en los bloques PL/SQL se pueden utilizar lo que llamamos variables de sustitucin, que nos pedirn datos por pantalla antes de ejecutar el bloque. Estas variables tienen que ir antepuestas del & para que funcionen.

Procedimientos y funciones PL/SQL Los procedimientos y funciones quedan almacenados en la base de datos a diferencia de los bloques annimos que se almacenaban en el buffer. Los Procedimientos: Se trata del programa ms utilizado en PL/SQL y su formato es el siguiente: PROCEDURE <nombre_procedimiento> [<declaraciones>] BEGIN <instrucciones>; [EXCEPTIONS <excepciones>;] END; [(<lista de parmetros>)] IS

En el formato distinguimos dos partes claramente, la cabecera donde est el nombre del procedimiento y los parmetros y el cuerpo donde se encuentra un bloque annimo. Pasamos a escribir un procedimiento que nos muestre los datos de un usuario:
CREATE OR REPLACE PROCEDURE ver_usuario(nomusu VARCHAR2) IS Nrut VARCHAR2(10); Ndomi VARCHAR2(10); BEGIN select rut, domicilio into Nrut,Ndomi from usuario where nombre=nomusu; DBMS_OUTPUT.PUT_LINE('Nombre:'||nomusu|| 'RUT:' ||Nrut|| 'Domicilio' ||Ndomi); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No hemos encontrado al usuario || nomusu); END;

Al tener almacenado el procedimiento en la base de datos, este puede ser llamado por cualquier usuario que tenga los permisos oportunos. Para invocar al procedimiento que hemos creado antes tendramos ejecutar la siguiente orden: EXECUTE ver_usuario('Luis'); Pero tambin lo podemos hacer desde un bloque PL/SQL de la siguiente forma: BEGIN ver_usuario('Luis'); END; Como en cualquier lenguaje, podemos agregar comentarios a nuestros procedimientos de la siguiente forma: - - para comentar en una sola linea /* <comentario>*/ para varias lineas.

Las Funciones: Son muy similares a los procedimiento con la diferencia que stas siempre devolvern un valor. Las funciones permiten manipular distintos tipos de datos como distancias, latitudes, etc. Adems de hacer uso de vnculos a bases de datos dentro de un sistema distribuido. La estructura es la siguiente:
CREATE [OR REPLACE] FUNCTION NombreFuncion [(parmetros)] RETURN tipo IS [parte declarativa] BEGIN instrucciones RETURN <valor o expresin>; [EXCEPTION excepciones] END;

La clusula RETURN de la cabecera nos especifica el tipo de valor que nos va a devolver la funcin. Un ejemplo de Funcin sera:
create or replace function nombre(id number) return varchar2 is result varchar2(20); begin select nombre_a||' '||apellido_a into result from alumnos where id_alumno=id; return(result); exception when no_data_found then return ' '; end;

En esta funcin podemos a travs de un id de un alumno obtener su nombre completo. Para usar esta funcin lo podemos hacer desde un bloque o directamente desde una consulta.
select nombre(id_alumno),valor from nota

Otro caso: create or replace function aumenta(va number, id number) return number is
res number; begin update vehiculo set valor_hora=valor_hora+va where id_vehiculo=id; select valor_hora into res from vehiculo where id_vehiculo=id; return res; end;

Este caso permite actualizar un valor a partir de un id y retorna el nuevo valor. Para ejecutarlo:
declare res number; begin res:=aumenta(100,1); dbms_output.put_line('El nuevo valor es : '||res); end;

NOTA: esta funcin no podr ejecutarse desde un select (select aumenta(100,1) from vehiculo) debido a que se est ejecutando un DML (update) dentro de un select.

Parmetros Todos los subprogramas utilizan parmetros para pasar y recibir informacin. Podemos hacer el paso de parmetros de un tipo a otro. Generalmente si los tipos son compatibles PL/SQL lo hace automticamente. En cualquier caso, podemos hacerlo de forma manual utilizando las siguientes notaciones: Posicional: el compilador asocia los parmetros actuales a los formales, basndose en su posicin. Nominal: el smbolo => despus del parmetro actual y antes del nombre del formal, indica al compilador correspondencia. Para que esto quede ms claro pasamos a escribir un ejemplo de paso de parmetros y conversin de tipos. Tenemos la especificacin de un procedimiento como esta: create table persona (nombre varchar2(30), edad number, pais varchar2(20)) Creamos un procedimiento con tres parmetros y uso de elemento default create or replace procedure ingreso_persona(name varchar2, age number, country varchar2 default 'Chile') is begin insert into persona values(name,age,country); end; begin ingreso_persona('juan',33,'Espaa'); end; (llamado posicional) llamado nominal con uso de elemento default begin ingreso_persona(age=>44, name=>'j'); end; llamado posicional con uso de elemento default begin ingreso_persona('LUIS',23); end; llamado nominal begin ingreso_persona(country=>Per, age=>24, name=>'Milton'); end;

Cursores explcitos Los cursores explcitos los utilizamos cuando tenemos consultas que nos devuelven ms de una fila. Tenemos 4 operaciones bsicas para trabajar con un cursor explcito. 1. Declaracin del cursor: lo tenemos que declarar en la zona de declaraciones, con el siguiente formato: CURSOR <nombrecursor> IS <sentencia SELECT>; 2. Apertura del cursor: Deber colocarse en la zona de instrucciones, con el siguiente formato: OPEN <nombrecursor>; Al hacerlo se ejecuta automticamente la sentencia select y sus resultados se almacenan en las estructuras internas de memoria manejadas por el cursor. 3. Recogida de informacin: Para recuperar la informacin anteriormente guardada en las estructuras de memoria interna tenemos que usar el siguiente formato: FETCH <nombrecursor> INTO {<variable> | <listavariables>}; Si tenemos una nica variable que recoge los datos de todas las columnas, el formato de la variable seria el siguiente: <variable> <nombrecursor>%ROWTYPE; Si tenemos una lista de variables, cada una recoger la columna correspondiente de la clusula select, por lo que sern del mismo tipo que las columnas. 4. Cierre del cursor: CLOSE <nombrecursor>; Ahora, veamos un ejemplo de utilizacin de cursores explcitos:
DECLARE CURSOR C1 IS SELECT nombre, apellido FROM arbitro; Vnom VARCHAR2(12); Vape VARCHAR2(20); BEGIN OPEN C1; LOOP FETCH C1 INTO Vnom, Vape; EXIT WHEN C1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(Vnom || '' || Vapen); END LOOP; CLOSE C1; END;

Si nos fijamos, en la declaracin de los cursores explcitos no utilizamos la clusula INTO, que s se usa en los cursores implcitos. Atributos del cursor Para conocer detalles de la situacin del cursor tenemos algunos atributos: %FOUND: devuelve verdadero si el ltimo FETCH ha recuperado algn valor. %ROWCOUNT: nos devuelve el nmero de filas recuperadas hasta el momento.

Excepciones en Oracle Las excepciones, presentes en la mayora de los lenguajes de programacin, sirven para tratar errores en tiempo de ejecucin, definiendo qu se debe hacer frente a errores en sentencias definidas por el usuario. Cuando se produce un error PL/SQL levanta una excepcin y pasa el control a la seccin excepcin correspondiente al bloque PL/SQL. El formato sera el siguiente:
BEGIN ...... EXCEPTION WHEN <nombre_excepcin> THEN <instrucciones>; ...... [WHEN OTHERS THEN <instrucciones>;] END;

Excepciones predefinidas Son aquellas que se disparan automticamente al producirse determinados errores. Estas son las ms comunes: too_many_rows: Se produce cuando select into devuelve ms de una fila. no_data_found: se produce cuando un select . into no devuelve ninguna fila. login_denied: error cuando intentamos conectarnos a Oracle con un login y clave no validos. value_error: se produce cuando hay un error aritmtico o de conversin. zero_divide: se puede cuando hay una divisin entre 0. dupval_on_index: se crea cuando se intenta almacenar un valor que creara duplicados en la clave primaria o en una columna con restriccin UNIQUE. Debemos tener claro que la definicin de estas excepciones se desarrolla en la seccin que le corresponde, es decir, las EXCEPTION. Otras excepciones Existen otros errores internos de Oracle que no tienen asignada una excepcin, sino un cdigo de error y un mensaje, a los que se accede mediante funciones SQLCODE y SQLERRM. Cuando se produce un error de estos se trasfiere directamente el control a la seccin EXCEPTION donde se tratara el error en la clausula WHEN OTHERS de la siguiente forma: WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error'||SQLCODE||SQLERRM.)

Utilizacin de RAISE_APPLICATION_ERROR En el paquete DBMS_STANDARD se incluye un procedimiento llamado RAISE_APPLICATION_ERROR que nos sirve para levantar errores y definir mensajes de error. Su formato es el siguiente: RAISE_APPLICATION_ERROR(numero_error,mensaje_error); Es importante saber que el nmero de error est comprendido entre -20000 y 20999 y el mensaje es una cadena de caracteres de hasta 512 bytes. Este procedimiento crea una excepcin que solo puede ser tratada en WHEN OTHERS. Ejemplo:
CREATE or REPLACE PROCEDURE subir_horas (emple NUMBER, horas_subir NUMBER) IS horas_actuales NUMBER; BEGIN Select horas into horas_actuales from empleados where id_empleado=emple; if horas_actuales is NULL then RAISE_APPLICATION_ERROR(-20010,'No tiene horas'); else update empleados set horas=horas_actuales + horas_subir where id_empleado=emple; end if; End subir_horas;

En Resumen, la sentencia RAISE_APPLICATION_ERROR, interrumpir la ejecucin normal del sub programa al igual que lo hara una exception.

TRIGGERS EN ORACLE Un trigger es un bloque de cdigo PL/SQL que se almacenan en la base de datos, estn asociados a una tabla y se ejecutan automticamente cuando se producen ciertos eventos asociados a la tabla. Se suelen utilizar para prevenir transacciones errneas y nos sirven tambin para implementar restricciones de integridad o seguridad. Un disparador define una accin que la base de datos debe llevar a cabo cuando se produce algn suceso relacionado con la misma. Para crear un disparador (trigger) en una tabla, el usuario con el que accedamos a Oracle deber ser propietario de la misma, teniendo as el privilegio ALTER para la tabla ALTER ANY TABLE. Adems, dicho usuario, debe disponer del privilegio CREATE TRIGGER. Existen varios tipos de disparadores, dependiendo del tipo de transaccin de disparo y el nivel en el que se ejecuta el disparador (trigger): 1.- Disparadores de nivel de fila (row): se ejecutan una vez para cada fila afectada por una instruccin DML. Los disparadores de nivel de fila se crean utilizando la clusula for each row en el comando create trigger. 2.- Disparadores de nivel de instruccin (statement): se ejecutan una vez para cada intruccin DML. Por ejemplo, si una nica intruccin INSERT inserta 500 filas en una tabla un disparador de nivel de instruccin para dicha tabla slo se ejecutar una vez. Los disparadores de nivel de instruccin son el tipo predeterminado que se crea con el comando create trigger. 3.- Disparadores Before y After: puesto que los disparadores son ejecutados por sucesos, puede establecerse que se produzcan inmediatamente antes (before) o despus (after) de dichos sucesos. 4.- Disparadores Instead Of: puede utilizar INSTEAD OF para indicar a Oracle lo que tiene que hacer en lugar de realizar las acciones que invoca el disparador, es decir, se ejecutar en lugar de la accin que deton al trigger . Por ejemplo, podra usar un disparador INSTEAD OF en una vista para gestionar las inserciones en una tabla o para actualizar mltiples tablas que son parte de una vista. Un ejemplo de trigger de sustitucin sera el siguiente:
create or replace trigger actuavista2 instead of update on vista2 for each row begin update productos set marca=:new.marca where id_proveedor=:new.id_proveedor; update proveedores set nombre=:new.nombre; end;

5.- Disparadores de esquema: puede crear disparadores sobre operaciones en el nivel de esquema tales como create table, alter table, drop table, audit, rename, truncate y revoke. Puede incluso crear disparadores para impedir que los usuarios eliminen sus propias tablas. En su mayor parte, los disparadores de nivel de esquema proporcionan dos capacidades: impedir operaciones DDL y proporcionar una seguridad adicional que controle las operaciones DDL cuando estas se producen. 6.- Disparadores en nivel de base de datos o sistema: puede crear disparadores que se activen al producirse sucesos de la base de datos, incluyendo errores, inicios de sesin, conexiones y desconexiones. Puede utilizar este tipo de disparador para automatizar el mantenimiento de la base de datos o las acciones de auditora. La siguiente es una tabla que indica el Evento, el momento en que se dispara con su explicacin:
Evento STARTUP SHUTDOWN LOGON LOGOFF Momento AFTER BEFORE AFTER BEFORE BEFORE AFTER BEFORE AFTER BEFORE AFTER BEFORE AFTER BEFORE AFTER BEFORE AFTER BEFORE AFTER | | | | | | Se disparan: Despus de arrancar la instancia Antes de apagar la istancia Despus de que el usuario se conecte a la base de datos. Antes de la desconexin de un usuario Cuando ocurre un error en el servidor Antes o despus de crear un objeto en el esquema Antes o despus de borrar un objeto en el esquema Antes o despus de cambiar un objeto en el esquema Antes o despus de ejecutar un comando trncate Antes o despus de ejecutar un comando grant Antes o despus de ejecutar un comando revoke

SERVERERROR AFTER CREATE DROP ALTER TRUNCATE GRANT REVOKE DLL

| Antes o despus de ejecutar cualquier comando de definicin de datos

Oracle tiene algunas funciones que permiten acceder a los atributos del evento del disparo ORA_YSEVENT, ORA_LOGIN, etc. Estas funciones pueden usarse en la clausula WHEN o en el cuerpo del disparador. Un ejemplo seria un trigger que nos guarda los datos de un usuario al hacer logon en la base de datos:
create table control (usuario varchar2(30), momento varchar2(50), evento varchar2(30)) create or replace trigger tri_control after logon on database begin insert into control (usuario, momento, evento) values (ORA_LOGIN_USER, SYSTIMESTAMP, ORA_SYSEVENT); end;

Otro Ejemplo: LA TABLA:


CREATE TABLE "SYS"."AUDIT_TABLE" ("D" DATE, "OSUSER" VARCHAR2(255) ,"CURRENT_USER" VARCHAR2(255), "HOST" VARCHAR2(255), "TERMINAL" VARCHAR2(255), "OWNER" VARCHAR2(30), "TYPE" VARCHAR2(30), "NAME" VARCHAR2(30), "SYSEVENT" VARCHAR2(30)) EL TRIGGER CREATE OR REPLACE TRIGGER "SYS"."AUDIT_DDL_TRG" AFTER DDL ON DATABASE begin insert into audit_table(d,osuser,current_user,host,terminal,owner,type,name,sysevent) values(sysdate,sys_context('USERENV','OS_USER'),sys_context('USERENV','CU RRENT_USER'),sys_context('USERENV','HOST'), sys_context('USERENV','TERMINAL') , ora_dict_obj_owner, ora_dict_obj_type, ora_dict_obj_name, ora_sysevent); end;

PACKAGE Los paquetes en Oracle se utilizan para guardar subprogramas y otros objetos de la base de datos, donde estos no sean dependientes directos de tablas (vistas, triggers). Por su forma un Package permite contener objetos lo que indica que por si mismo no es un objeto, por esta razn, no recibe parmetros ni es cargado en memoria cada vez que se llama, pero si es importante mencionar que su contenido puede ser usado por otras aplicaciones. Un paquete consta de los siguientes elementos: Especificacin o cabecera: contiene las declaraciones pblicas (es decir, accesibles desde cualquier parte de la aplicacin) de sus programas, tipos, constantes, variables, cursores, excepciones, etc. Cuerpo: contiene los detalles de implementacin y declaraciones privadas, es decir, accesibles solamente desde los objetos del paquete. La sintaxis de la cabecera es la siguiente:
create [or replace] package nombre_paquete as <declaraciones pblicas> <especificaciones de subprogramas> end nombre_paquete; La sintaxis del cuerpo sera la siguiente: create [or replace] package body nombre_paquete as <declaraciones privadas> <cdigo de subprogramas> [begin <instrucciones iniciales>] end nombre_paquete;

Potrebbero piacerti anche