Bases de Datos



                    Unidad


          El Lenguaje PL/SQL
          (Procedimientos y Excepciones)




             2011   Erwin Fischer          2
Subprogramas
Funciones y Procedimientos almacenados

Los subprogramas son Bloques PL/SQL nominados que
pueden tomar parámetros y ser invocados a voluntad por
el programador. PL/SQL tiene dos tipos de subprogramas,
denominados funciones y procedimientos (almacenados)

Tanto las funciones y los procedimientos admiten un
conjunto de parámetros que serán especificados por el
programa que realice la invocación, y llevan a cabo un
conjunto de acciones

Ambos pueden modificar los datos pasados como
parámetros, la diferencia entre ambos es que la función
siempre retorna un único valor, mientras que un
procedimiento no.

                      2011   Erwin Fischer                3
Create Procedure

CREATE [OR REPLACE] PROCEDURE procedure_name
      [ (parameter [,parameter]) ]

 IS | AS
     [declaration_section]
 BEGIN
     executable_section
 [EXCEPTION
     exception_section]
 END [function_name];




                 2011   Erwin Fischer          4
Subprogramas
Funciones y Procedimientos almacenados

Los parámetros tienen un nombre distintivo
y un tipo de datos, pero también pueden
especificarse como:

IN       El parámetro se utiliza únicamente como
         entrada

OUT      El parámetro se utiliza únicamente como
         valor de salida

IN OUT   El parámetro se utiliza en ambos
         sentidos.
                     2011   Erwin Fischer          5
Variables de sustitución



 • En Los bloques PL/SQL se pueden
   utilizar variables de sustitución, que
   nos pedirán datos por pantalla antes de
   ejecutar el bloque.

 • Esta variable tienen que ir antepuesta
   del & para que funcionen.



                2011   Erwin Fischer         6
Bloque que nos pide el Id de un
empleado y nos muestra su nombre



DECLARE
   Vnombre Cliente.nombre%TYPE;
BEGIN
 select nombre into Vnombre
  from Cliente
 where numCliente = '&VnumCliente’;
    DBMS_OUTPUT.PUT_LINE (Vnombre);
 END;

               2011   Erwin Fischer   7
Crear un procedimiento



 • Diseñe un procedimiento, que
   reciba como parámetro el numero
   de cliente y muestre por consola,
   el numero, el nombre y el apellido.
 • En caso que no lo encuentre que
   indique un mensaje



               2011   Erwin Fischer      8
Preparando los datos



• Para cargar la tabla Cliente, puede
  usar el script que se encuentra en
  orahelp.blogspot.com bajo la
  entrada Dream home completo

  http://orahelp.blogspot.com/2007/07/dre
  am-home-completo.html


               2011   Erwin Fischer         9
Creando la tabla Cliente
 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)
 );




                2011   Erwin Fischer   10
Insertando Registros


begin
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




                      2011   Erwin Fischer                   11
Procedimiento verCliente
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;

                         2011   Erwin Fischer                     12
Llamada a un Procedimiento



 • Para invocar un
   procedimiento, basta nombrarlo
   indicando los parámetros
   requeridos:

   begin
      verCliente('CR78');
   end
              2011   Erwin Fischer   13
Para descubrir qué procedimientos y
funciones ha creado


 Utilice la siguiente consulta de SQL:

     select object_type, object_name
     from user_objects
     where object_type = 'PROCEDURE' or
      object_type = 'FUNCTION';

 Para eliminar un procedimiento/función:

     drop procedure <procedure_name>;
     drop function <function_name>;


                        2011   Erwin Fischer   14
Diseño Procedimiento

  • Diseñe un Procedimiento que
    ingrese los datos de una visita a
    una propiedad, esto es ingresar los
    datos a la tabla visita:




• Cada uno de los atributos de la tabla, deben ser
  pasados al procedimiento como parámetros, y se
  debe validar que exista el cliente y la propiedad.

                     2011   Erwin Fischer              15
Consulta



 • ¿Cómo verificamos que un cliente
   existe, en la tabla Cliente?




              2011   Erwin Fischer    16
Primero creamos función que
valida que el cliente exista
 CREATE OR REPLACE Function validaCliente (pNumCliente
    VARCHAR2)
 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;



                     2011   Erwin Fischer                17
Unidad - PL/SQL




        • Fin




            2011   Erwin Fischer   18

Procedimientos y excepciones

  • 1.
    Bases de Datos Unidad El Lenguaje PL/SQL (Procedimientos y Excepciones) 2011 Erwin Fischer 2
  • 2.
    Subprogramas Funciones y Procedimientosalmacenados Los subprogramas son Bloques PL/SQL nominados que pueden tomar parámetros y ser invocados a voluntad por el programador. PL/SQL tiene dos tipos de subprogramas, denominados funciones y procedimientos (almacenados) Tanto las funciones y los procedimientos admiten un conjunto de parámetros que serán especificados por el programa que realice la invocación, y llevan a cabo un conjunto de acciones Ambos pueden modificar los datos pasados como parámetros, la diferencia entre ambos es que la función siempre retorna un único valor, mientras que un procedimiento no. 2011 Erwin Fischer 3
  • 3.
    Create Procedure CREATE [ORREPLACE] PROCEDURE procedure_name [ (parameter [,parameter]) ] IS | AS [declaration_section] BEGIN executable_section [EXCEPTION exception_section] END [function_name]; 2011 Erwin Fischer 4
  • 4.
    Subprogramas Funciones y Procedimientosalmacenados Los parámetros tienen un nombre distintivo y un tipo de datos, pero también pueden especificarse como: IN El parámetro se utiliza únicamente como entrada OUT El parámetro se utiliza únicamente como valor de salida IN OUT El parámetro se utiliza en ambos sentidos. 2011 Erwin Fischer 5
  • 5.
    Variables de sustitución • En Los bloques PL/SQL se pueden utilizar variables de sustitución, que nos pedirán datos por pantalla antes de ejecutar el bloque. • Esta variable tienen que ir antepuesta del & para que funcionen. 2011 Erwin Fischer 6
  • 6.
    Bloque que nospide el Id de un empleado y nos muestra su nombre DECLARE Vnombre Cliente.nombre%TYPE; BEGIN select nombre into Vnombre from Cliente where numCliente = '&VnumCliente’; DBMS_OUTPUT.PUT_LINE (Vnombre); END; 2011 Erwin Fischer 7
  • 7.
    Crear un procedimiento • Diseñe un procedimiento, que reciba como parámetro el numero de cliente y muestre por consola, el numero, el nombre y el apellido. • En caso que no lo encuentre que indique un mensaje 2011 Erwin Fischer 8
  • 8.
    Preparando los datos •Para cargar la tabla Cliente, puede usar el script que se encuentra en orahelp.blogspot.com bajo la entrada Dream home completo http://orahelp.blogspot.com/2007/07/dre am-home-completo.html 2011 Erwin Fischer 9
  • 9.
    Creando la tablaCliente 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) ); 2011 Erwin Fischer 10
  • 10.
    Insertando Registros begin insert intocliente 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 2011 Erwin Fischer 11
  • 11.
    Procedimiento verCliente CREATE ORREPLACE 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; 2011 Erwin Fischer 12
  • 12.
    Llamada a unProcedimiento • Para invocar un procedimiento, basta nombrarlo indicando los parámetros requeridos: begin verCliente('CR78'); end 2011 Erwin Fischer 13
  • 13.
    Para descubrir quéprocedimientos y funciones ha creado Utilice la siguiente consulta de SQL: select object_type, object_name from user_objects where object_type = 'PROCEDURE' or object_type = 'FUNCTION'; Para eliminar un procedimiento/función: drop procedure <procedure_name>; drop function <function_name>; 2011 Erwin Fischer 14
  • 14.
    Diseño Procedimiento • Diseñe un Procedimiento que ingrese los datos de una visita a una propiedad, esto es ingresar los datos a la tabla visita: • Cada uno de los atributos de la tabla, deben ser pasados al procedimiento como parámetros, y se debe validar que exista el cliente y la propiedad. 2011 Erwin Fischer 15
  • 15.
    Consulta • ¿Cómoverificamos que un cliente existe, en la tabla Cliente? 2011 Erwin Fischer 16
  • 16.
    Primero creamos funciónque valida que el cliente exista CREATE OR REPLACE Function validaCliente (pNumCliente VARCHAR2) 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; 2011 Erwin Fischer 17
  • 17.
    Unidad - PL/SQL • Fin 2011 Erwin Fischer 18