Sei sulla pagina 1di 4

Procedimientos almacenados

Un procedimiento almacenado es un conjunto de instrucciones en PL/SQL, que pueden ser llamados usando el nombre que se le haya asignado. La sintaxis para crear un procedimiento es la siguiente:
CREATE [OR REPLACE] PROCEDURE name [(param [IN|OUT|IN OUT|] datatype) . . .] [IS|AS] pl/sql_subprogram

El uso de OR REPLACE permite sobreescribir un procedimiento existente. Si se omite, y el procedimiento ya existe, se producir un error. Los modificadores IN, OUT, IN OUT indican si el parmetro es de entrada, salida o ambos. A continuacin se presenta un ejemplo de creacin de un procedimiento:
CREATE PROCEDURE credit (acc_no IN NUMBER, amount IN NUMBER) IS BEGIN UPDATE accounts SET balance = balance + amount WHEREaccount_id = acc_no; END;

Este procedimiento actualizar la(s) tupla(s) con nmero de cuenta igual al parmetro acc_no con un incremento de amount en el balance de dicha cuenta. Si se desea eliminar (borrar) un procedimiento almacenado, se usa la instruccin: DROP PROCEDUREname;
Estructura General CREATE [OR REPLACE] PROCEDUREnombre_procedimiento ([parametros]) IS [zona de declaraciones] BEGIN [zona de ejecucin] EXCEPTION [zona de excepciones] ENDnombre_procedimiento;

Como podemos ver, el procedimiento est dividido en diferentes secciones:

Parmetros: en Oracle, podemos declarar parmetros de diferentes tipos (NUMBER, VARCHAR2, etc) y estos pueden ser de entrada (IN), salida (OUT) o incluso de entrada y salida (INOUT).

IN: Se utiliza como un parmetro de entrada para el procedimiento almacenado. No se puede cambiar la informacin de este parmetro dentro del procedimiento. OUT: Se utiliza como parmetro de salida en el procedimiento almacenado. Se puede cambiar la informacin de este parmetro dentro del procedimiento. INOUT: Se utiliza como parmetro de entrada y de salida. Se puede cambiar la informacin de este parmetro dentro del procedimiento.

Zona de declaraciones: utilizaremos esta seccin del procedimiento para declarar las variables que necesitemos utilizar en el procedimiento. Zona de ejecucin: en esta seccin va la lgica del procedimiento, es decir, la parte de la aplicacin que se ejecutar. Zona de excepciones: se utiliza para el tratamiento de excepciones del procedimiento

http://www.nosolounix.com/2010/12/crear-procedimiento-almacenado-oracle.html Ejemplo: 1. Crear el procedimiento para sumar dos nmeros Crear el procedimiento CREATE OR REPLACE PROCEDURE ope_basicas(var1 IN number,var2 IN number, r1 OUT number,r2 OUT number,r3 OUT number,r4 OUT number) AS BEGIN r1:= var1 + var2; r2:= var1 - var2; r3:= var1 * var2; r4:= var1 / var2; END; Ejecutar el procedimiento DECLARE suma number; resta number; multi number; divi number; BEGIN ope_basicas(4,2,suma,resta,multi,divi); dbms_output.put_line ('La suma es '|| suma); dbms_output.put_line ('La resta es '|| resta); dbms_output.put_line ('La multi es '|| multi); dbms_output.put_line ('La divi es '|| divi); END;

2. Desplegar el nombre del cliente y el pas de procedencia. Crear procedimiento Ejecutar el Procedimiento DECLARE xnom varchar2(30); xp varchar2(30); BEGIN obtdatoscliente(123,xnom,xp); dbms_output.put_line(' IdCliente: 123'); dbms_output.put_line(' Nombre: '||xnom); dbms_output.put_line(' Nacionalidad: '||xp); END SALIDA
Nombre: Nacionalidad: ANDRES MEXICO

3. Crear el procedimiento obtdatos2(122,.), que devuelve el nombre del cliente, la habitacin que ocupa y el tiempo de estada. SOLUCION Lo nico complicado llegara a ser la cantidad de das de estadia pero esto se resuelve con lo siguiente Select floor(sysdate-h.fechaingreso) From habitacin h Ahora unimos esto en el procedimiento para obtener el nombre de cliente, y la habitacin que ocupa. Crear procedimiento create or replace procedure obtdatos2(xidcliente IN number,xnombre OUT varchar2,xidhabitacion OUT number, tiempo OUT NUMBER) IS begin select c.nombre,h.idhabitacion,floor(sysdate-h.fechaingreso) into xnombre, xidhabitacion, tiempo from habita h, cliente c where h.idcliente = xidcliente and h.idcliente=c.idcliente ; end; Ejecutar el Procedimiento declare xnombre varchar2(30); xidhabitacion number; tiempo number; begin obtdatos2(122,xnombre ,xidhabitacion ,tiempo); dbms_output.put_line('NOMBRE :'||xnombre); dbms_output.put_line('HABITACION :'||xidhabitacion ); dbms_output.put_line('TIEMPO : '||tiempo); end;

SALIDA
IdCliente: Nombre Cliente: Habitacin: Tiempo de Estada: 122 JHOVANA 203 23

4. Crear el procedimiento obtdatos3(1,), que devuelve el nombre del servicio y el tiempo de total de consumo por servicio. Crear procedimiento create or replace PROCEDURE obtdatos3(xidservicio in number, xdescripcion out varchar2, tiempo out number) IS begin select sum(h.tiempo)into tiempo from hab_ser h, servicio s where h.idservicio=s.idservicio and xidservicio=h.idservicio group by h.idservicio; select descripcion into xdescripcion from servicio where idservicio=xidservicio; end; Ejecutar el Procedimiento declare xdescripcion varchar2(30); tiempo number; begin obtdatos3(1,xdescripcion ,tiempo); dbms_output.put_line('SERVICIO :'||1); dbms_output.put_line('DESCRPCION:'||xdescripcion ); dbms_output.put_line('TIEMPO :'||tiempo); end; SALIDA
IdServicio : Descripcion : Tiempo en horas : 1 INTERNET 16