sábado, 16 de junio de 2012

select object_type, object_name --esta consulta nos indica que procedimiento hemos creado
from user_objects
  where object_type='PROCEDURE' or
    object_type='FUNCTION';
   
    --Para eliminar un procedimiento/funcion
    drop procedure <procedure_name>;
    drop function <function_name>;

--------------------------------------------------------------------------------------------------------------------------create or replace function validaCliente (pNumCliente varchar2) ---Esta funcion sirve para validar al cliente
  return boolean
    is
        vNumCliente Cliente.numCliente%TYPE;
      begin
         select numCliente into vNumCliente
         from Cliente
         where numCliente=pNumCliente;
         return TRUE;
      Exception
         When no_data_found then
         return FALSE;
         end;

--------------------------------------------------------------------------------

Procedimiento verCliente

create table CLIENTE (
NUMCLIENTE CHAR(4) not null,
NOMBRE CHAR(30),
APELLIDO CHAR(30),
DIRECCION CHAR(35),
TELEFONO CHAR(10),
TIPOPREF CHAR(25),
MAXRENT FLOAT,
constraint PK_CLIENTE primary key (NUMCLIENTE)
);
  begin
insert into cliente values('CR76','Jhon','Kay','56 High ST,Londonn,SW14EH','0207774563','Departamento',450);
insert into cliente values('CR56','Aline','Stewart','64 Fern Dr, Glasgow G42 OBL','0141324182','Departamento',350);
insert into cliente values('CR74','Mike','Ritchie','63 Well St, Glasgow,G42','0141943742','Casa',750);
insert into cliente values('CR62','Mary','Tregear','12 Park PI, Glasgow, G40QR','0141225742','Departamento',600);
insert into cliente values('CR78','Juan','Kayser','55 High ST,Londonn,SW14EH','0207774564','Departamento',450);
insert into cliente values('CR57','Alicia','Soto','63 Fern Dr,. GlasgowG42 OBL','0141324183','Departamento',350);
insert into cliente values('CR72','Miguel','Torres','62 Well St, Glasgow,G42','0141943740','Casa',750);
insert into cliente values('CR63','Maria','Perez','13 Park PI, Glasgow,G4 0QR','0141225741','Departamento',600);
  end;
set serveroutput on
create or replace procedure verCliente (pNumCliente varchar2) is
 vNumCliente Cliente.numCliente%Type;
 vNombre Cliente.nombre%TYPE;
 vApellido Cliente.apellido%TYPE;
 begin
       select numCliente, nombre, apellido
       into vNumCliente, vNombre, vApellido
     from Cliente
   where numCliente = pNumCliente;
   DBMS_OUTPUT.PUT_LINE('NumCliente :' ||vNumCliente||'Nombre :'||trim(vNombre)||' Apellido : '||vApellido);
 Exception
    WHEN NO_DATA_FOUND THEN
     DBMS_OUTPUT.PUT_LINE('No hemos encontrado al Cliente' || pNumCliente);
  end;  
   
    --Para invocar un procedimiento basta nombrarlo indicando los parametros requeridos
    SET SERVEROUTPUT ON
    begin
       verCliente('CR78');
     end;
    
     show errors;
http://orahelp.blogspot.com/2007/07/dream-home-completo.html

miércoles, 13 de junio de 2012

set serveroutput on
Create Table Cliente( --Creacion de la tabla cliente
 NumCliente varchar2(4) not null,
 Nombre varchar2(30) ,
 Apellido varchar2(30),
 Direccion varchar2(35),
 Telefono varchar2(15) ,
 TipoPref varchar2(25) ,
 MaxRent Float,
 Constraint PK_CLIENTE PRIMARY KEY (NumCliente)
 );

 --Ahora insertamos registros

 begin
 insert into cliente values('CR78' , 'Juan' , 'Kayser', 'Alameda Numero 23' , '9898765' , 'Dpto' , '100000');
 insert into cliente values('CR79' , 'Miguel' , 'Sepulveda', 'Mar de Drake N°69' , '69696969' , 'Casa' , '1000000');
 insert into cliente values('CR80' , 'Gerald Mauricio' , 'Caris', 'Bellavista N° 23' , '98765432' , 'Dpto' , '900000');
 insert into cliente values('CR81' , 'Enrique' , 'Mimó', 'San Ramon N°314' , '99999999' , 'Parcela' , '1000000');
 END;

 select *from Cliente; --Con este select se ve los ingresos a la Tabla Cliente

 ---Procedimiento Ver Cliente

 Create or Replace Procedure verCliente (pNumCliente varchar2)IS
   vNumCliente Cliente.numCliente%TYPE;
   vNombre Cliente.nombre%TYPE;
   vApellido Cliente.apellido%TYPE;
   BEGIN
     select numCliente, nombre, apellido
     into vNumCliente, vNombre, vApellido
     from Cliente
      where numCliente=pNumCliente;
      DBMS_OUTPUt.PUT_LINE('NumCliente : ' ||vNumCliente || ' Nombre : ' ||trim(vNombre) || ' Apellido : ' ||vApellido);
      Exception
         When no_data_found then
            DBMS_OUTPUT.PUT_LINE( ' NO SE ENCUENTRA EL CLIENTE ' || pNumCliente );
            END;
           
 ----EL PROCEDIMIENTO verCliente me compilo, pero me arroja un Warning....
 show errors;
 --Para invocar a un procedimiento:

 begin
    verCliente('CR79');
    END;
   
    show errors;

martes, 12 de junio de 2012

INICIALIZACION DEL PAQUETE

El paquete se instancia la primera vez que se llama a uno de los subprogramas en el empaquetados, lo que significa que el paquete se lee de disco y se lleva a memoria, y se ejecuta el codigo compilado del subprograma al que se llama. En esta situacion se asigna memoria para todas las variables definidas en el paquete. Cada sesion tendra su propia copia de las variables empaquetadas, asegurando que dos sesiones que ejecuten subprogramas contenidos en el mismo paquete utilicen ubicaciones de memoria diferentes.

   En ocaciones, es conveniente ejecutar un codigo de inicializacion la primera vez que se instancia el paquete, lo que puede hacerse añadiendo una seccion de inicializacion en el cuerpo del paquete, despues de todos los demas objetos.

     CREATE [OR REPLACE] PACKAGE BODY<NOMBRE_PAQUETE>IS
      .............................................................................................................................

      BEGIN
               --Codigo de Inicializacion
     END[<NOMBRE_PAQUETE>];

SOBRECARGA DE SUBPROGRAMAS EMPAQUETEADOS

Los procedimientos y funciones dentro de un paquete pueden sobrecargarse, lo que significa que puede haber mas de un procedimiento o una funcion con el mismo nombre, pero con diferenetes parametros. La sobrecarga esta permitida para distinto numero de parametros, o bien, para distinto tipo de familia de dato. No esta permitida para diferentes tipos retornados por una funcion, ni para distintos modos de recepcion de los parametros (IN, OUT, IN OUT).

PAQUETES

Un Paquete es una estructura PL/SQL que permite almacenar juntos varios objetos relacionados entre si. Un Paquete tiene dos partes separadas:
   La especificacion y el cuerpo.
                                                     Cada una de ellas se almacena independientemente en el diccionario de datos.

    Un Paquete es fundamentalmente una seccion delarativa. Cualquier codigo que pueda incluirse en la parte declarativa de un bloque puede incluirse en un paquete, incluidos procedimientos, funciones, cursores y variables.

    Los Paquetes no pueden ser llamados o pasados como parametros.

    La especificacion del paquete incluye informacion acerca de contenido del paquete. Sin embargo no contiene codigo para ninguno de los procedimientos.


                 CREATE [OR REPLACE] PACKAGE<NOMBRE_PAQUETE>IS
                 --Especificaciones de procedimientos
                 --Especificaciones de funciones
                 --Declaraciones de variables
                 --Declaraciones de Excepciones
                 --Declaraciones de Cursores
                   END[<NOMBRE_PAQUETE>];

 El Cuerpo del Paquete es un Objeto independiente de la cabezera del paquete en el diccionario de datos. El Cuerpo del paquete no puede compilarse hasta que la cabecera del paquete se haya compilado correctamente. El cuerpo contiene el codigo correspondiente a las declaraciones formales de los subprogramas que aparecen en la cabecera del paquete.

              CREATE[OR REPLACE] PACKAGE BODY<NOMBRE_PAQUETE>IS
                  --Declaraciones de los subprogramas
             END[<NOMBRE_PAQUETE>];

Cualquier objeto que se declare en la cabecera del paquete, se encuentra dentro de ambito  y es visible desde fuera del paquete, siempre que el objeto se distinga precediendole con el nombre del paquete donde se encuentra definido.

lunes, 11 de junio de 2012

EXCEPCIONES

Si ocurre en error dentro de un subprograma, se genera una excepcion. Si el procedimiento no tiene control de excepcion, o bien, se genera la rutina de tratamiento de excepciones, se pasa inmediatamente el control al entorno que efectuo la llamada, segun la propagacion de excepciones. Sin embargo, los valores de los parametros formales con modo OUT y modo IN OUT no se devuelven a los parametros reales.

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE RaiseError(
p_Raise IN BOOLEAN, p_ParameterA OUT NUMBER) AS
  BEGIN
     p_ParameterA:=7;
     IF p_Raise THEN
        RAISE DUP_VAL_ON_INDEX;
        END IF;
        END RaiseError;
Debido al funcionamiento de los modos de parametros, todo parmetro real que se corresponda con un parametro OUT o IN OUT debe ser una variable, y no podra ser una constante o una expresion. Debe de existir una ubicacion para almacenar el valor que se devuelve
SET SERVEROUTPUT ON
DECLARE
  V NUMBER :=5;
  BEGIN
      DBMS_OUTPUT.PUT_LINE(FACTORIAL(V));
      END;

FUNCION FACTORIAL

---La siguiente funcion, calcula el valor factorial a partir de un numero recibido--

CREATE OR REPLACE FUNCTION FACTORIAL(N IN NUMBER) RETURN NUMBER IS
  BEGIN
      IF N<0 THEN
                               RETURN NULL;
   END IF;
                      IF N=0 OR N=1 THEN
                      RETURN 1;
           ELSE
                   RETURN N*FACTORIAL(N-1);
           END IF;
                        END;

   SELECT FACTORIAL(4) FROM DUAL;
--------------------Este procedimiento ilustra diferentes modos de parametros y asignaciones de parametros-----

CREATE OR REPLACE PROCEDURE TEST(
p_In IN NUMBER,
p_Out OUT NUMBER,
p_InOut IN OUT NUMBER) IS

v_LocalVariable NUMBER := 0;
  begin
           DBMS_OUTPUT.PUT_LINE('AL PRINCIPIO DE Test:');
         IF(p_In IS NULL)THEN
           DBMS_OUTPUT.PUT_LINE('p_In is NULL');
        ELSE
                 DBMS_OUTPUT.PUT_LINE('p_in' || '   = ' || p_In);
     END IF;
    END;
MODOS DE LOS PARAMETROS:

IN:  El valor del parametro real se pasa al procedimiento cuando se produce el llamado al mismo. Dentro del procedimiento, el parametro formal se comporta como una constante(SOLO LECTURA). Cuando el procedimiento finaliza y devuelve el control al entorno en el que se produjo la llamada, el parametro real no se modifica.

OUT: Se ignora cualquer valor que el parametro real pueda tener cuando se produzca la llamada al procedimiento. Dentro del procedimiento, el parametro formal se comporta como una variable sin inicializar, por lo que contiene el valor NULL . Puede leerse dicha variable y en escribirse. Cuando el Procedimiento finaliza y devuelve el control al entorno en el que se produjo la llamada, se asigna el valor del parametro formal al parametro real.

IN OUT:  Este metodo es una combinacion de los modos IN y OUT. El valor del parametro real se pasa al procedimiento cuando se produce la llamada. Dentro del procedimiento, el parametro formal se comporta como una variable inicializada, pudiendose leer y escribir en ella.  Cuando el procedimiento finaliza y devuelve el control al entorno en el que se produjo la llamada, los contenidos del parametro formal se asignan al parametro real.

domingo, 10 de junio de 2012

BORRAR FUNCIONES

BORRAR FUNCIONES:

                                             EL COMANDO DROP FUNCION Elimins la funcion indicada.

   DROP FUNCTION <NOMBRE FUNCION>
CREATE OR REPLACE FUNCTION MULTIPLICAR(N1 NUMBER, N2 NUMBER) RETURN NUMBER IS
TOT NUMBER
                            BEGIN
                                       TOT:= N1*N2;
                                        RETURN TOT;
                                        END;
                     
La llamada a una FUNCION debe ser parte de una instruccion SQL. Asi, una manera de ejecutar la funcion MULTIPLICAR podria ser:

    SELECT MULTIPLICAR(3,5) FROM DUAL;

FUNCIONES

FUNCIONES:  Las Funciones son similares a los procedimientos. La diferencia es que las funciones al menos deben regresar un valor.

   CREAR FUNCIONES:

          CREATE [OR REPLACE] FUNCTION<NOMBRE_FUNCION>
          [(<PARAMETRO_1>[IN | OUT | IN OUT]<TIPO_1>

                  ..............................................................

<PARAMETRO_N> [IN |OUT | IN OUT] <TIPO_N>]
  RETURN <TIPO_RETORNO> IS
   <CUERPO_FUNCION>

  Donde <CUERPO_FUNCION> es un bloque PL/SQL que contiene el codigo para la funcion, y dentro de este debe estar la instruccion RETURN. Toda FUNCION ha de devolver un  valor, lo cual implica utilizar la INSTRUCCION RETURN seguida del valor que devuelve.

Borrar Procedimientos

Borrar Procedimientos:
                                           El comando DROP PROCEDURE elimina el procedimiento indicado.

    DROP PROCEDURE <NOMBRE_PROCEDIMIENTO>
CREATE OR REPLACE PROCEDURE VISUALIZAR(TEXTO IN VARCHAR2) IS
  BEGIN
            DBMS_OUTPUT.PUT_LINE(TEXTO);
 END;


  BEGIN
            VISUALIZAR('BOTILLERIA EL PELAO');
            VISUALIZAR('DUEÑO: MIGUEL SEPULVEDA');
END;
create or replace procedure saludo is
   begin
           dbms_output.put_line( ' Botilleria El Pelao ');
  end;


Para ejecutar este Procedimiento desde la linea de comando se usa ña instruccion:

begin
    saludo;
end;

PROCEDIMIENTOS

Procedimientos: Un procedimiento es un bloque PL/SQL al que se le asigna un nombre. Un procedimiento se crea para que realice una determinada tarea de gestion.

   Los ´procedimientos son compilados y almacenados en la base de datos. Gracias a ello se consigue una reutilizacion eficiente del codigo, ya que se puede invocar al procedimiento las veces que haga falta desde otro codigo o desde una herramienta de desarrollo como SQL DEVOLPER. Una vez almacenados pueden ser modificados denuevo.

  Crear Procedimiento:

  CREATE [OR REPLACE] PROCEDURE <NOMBRE_PROCEDIMIENTO>
     [(<PARAMETRO_1>[IN |OUT| IN OUT]<TIPO_1>

 ............................................................................................................................
<PARAMETRO_N[IN |OUT|IN OUT]<TIPO_N)] IS

<CUERPO_PROCEDIMIENTO>

La opcion REPLACE  hace que si ya existe un procedimiento con ese nombre, se reemplaza el anterior con el que se crea ahora. Los Parametros son la lista de variables que necesita el procedimiento para realizar su tarea, se indica el tipo de los mismos, pero no su tamaño (VARCHAR2 Y NO VARCHAR2(50)).

   En los Parametros, el modo pueden ser las palabras IN, OUT o IN OUT.
  
La palabra DECLARE  no se utiliza, la seccion de declaraciones figura tras las palabras IS o AS.

<CUERPO PROCEDIMIENTO> es un bloque PL/SQL que contiene el codigo para el procedimiento.p