SlideShare una empresa de Scribd logo
1 de 29
Descargar para leer sin conexión
Bases de Datos



                   Unidad



          El Lenguaje PL/SQL




            2011   Erwin Fischer   2
PL/SQL

 • Es una extensión procedimental de SQL
   diseñada por Oracle
 • Se basa en conceptos similares a los lenguajes
   de programación modernos. (declaracion de
   variables y constantes, estructuras de control, manejo
   de excepciones y modularización).
 • Es un lenguaje con estructura de bloques: Los
   bloques pueden ser completamente
   independientes o estar anidados uno dentro de
   otros
 • Las unidades básicas son : Procedimientos,
   funciones y bloques anonimos.

                       2011   Erwin Fischer                 3
Estructura general de un bloque
PL/SQL

  [DECLARE                                     Opcional
     - declaraciones]

  BEGIN                                        Obligatorio
     - instrucciones ejecutables

  [EXCEPTION                             Opcional
     - rutinas de manejo de excepciones]

  END;                                         Obligatorio




                        2011   Erwin Fischer                 4
Declaraciones en PL/SQL

 • Las variables y constantes deben declararse antes de
   poder referenciarlas.
 • Ej:
    – vNumEmpleado              VARCHAR2(5);
    – vRenta                    NUMBER(6,2) NOT NULL := 600;
    – MAX_PROPIEDADES           CONSTANT NUMBER := 100

 • Es posible declarar variables de acuerdo al tipo de
   otras variables
     • vNumEmpleado Empleado.numEmpleado%TYPE;
     • vNumEmpleado1 vNumEmpleado%TYPE;
     • beerTuple Beers%ROWTYPE;


                      2011   Erwin Fischer                     5
Asignaciones en PL/SQL

 • Se pueden asignar variables de dos formas
   distintas: Utilizando (:=) o como resultado de
   una instrucción SELECT o FETCH
 • Ej:
   – vNumEmpleado := ‘SG14’;
   – vRenta := 500;

   – SELECT COUNT(*) INTO                  X
     FROM Propiedad
     WHERE numEmpleado = vNumEmpleado;


                    2011   Erwin Fischer            6
Un programa Simple en PL/SQL
 drop table T1; // Se elimina la tabla en caso que exista, si no existe da un error, pero no importa
 CREATE TABLE T1(
  e INTEGER,
  f INTEGER
 );
 Begin
  DELETE FROM T1;
  INSERT INTO T1 VALUES(1, 3);
  INSERT INTO T1 VALUES(2, 4);
 End

 select * from t1
 /* Lo de arriba es SQL; debajo es el programa PL/SQL */
 DECLARE
    a NUMBER;
    b NUMBER;
 BEGIN
    SELECT e,f INTO a,b
    FROM T1
    WHERE e>1;// Este select asigna el atributo     e->a y f->b, de todos aquellos registros cuyo atributo e > 1

    INSERT INTO T1 VALUES(b,a);
 END;



                                          2011   Erwin Fischer                                                     7
Veamos que ocurre 1



 • Se crea la tabla t1 y se insertan
   dos registros.




               2011   Erwin Fischer    8
El procedimiento anónimo

             select * from t1

   DECLARE
      a NUMBER;
      b NUMBER;
   BEGIN
      SELECT e,f INTO a,b
      FROM T1
      WHERE e>1
      INSERT INTO T1 VALUES(b,a);
   END;

               select * from t1


                  2011   Erwin Fischer   9
¿Qué ocurre si ejecuto nuevamente el
procedimiento anónimo?
• Escribir en el Blog, una explicación
  a lo que ocurre al ejecutar
  nuevamente el procedimiento:
                          DECLARE
                             a NUMBER;
select * from t1
                             b NUMBER;
                          BEGIN
                             SELECT e,f INTO a,b
                             FROM T1
                             WHERE e>1
                             INSERT INTO T1 VALUES(b,a);
                          END;

                   2011   Erwin Fischer                    10
Instrucciones de Control en
PL/SQL

 • PL/SQL soporta los mecanismos
   habituales de control de flujo condicional,
   iterativo y secuencial

 •   IF-THEN-ELSE-END IF;
 •   LOOP-EXIT WHEN-END LOOP;
 •   FOR-END LOOP;
 •   WHILE-END LOOP;
 •   GOTO;
                  2011   Erwin Fischer           11
Instrucción IF
 Syntax #1: IF-THEN
 IF condition THEN
             {...statements...}
    END IF;

 Syntax #2: IF-THEN-ELSE
 IF condition THEN
             {...statements...}
    ELSE
             {...statements...}
    END IF;

 Syntax #3: IF-THEN-ELSIF
 IF condition THEN
             {...statements...}
    ELSIF condition THEN
             {...statements...}
    ELSE
             {...statements...}
    END IF;




                             2011   Erwin Fischer   12
Un programa Simple en PL/SQL

 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;
                 2011   Erwin Fischer       13
¿Qué hace este
Procedimiento anónimo?
select * from t1

 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;


                    2011   Erwin Fischer    14
Instrucción Loop


 LOOP
      {.statements.}
 END LOOP;
 Ejemplo

   LOOP
          monthly_value := daily_value * 31;
          EXIT WHEN monthly_value > 4000;
   END LOOP;


                  2011   Erwin Fischer         15
Un programa Simple en PL/SQL

 DECLARE
       i NUMBER := 1;
 BEGIN
       LOOP
             INSERT INTO T1 VALUES(i,i);
             i := i+1;
             EXIT WHEN i>100;
       END LOOP;
 END;



                  2011   Erwin Fischer     16
El ciclo FOR



 FOR loop_counter IN [REVERSE]
  lowest_number..highest_number
 LOOP
       {.statements.}
 END LOOP;




               2011   Erwin Fischer   17
Ejemplos de Ciclo FOR


 FOR Lcntr IN 1..20                FOR Lcntr IN REVERSE 1..15
 LOOP                              LOOP
      LCalc := Lcntr * 31;              LCalc := Lcntr * 31;
 END LOOP;                         END LOOP;




                     2011   Erwin Fischer                       18
El Ciclo While



 WHILE condition
 LOOP
       {.statements.}
 END LOOP;




             2011   Erwin Fischer   19
Ejemplo de ciclo While


 WHILE monthly_value <= 4000
 LOOP
     monthly_value := daily_value * 31;
 END LOOP;




              2011   Erwin Fischer        20
Cursores




2011   Erwin Fischer   21
Cursores

 • La instrucción SELECT puede utilizarse si la consulta
   devuelve una fila y solo una fila.
 • Los cursores se utilizan para el tratamiento de una
   consulta que pueda devolver un numero arbitrario de
   filas (es decir cero, una o más filas)
 • En la practica el cursor actúa como un puntero que
   dirige hacia una fila concreta el resultado de la
   consulta.
 • El cursor puede avanzar una posición para acceder a la
   siguiente fila.
 • Es necesario declarar y abrir los
   cursores antes de utilizarlos

                     2011   Erwin Fischer                   22
Cursores, un Ejemplo

1. DECLARE
2.   vIdEmpleado employees.employee_id%TYPE;
3.   vNombre      employees.first_name%TYPE;
4.   vApellido    employees.last_name%TYPE;
5.   CURSOR ListaEmpleadoCursor IS
6.   SELECT employee_id, first_name, last_name FROM employees FOR UPDATE;
7.   BEGIN
8.    OPEN ListaEmpleadoCursor;
9.      LOOP
10.      FETCH ListaEmpleadoCursor INTO vIdEmpleado, vNombre, vApellido;
11.      EXIT WHEN ListaEmpleadoCursor%NOTFOUND;
12.      dbms_output.put_line ('Id : '||vIdEmpleado
13.                          ||' Nombre : '|| vNombre
14.                          || 'Apellido : '|| vApellido);
15.     END LOOP;
16.     CLOSE ListaEmpleadoCursor;
17. END;



                            2011   Erwin Fischer                            23
Un cursor dentro de otro
cursor - obtieneTablas


 • Un cursor que lista todas las tablas
   con sus respectivas columnas,
   correspondiente al propietario HR




               2011   Erwin Fischer       24
Tablas all_tables y all_tab_columns


 select distinct tablas.owner, tablas.table_name
     from all_tables tablas
     where tablas.owner = 'HR';



 select distinct col.column_name
     from all_tab_columns col
     where upper(col.owner) = 'HR'
     and lower(col.table_name) = 'employees';




                   2011   Erwin Fischer            25
Declarando las Variables y
los cursores

   DECLARE
    vPropietario             varchar2(40);
    vNombreTabla             varchar2(40);
    vNombreColumna           varchar2(100);

    /* Primer cursor */
    cursor obtieneTablas is
    select distinct t.owner, t.table_name
    from all_tables t
    where t.owner = 'HR';

    /* Segundo cursor */
    cursor obtieneColumnas is
    select distinct c.column_name
    from all_tab_columns c
    where c.owner = vPropietario
    and c.table_name = vNombreTabla;



                             2011   Erwin Fischer   26
El cuerpo del cursor
begin
   open obtieneTablas;
   dbms_output.put_line('Abriendo Cursor - obtieneTablas');
   loop fetch obtieneTablas into vPropietario, vNombreTabla;
       exit when obtieneTablas%NOTFOUND;
       dbms_output.put_line('Tabla : ‘||Propietario||'.'||vNombreTabla);
       open obtieneColumnas;
       loop fetch obtieneColumnas into vNombreColumna;
         exit when obtieneColumnas%NOTFOUND;
         dbms_output.put_line(‘=>’||vNombreTabla||'.'||vNombreColumna);
       end loop;
       close obtieneColumnas;
   end loop;
   close obtieneTablas;
   EXCEPTION
   WHEN OTHERS THEN
   raise_application_error(-20001,'Se ha detectado un error -
   '||SQLCODE||' -ERROR- '||SQLERRM);
end;
                           2011   Erwin Fischer                       27
Paso de Parámetros en Cursores

CURSOR obtieneTablas(pPropietario VARCHAR2) IS
   select distinct t.owner, t.table_name
   from all_tables t
   where t.owner = pPropietario;

Con lo que podríamos abrir el cursor

OPEN obtieneTablas (´HR’);
OPEN obtieneTablas(´SYSTEM’);

Actividad : Modifique el cursor aplicando paso de parámetros, y
  publique en su blog.



                          2011   Erwin Fischer                    28
Tarea Cursor ParImpar
 • Agregue un atributo a la tabla EMPLOYEES,
   denominado TipoId, que va a contener un
   string.
 • Desarrolle un cursor que permita completar
   dicho atributo de acuerdo al siguiente criterio:

       SI employee_id es Par
         Entonces
              TipoId = ‘PAR’
       Si-no
              TipoId = ‘IMPAR’
 • Suba la solución a su Blog HOY.

 •                   2011   Erwin Fischer             29
Unidad - PL/SQL




        • Fin




            2011   Erwin Fischer   30

Más contenido relacionado

La actualidad más candente

10. aplicaciones de las pilas
10. aplicaciones de las pilas10. aplicaciones de las pilas
10. aplicaciones de las pilas
Andreita Enriquez
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
Omarzingm
 
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Maztherprozh
 
Estructura de instrucciones de control...
Estructura de instrucciones de control...Estructura de instrucciones de control...
Estructura de instrucciones de control...
Susana Moyolema
 

La actualidad más candente (19)

PL SQL Diplomado Oracle
PL SQL Diplomado OraclePL SQL Diplomado Oracle
PL SQL Diplomado Oracle
 
Introduccion clips
Introduccion clipsIntroduccion clips
Introduccion clips
 
Pl
PlPl
Pl
 
10. aplicaciones de las pilas
10. aplicaciones de las pilas10. aplicaciones de las pilas
10. aplicaciones de las pilas
 
Curso Básico de Pl Sql Oracle
Curso Básico de Pl Sql OracleCurso Básico de Pl Sql Oracle
Curso Básico de Pl Sql Oracle
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
 
Cap I Plsql
Cap I PlsqlCap I Plsql
Cap I Plsql
 
Guia 5 3 2015 c2
Guia 5 3 2015 c2Guia 5 3 2015 c2
Guia 5 3 2015 c2
 
Listasde Acceso
Listasde AccesoListasde Acceso
Listasde Acceso
 
instrucciónes basicas para c++
instrucciónes basicas para c++instrucciónes basicas para c++
instrucciónes basicas para c++
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 
Estructuradatospilasycolas 121106170754-phpapp02
Estructuradatospilasycolas 121106170754-phpapp02Estructuradatospilasycolas 121106170754-phpapp02
Estructuradatospilasycolas 121106170754-phpapp02
 
Funciones en C++
Funciones en C++Funciones en C++
Funciones en C++
 
Operadores
OperadoresOperadores
Operadores
 
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
Estructurabsicadeunprogramaendevc 140605195118-phpapp02(2)
 
Componentes en bloques del procesador
Componentes en bloques del procesadorComponentes en bloques del procesador
Componentes en bloques del procesador
 
Pila dinamica y pila estatica
Pila dinamica y pila estaticaPila dinamica y pila estatica
Pila dinamica y pila estatica
 
Guia flip flop
Guia flip flopGuia flip flop
Guia flip flop
 
Estructura de instrucciones de control...
Estructura de instrucciones de control...Estructura de instrucciones de control...
Estructura de instrucciones de control...
 

Similar a Sql

Lenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de ControlLenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de Control
Karina Arguedas Ruelas
 
Organizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamientoOrganizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamiento
José Luis Olivares
 
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
Andrei Hortúa
 
Semana 5 y 6 cursores implícitos y explícitos
Semana 5 y 6 cursores implícitos y explícitosSemana 5 y 6 cursores implícitos y explícitos
Semana 5 y 6 cursores implícitos y explícitos
victdiazm
 
Estructuras control java-
Estructuras control java-Estructuras control java-
Estructuras control java-
SENA
 

Similar a Sql (20)

Pl
PlPl
Pl
 
Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScript
 
Lenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de ControlLenguaje Borland C - Estructuras de Control
Lenguaje Borland C - Estructuras de Control
 
Turbo c++ 3.0
Turbo c++ 3.0Turbo c++ 3.0
Turbo c++ 3.0
 
Lecc01
Lecc01Lecc01
Lecc01
 
Procedimientos y excepciones
Procedimientos y excepcionesProcedimientos y excepciones
Procedimientos y excepciones
 
Assembler
AssemblerAssembler
Assembler
 
Organizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamientoOrganizacion-de-la-unidad-central-de-procesamiento
Organizacion-de-la-unidad-central-de-procesamiento
 
Estructura de instrucciones de control
Estructura de instrucciones de controlEstructura de instrucciones de control
Estructura de instrucciones de control
 
Apunte plsql
Apunte plsqlApunte plsql
Apunte plsql
 
PLSQL y paquetes
PLSQL y paquetesPLSQL y paquetes
PLSQL y paquetes
 
PLC-II EMERSON EDUARDO RODRIGUES ENGENHEIRO.pdf
PLC-II EMERSON EDUARDO RODRIGUES ENGENHEIRO.pdfPLC-II EMERSON EDUARDO RODRIGUES ENGENHEIRO.pdf
PLC-II EMERSON EDUARDO RODRIGUES ENGENHEIRO.pdf
 
Teoria
TeoriaTeoria
Teoria
 
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
 
Pl Sql
Pl SqlPl Sql
Pl Sql
 
1 clase de Ps /sql
    1  clase  de  Ps /sql     1  clase  de  Ps /sql
1 clase de Ps /sql
 
Semana 5 y 6 cursores implícitos y explícitos
Semana 5 y 6 cursores implícitos y explícitosSemana 5 y 6 cursores implícitos y explícitos
Semana 5 y 6 cursores implícitos y explícitos
 
Estructuras control java-
Estructuras control java-Estructuras control java-
Estructuras control java-
 
71946780 manual-pl-sql-espanol
71946780 manual-pl-sql-espanol71946780 manual-pl-sql-espanol
71946780 manual-pl-sql-espanol
 
Funciones
FuncionesFunciones
Funciones
 

Último

informe-de-laboratorio-metodos-de-separacion-de-mezclas.pdf
informe-de-laboratorio-metodos-de-separacion-de-mezclas.pdfinforme-de-laboratorio-metodos-de-separacion-de-mezclas.pdf
informe-de-laboratorio-metodos-de-separacion-de-mezclas.pdf
AndreaTurell
 

Último (20)

Presentación de la propuesta de clase.pdf
Presentación de la propuesta de clase.pdfPresentación de la propuesta de clase.pdf
Presentación de la propuesta de clase.pdf
 
Power Point E. S.: Los dos testigos.pptx
Power Point E. S.: Los dos testigos.pptxPower Point E. S.: Los dos testigos.pptx
Power Point E. S.: Los dos testigos.pptx
 
informe-de-laboratorio-metodos-de-separacion-de-mezclas.pdf
informe-de-laboratorio-metodos-de-separacion-de-mezclas.pdfinforme-de-laboratorio-metodos-de-separacion-de-mezclas.pdf
informe-de-laboratorio-metodos-de-separacion-de-mezclas.pdf
 
12 - Planetas Extrasolares - Seminario de las Aulas de la Experiencia UPV/EHU
12 - Planetas Extrasolares - Seminario de las Aulas de la Experiencia UPV/EHU12 - Planetas Extrasolares - Seminario de las Aulas de la Experiencia UPV/EHU
12 - Planetas Extrasolares - Seminario de las Aulas de la Experiencia UPV/EHU
 
Programa dia de las madres para la convi
Programa dia de las madres para la conviPrograma dia de las madres para la convi
Programa dia de las madres para la convi
 
Actividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxActividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docx
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
 
La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdf
 
UNIDAD 3 -MAYO - IV CICLO para cuarto grado
UNIDAD 3 -MAYO - IV CICLO para cuarto gradoUNIDAD 3 -MAYO - IV CICLO para cuarto grado
UNIDAD 3 -MAYO - IV CICLO para cuarto grado
 
ACERTIJO EL NÚMERO PI COLOREA EMBLEMA OLÍMPICO DE PARÍS. Por JAVIER SOLIS NOYOLA
ACERTIJO EL NÚMERO PI COLOREA EMBLEMA OLÍMPICO DE PARÍS. Por JAVIER SOLIS NOYOLAACERTIJO EL NÚMERO PI COLOREA EMBLEMA OLÍMPICO DE PARÍS. Por JAVIER SOLIS NOYOLA
ACERTIJO EL NÚMERO PI COLOREA EMBLEMA OLÍMPICO DE PARÍS. Por JAVIER SOLIS NOYOLA
 
Sesión de clase APC: Los dos testigos.pdf
Sesión de clase APC: Los dos testigos.pdfSesión de clase APC: Los dos testigos.pdf
Sesión de clase APC: Los dos testigos.pdf
 
Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024
 
EFEMERIDES DEL MES DE MAYO PERIODICO MURAL.pdf
EFEMERIDES DEL MES DE MAYO PERIODICO MURAL.pdfEFEMERIDES DEL MES DE MAYO PERIODICO MURAL.pdf
EFEMERIDES DEL MES DE MAYO PERIODICO MURAL.pdf
 
El liderazgo en la empresa sostenible, introducción, definición y ejemplo.
El liderazgo en la empresa sostenible, introducción, definición y ejemplo.El liderazgo en la empresa sostenible, introducción, definición y ejemplo.
El liderazgo en la empresa sostenible, introducción, definición y ejemplo.
 
ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN PARÍS. Por JAVIER SOL...
ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN  PARÍS. Por JAVIER SOL...ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN  PARÍS. Por JAVIER SOL...
ACERTIJO LA RUTA DEL MARATÓN OLÍMPICO DEL NÚMERO PI EN PARÍS. Por JAVIER SOL...
 
10-08 Avances tecnológicos del siglo XXI.pdf
10-08 Avances tecnológicos del siglo XXI.pdf10-08 Avances tecnológicos del siglo XXI.pdf
10-08 Avances tecnológicos del siglo XXI.pdf
 
Educacion Basada en Evidencias SM5 Ccesa007.pdf
Educacion Basada en Evidencias  SM5  Ccesa007.pdfEducacion Basada en Evidencias  SM5  Ccesa007.pdf
Educacion Basada en Evidencias SM5 Ccesa007.pdf
 
Diapositivas unidad de trabajo 7 sobre Coloración temporal y semipermanente
Diapositivas unidad de trabajo 7 sobre Coloración temporal y semipermanenteDiapositivas unidad de trabajo 7 sobre Coloración temporal y semipermanente
Diapositivas unidad de trabajo 7 sobre Coloración temporal y semipermanente
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
AEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxAEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptx
 

Sql

  • 1. Bases de Datos Unidad El Lenguaje PL/SQL 2011 Erwin Fischer 2
  • 2. PL/SQL • Es una extensión procedimental de SQL diseñada por Oracle • Se basa en conceptos similares a los lenguajes de programación modernos. (declaracion de variables y constantes, estructuras de control, manejo de excepciones y modularización). • Es un lenguaje con estructura de bloques: Los bloques pueden ser completamente independientes o estar anidados uno dentro de otros • Las unidades básicas son : Procedimientos, funciones y bloques anonimos. 2011 Erwin Fischer 3
  • 3. Estructura general de un bloque PL/SQL [DECLARE Opcional - declaraciones] BEGIN Obligatorio - instrucciones ejecutables [EXCEPTION Opcional - rutinas de manejo de excepciones] END; Obligatorio 2011 Erwin Fischer 4
  • 4. Declaraciones en PL/SQL • Las variables y constantes deben declararse antes de poder referenciarlas. • Ej: – vNumEmpleado VARCHAR2(5); – vRenta NUMBER(6,2) NOT NULL := 600; – MAX_PROPIEDADES CONSTANT NUMBER := 100 • Es posible declarar variables de acuerdo al tipo de otras variables • vNumEmpleado Empleado.numEmpleado%TYPE; • vNumEmpleado1 vNumEmpleado%TYPE; • beerTuple Beers%ROWTYPE; 2011 Erwin Fischer 5
  • 5. Asignaciones en PL/SQL • Se pueden asignar variables de dos formas distintas: Utilizando (:=) o como resultado de una instrucción SELECT o FETCH • Ej: – vNumEmpleado := ‘SG14’; – vRenta := 500; – SELECT COUNT(*) INTO X FROM Propiedad WHERE numEmpleado = vNumEmpleado; 2011 Erwin Fischer 6
  • 6. Un programa Simple en PL/SQL drop table T1; // Se elimina la tabla en caso que exista, si no existe da un error, pero no importa CREATE TABLE T1( e INTEGER, f INTEGER ); Begin DELETE FROM T1; INSERT INTO T1 VALUES(1, 3); INSERT INTO T1 VALUES(2, 4); End select * from t1 /* Lo de arriba es SQL; debajo es el programa PL/SQL */ DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1;// Este select asigna el atributo e->a y f->b, de todos aquellos registros cuyo atributo e > 1 INSERT INTO T1 VALUES(b,a); END; 2011 Erwin Fischer 7
  • 7. Veamos que ocurre 1 • Se crea la tabla t1 y se insertan dos registros. 2011 Erwin Fischer 8
  • 8. El procedimiento anónimo select * from t1 DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1 INSERT INTO T1 VALUES(b,a); END; select * from t1 2011 Erwin Fischer 9
  • 9. ¿Qué ocurre si ejecuto nuevamente el procedimiento anónimo? • Escribir en el Blog, una explicación a lo que ocurre al ejecutar nuevamente el procedimiento: DECLARE a NUMBER; select * from t1 b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1 INSERT INTO T1 VALUES(b,a); END; 2011 Erwin Fischer 10
  • 10. Instrucciones de Control en PL/SQL • PL/SQL soporta los mecanismos habituales de control de flujo condicional, iterativo y secuencial • IF-THEN-ELSE-END IF; • LOOP-EXIT WHEN-END LOOP; • FOR-END LOOP; • WHILE-END LOOP; • GOTO; 2011 Erwin Fischer 11
  • 11. Instrucción IF Syntax #1: IF-THEN IF condition THEN {...statements...} END IF; Syntax #2: IF-THEN-ELSE IF condition THEN {...statements...} ELSE {...statements...} END IF; Syntax #3: IF-THEN-ELSIF IF condition THEN {...statements...} ELSIF condition THEN {...statements...} ELSE {...statements...} END IF; 2011 Erwin Fischer 12
  • 12. Un programa Simple en PL/SQL 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; 2011 Erwin Fischer 13
  • 13. ¿Qué hace este Procedimiento anónimo? select * from t1 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; 2011 Erwin Fischer 14
  • 14. Instrucción Loop LOOP {.statements.} END LOOP; Ejemplo LOOP monthly_value := daily_value * 31; EXIT WHEN monthly_value > 4000; END LOOP; 2011 Erwin Fischer 15
  • 15. Un programa Simple en PL/SQL DECLARE i NUMBER := 1; BEGIN LOOP INSERT INTO T1 VALUES(i,i); i := i+1; EXIT WHEN i>100; END LOOP; END; 2011 Erwin Fischer 16
  • 16. El ciclo FOR FOR loop_counter IN [REVERSE] lowest_number..highest_number LOOP {.statements.} END LOOP; 2011 Erwin Fischer 17
  • 17. Ejemplos de Ciclo FOR FOR Lcntr IN 1..20 FOR Lcntr IN REVERSE 1..15 LOOP LOOP LCalc := Lcntr * 31; LCalc := Lcntr * 31; END LOOP; END LOOP; 2011 Erwin Fischer 18
  • 18. El Ciclo While WHILE condition LOOP {.statements.} END LOOP; 2011 Erwin Fischer 19
  • 19. Ejemplo de ciclo While WHILE monthly_value <= 4000 LOOP monthly_value := daily_value * 31; END LOOP; 2011 Erwin Fischer 20
  • 20. Cursores 2011 Erwin Fischer 21
  • 21. Cursores • La instrucción SELECT puede utilizarse si la consulta devuelve una fila y solo una fila. • Los cursores se utilizan para el tratamiento de una consulta que pueda devolver un numero arbitrario de filas (es decir cero, una o más filas) • En la practica el cursor actúa como un puntero que dirige hacia una fila concreta el resultado de la consulta. • El cursor puede avanzar una posición para acceder a la siguiente fila. • Es necesario declarar y abrir los cursores antes de utilizarlos 2011 Erwin Fischer 22
  • 22. Cursores, un Ejemplo 1. DECLARE 2. vIdEmpleado employees.employee_id%TYPE; 3. vNombre employees.first_name%TYPE; 4. vApellido employees.last_name%TYPE; 5. CURSOR ListaEmpleadoCursor IS 6. SELECT employee_id, first_name, last_name FROM employees FOR UPDATE; 7. BEGIN 8. OPEN ListaEmpleadoCursor; 9. LOOP 10. FETCH ListaEmpleadoCursor INTO vIdEmpleado, vNombre, vApellido; 11. EXIT WHEN ListaEmpleadoCursor%NOTFOUND; 12. dbms_output.put_line ('Id : '||vIdEmpleado 13. ||' Nombre : '|| vNombre 14. || 'Apellido : '|| vApellido); 15. END LOOP; 16. CLOSE ListaEmpleadoCursor; 17. END; 2011 Erwin Fischer 23
  • 23. Un cursor dentro de otro cursor - obtieneTablas • Un cursor que lista todas las tablas con sus respectivas columnas, correspondiente al propietario HR 2011 Erwin Fischer 24
  • 24. Tablas all_tables y all_tab_columns select distinct tablas.owner, tablas.table_name from all_tables tablas where tablas.owner = 'HR'; select distinct col.column_name from all_tab_columns col where upper(col.owner) = 'HR' and lower(col.table_name) = 'employees'; 2011 Erwin Fischer 25
  • 25. Declarando las Variables y los cursores DECLARE vPropietario varchar2(40); vNombreTabla varchar2(40); vNombreColumna varchar2(100); /* Primer cursor */ cursor obtieneTablas is select distinct t.owner, t.table_name from all_tables t where t.owner = 'HR'; /* Segundo cursor */ cursor obtieneColumnas is select distinct c.column_name from all_tab_columns c where c.owner = vPropietario and c.table_name = vNombreTabla; 2011 Erwin Fischer 26
  • 26. El cuerpo del cursor begin open obtieneTablas; dbms_output.put_line('Abriendo Cursor - obtieneTablas'); loop fetch obtieneTablas into vPropietario, vNombreTabla; exit when obtieneTablas%NOTFOUND; dbms_output.put_line('Tabla : ‘||Propietario||'.'||vNombreTabla); open obtieneColumnas; loop fetch obtieneColumnas into vNombreColumna; exit when obtieneColumnas%NOTFOUND; dbms_output.put_line(‘=>’||vNombreTabla||'.'||vNombreColumna); end loop; close obtieneColumnas; end loop; close obtieneTablas; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'Se ha detectado un error - '||SQLCODE||' -ERROR- '||SQLERRM); end; 2011 Erwin Fischer 27
  • 27. Paso de Parámetros en Cursores CURSOR obtieneTablas(pPropietario VARCHAR2) IS select distinct t.owner, t.table_name from all_tables t where t.owner = pPropietario; Con lo que podríamos abrir el cursor OPEN obtieneTablas (´HR’); OPEN obtieneTablas(´SYSTEM’); Actividad : Modifique el cursor aplicando paso de parámetros, y publique en su blog. 2011 Erwin Fischer 28
  • 28. Tarea Cursor ParImpar • Agregue un atributo a la tabla EMPLOYEES, denominado TipoId, que va a contener un string. • Desarrolle un cursor que permita completar dicho atributo de acuerdo al siguiente criterio: SI employee_id es Par Entonces TipoId = ‘PAR’ Si-no TipoId = ‘IMPAR’ • Suba la solución a su Blog HOY. • 2011 Erwin Fischer 29
  • 29. Unidad - PL/SQL • Fin 2011 Erwin Fischer 30