SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
Capacitación Oracle Forms 10g




           Cuida de los minutos, que las horas se cuidan solas.- Lord Chesterfield
Instructor: Edwin Forms 10g Programación
ORACLE Developer Romero                                                              1
Contenido

                   Variables

                   Sentencias de Control y Bucles

                   Cursores

                   Exceptions

                   Sentencia Raise

                   Funciones, procedimientos y paquetes

                   Triggers

ORACLE Developer Forms 10g Programación                   2
Variables
   Los principales tipos de variables escalares en Oracle PL/SQL son los siguientes:

   VARCHAR2(tamaño)
   NUMBER[(precisión,escala)]
   DATE
   CHAR(tamaño)
   LONG
   BOOLEAN
   BINARY_INTEGER

   Un ejemplo de declaración de tipos de variable

     DECLARE
     variable1 VARCHAR2(50);
     variable2 BINARY_INTEGER:=0;
     variable3 NUMBER(10,4);




ORACLE Developer Forms 10g Programación                                                3
Variables
   Variables de tipo HOST
   Las variables No-PL/SQL o de tipo HOST son variables globales que pueden usarse
   tanto dentro como fuera de los bloques PL/SQL.

   Las referencias a estas variables vienen precedidas por dos puntos (:)

     VARIABLE total NUMBER(3,2);
     :total := 10/2;
   Atributo %TYPE

   El atributo %TYPE sirve para declarar una variable a partir de otras declaradas
   previamente, o a partir del tipo de una columna de la base de datos. Es decir, copiar
   el tipo de otra variable.

   El siguiente ejemplo asigna a la variable1 el mismo tipo que el campo de la base de
   datos.
   ver en popupcopiar a portapapelesimprimir
      variable1 tabla.campo%TYPE;


ORACLE Developer Forms 10g Programación                                                    4
Variables
  Ejemplo:

  DECLARE
  v_cnt_emp number;
  v_fecha date;
  BEGIN
       select sysdate() into v_fecha
       from dual;
       select count(*) into v_cnt_emp
       from employee
       where salary>1000;
       BEGIN
            dbms_output.put_line ('Empleados con salario>1000 : '||v_cnt_emp);
       END;
  END;
  /




ORACLE Developer Forms 10g Programación                                          5
Sentencias de Control y Bucles
DECLARE
v_cnt_emp number;
v_tot_emp number;
BEGIN
    select count(*) into v_tot_emp
    from employee;
    dbms_output.put_line ('Hay un total de '||v_tot_emp||' empleados.');
    select count(*) into v_cnt_emp from employee
    where salary>1000;
    dbms_output.put_line ('Hay '||v_cnt_emp||' empleados que ganan mas de 1000 $.');
    dbms_output.put_line ('Resultado de la analisis.');
    IF (v_tot_emp=v_cnt_emp) then
          dbms_output.put_line ('Los empleados ganan todos mas de 1000 $');
    ELSIF (v_tot_emp<v_cnt_emp*2) then
          dbms_output.put_line ('Mas de la mitad empleados ganan todos mas de 1000 $');
    ELSE
          dbms_output.put_line ('Menos de la mitad empleados ganan todos mas de 1000
    $');
    END IF;
END;
/

ORACLE Developer Forms 10g Programación                                              6
Sentencias de Control y Bucles
  DECLARE
  v_salary employee.salary%TYPE;
  begin
       select salary into v_salary from employee where emp_no=65;
       dbms_output.put_line('Salario:'|| v_salary);
       Case
            when v_salary=0 THEN
                       dbms_output.put_line('Gratis!');
            when v_salary<10000 then
                       dbms_output.put_line('Salado!');
            when v_salary<90000 then
                       dbms_output.put_line('Mas o menos');
            when v_salary>=90000 then
                       dbms_output.put_line('Correcto');
       end case;
  end;
  /




ORACLE Developer Forms 10g Programación                             7
Sentencias de Control y Bucles
  DECLARE
  v_job_grade employee.job_grade%TYPE;
  begin
       select job_grade into v_job_grade from employee where emp_no=2;
       dbms_output.put_line('job_grade:'|| v_job_grade);
       case v_job_grade
            when 1 THEN
                     dbms_output.put_line('Jefe!');
            when 2 then
                     dbms_output.put_line('Jefecito');
            when 3 then
                     dbms_output.put_line('Empleado regular');
       ELSE
            dbms_output.put_line('Esclavo o dios');
       end case;
  end;
  /




ORACLE Developer Forms 10g Programación                                  8
Bucles
 En PL/SQL podemos utilizar bucles:
 * LOOP
 * WHILE
 * FOR

  LOOP
  El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con
  la instrucción EXIT.
  DECLARE
  v_cnt PLS_INTEGER DEFAULT 0;
  BEGIN
      LOOP
           v_cnt:=v_cnt+1; /*Suma 1 cada vuelta*/
           dbms_output.put_line ('Contador = '||v_cnt);
           IF (v_cnt>=10) then /*Ingresa al If cuando es >= a 10*/
                     dbms_output.put_line (‘Salí Pues!');
                     exit;
           END IF;
      END LOOP;
  END;

ORACLE Developer Forms 10g Programación                                                   9
Bucles
 WHILE
 El bucle WHILE, se repite mientras que se cumpla expresión.

 Ejemplo:
 DECLARE
 v_cnt PLS_INTEGER DEFAULT 0;
 BEGIN
     v_cnt:=10;
     WHILE (v_cnt>0) LOOP
          dbms_output.put_line ('Contador = '||v_cnt);
          v_cnt:=v_cnt-1; /*Cada vez que pasamos Restamos 1*/
     END LOOP;
 END;
 /




ORACLE Developer Forms 10g Programación                         10
Bucles
 FOR
 El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final,
 generalmente es usado para recorrer Cursores. En el caso de especificar REVERSE el bucle
 se recorre en sentido inverso.

 FOR contador IN [REVERSE] inicio..final LOOP
 -- Instrucciones
 END LOOP;

 Ejemplo:
 DECLARE
 v_cnt PLS_INTEGER DEFAULT 0;
 BEGIN
     FOR v_cnt IN REVERSE 1..10 LOOP
          dbms_output.put_line ('Contador = '||v_cnt);
     END LOOP;
 END;
 /



ORACLE Developer Forms 10g Programación                                                  11
Cursores
 PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de
 registros devuelto por una instrucción SQL. Técnicamente los cursores son fragmentos de
 memoria que reservados para procesar los resultados de una consulta SELECT.

 SQL%ISOPEN : True si el cursor esta abierto (entre open y close),
 SQL%FOUND :
 • NULL antes de ejecutar
 • TRUE si uno o mas registros fueron inserted, merged, updated, o deleted o si solo 1
 registro fue
 seleccionado.
 • FALSE si ningún registro fue seleccionado, merged, updated, inserted, o deleted.
 SQL%NOTFOUND
 • NULL antes de ejecutar
 • TRUE si ningún registro fue seleccionado, merged, updated, inserted, o deleted.
 • FALSE si uno o mas registros fueron inserted, merged, updated, deleted o seleccionado.
 SQL%ROWCOUNT Cantidad de registros afectados por el cursor.




ORACLE Developer Forms 10g Programación                                                 12
Cursores
 Un Cursor Implícito:
 DECLARE
 v_nacionalidad varchar2(15);
 BEGIN
      SELECT nacionalidad INTO v_nacionalidad FROM persona WHERE pid=2;
      dbms_output.put_line(La persona número 2 es de nacionalidad '|| v_nacionalidad );
 end;
 DECLARE
  deptid     employees.department_id%TYPE;
  jobid     employees.job_id%TYPE;
  emp_rec     employees%ROWTYPE;
  TYPE emp_tab IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
  all_emps emp_tab;
 BEGIN
  SELECT department_id, job_id INTO deptid, jobid
    FROM employees WHERE employee_id = 140;
  IF SQL%FOUND THEN
   DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid || ', Job Id: ' || jobid);
  END IF;
  SELECT * INTO emp_rec FROM employees WHERE employee_id = 105;
  SELECT * BULK COLLECT INTO all_emps FROM employees;
  DBMS_OUTPUT.PUT_LINE('Number of rows: ' || SQL%ROWCOUNT);
 END;



ORACLE Developer Forms 10g Programación                                             13
Cursores

 Ejemplo de cursor explicito:

 DECLARE
 CURSOR c_emp IS /*CURSOR*/
 select ename, sal from employee;
 BEGIN
 FOR fila IN c_emp LOOP /*no es necesario definir la variable fila, será de tipo %ROW */
 dbms_output.put_line(fila.ename||' tiene un salario de '||fila.sal);
 END LOOP;
 END;
 /




ORACLE Developer Forms 10g Programación                                               14
Cursores

 DECLARE
 emp_rec employee%ROWTYPE; /*declaramos la variable igual a la fila de la tabla*/

 cursor c_emp is select * from employee for update; /*La opción “For Update” bloquea los
 registros */
 BEGIN
      OPEN c_emp; /*Abrimos el Cursor*/
      LOOP
           FETCH c_emp into emp_rec; /*Recuperamos una fila*/
           EXIT WHEN c_emp%NOTFOUND OR c_emp%ROWCOUNT > 10;
           UPDATE employee
           SET salary = salary+5
           where current of c_emp;
      END LOOP;
      CLOSE c_emp;
 END;




ORACLE Developer Forms 10g Programación                                              15
Excepciones
 Los bloques de excepciones permiten atrapar errores de ejecución y darles eventualmente
 un tratamiento para evitar que termine el programa de manera anormal.

 DECLARE
 -- Declaraciones
 BEGIN
 -- Ejecución
 EXCEPTION
 WHEN NO_DATA_FOUND THEN
 -- Se ejecuta cuando ocurre una excepción de tipo NO_DATA_FOUND
 WHEN ZERO_DIVIDE THEN
 -- Se ejecuta cuando ocurre una excepción de tipo ZERO_DIVIDE
 WHEN OTHERS THEN
 -- Se ejecuta cuando ocurre una excepción de un tipo no tratado
 -- en los bloques anteriores
 END;




ORACLE Developer Forms 10g Programación                                             16
Excepciones
Ejemplo:
DECLARE
v_sal NUMBER;
BEGIN
     BEGIN
         SELECT salary INTO v_sal FROM employee WHERE emp_no=1;
         dbms_output.put_line('El empleado numero 1 tiene un salario de '||v_sal||' $');
         EXCEPTION
         WHEN NO_DATA_FOUND THEN
         dbms_output.put_line('El empleado numero 1 no existe!');
     END;
     BEGIN
         SELECT emp_no INTO v_sal FROM employee WHERE salary>1000;
         dbms_output.put_line('El empleado que tiene un salario>1000 $ es el empleado
         numero'||v_sal);
         EXCEPTION
         WHEN too_many_rows THEN
         dbms_output.put_line('HAY MAS DE UN EMPLEADO QUE GANA MAS DE 1000
         $!');
     END;
END;
ORACLE Developer Forms 10g Programación                                              17
Excepciones
 ACCESS_INTO_NULL El programa intento asignar valores a los atributos de un objeto no
 inicializado 6530
 COLLECTION_IS_NULL El programa intento asignar valores a una tabla anidada aun no
 inicializada 6531
 CURSOR_ALREADY_OPEN El programa intento abrir un cursor que ya se encontraba abierto.
 Recuerde que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar
 con la sentencia OPEN 6511
 DUP_VAL_ON_INDEX El programa intento almacenar valores duplicados en una columna
 que se mantiene con restriccion de integridad de un índice único (unique index) 1
 INVALID_CURSOR El programa intento efectuar una operación no valida sobre un cursor
 1001
 INVALID_NUMBER En una sentencia SQL, la conversión de una cadena de caracteres hacia
 un número falla cuando esa cadena no representa un numero valido 1722
 LOGIN_DENIED El programa intento conectarse a Oracle con un nombre de usuario o
 password invalido 1017
 NO_DATA_FOUND Una sentencia SELECT INTO no devolvio valores o el programa referencio
 un elemento no inicializado en una tabla indexada 100
 NOT_LOGGED_ON El programa efectuo una llamada a Oracle sin estar conectado 1012
 PROGRAM_ERROR PL/SQL tiene un problema interno 6501



ORACLE Developer Forms 10g Programación                                              18
Excepciones
 ROWTYPE_MISMATCH Los elementos de una asignación (el valor a asignar y la variable que
 lo contendra) tienen tipos incompatibles. También se presenta este error cuando un
 parámetro pasado a un subprograma no es del tipo esperado 6504
 SELF_IS_NULL El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo
 30625
 STORAGE_ERROR La memoria se termino o esta corrupta 6500
 SUBSCRIPT_BEYOND_COUNT El programa esta tratando de referenciar un elemento de un
 arreglo indexado que se encuentra en una posición mas grande que el numero real de
 elementos de la colección 6533
 SUBSCRIPT_OUTSIDE_LIMIT El programa esta referenciando un elemento de un arreglo
 utilizando un numero fuera del rango permitido (por ejemplo, el elemento “1”) 6532
 SYS_INVALID_ROWID La conversión de una cadena de caracteres hacia un tipo rowid fallo
 porque la cadena no representa un numero 1410
 TIMEOUT_ON_RESOURCE Se excedió el tiempo máximo de espera por un recurso en Oracle
 51
 TOO_MANY_ROWS Una sentencia SELECT INTO devuelve mas de una fila 1422
 VALUE_ERROR Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo,
 sucede cuando se intenta calzar un valor muy grande dentro de una variable mas pequeña
 6502
 ZERO_DIVIDE El programa intento efectuar una división por cero 1476

ORACLE Developer Forms 10g Programación                                           19
Excepciones
  DECLARE
  err_num NUMBER;
  err_msg VARCHAR2(255);
  result NUMBER;
  BEGIN
       SELECT 1/0 INTO result
       FROM DUAL;
       EXCEPTION
       WHEN OTHERS THEN
           err_num := SQLCODE;
           err_msg := SQLERRM;
           DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num));
           DBMS_OUTPUT.put_line(err_msg);
  END;




ORACLE Developer Forms 10g Programación                        20
Sentencia Raise
 La sentencia RAISE permite lanzar una excepción en forma explicita. Es posible utilizar esta
 sentencia en cualquier lugar que se encuentre dentro del alcance de la excepción.
 DECLARE
 -- Declaramos una excepción identificada por VALOR_NEGATIVO
 VALOR_NEGATIVO EXCEPTION;
 valor NUMBER;
 BEGIN
      -- Ejecución
      valor := -1;
      IF valor < 0 THEN
            RAISE VALOR_NEGATIVO;
      END IF;
      EXCEPTION
      -- Excepción
      WHEN VALOR_NEGATIVO THEN
            dbms_output.put_line('El valor no puede ser negativo');
 END;




ORACLE Developer Forms 10g Programación                                                 21
Sentencia Raise
 En ocasiones queremos enviar un mensaje de error personalizado al producirse una
 excepcion PL/SQL.
 Para ello es necesario utilizar la instruccion RAISE_APPLICATION_ERROR; La sintaxis
 general es la siguiente:
 RAISE_APPLICATION_ERROR(<error_num>,<mensaje>);
 Siendo:
 * error_num es un entero negativo comprendido entre 20001
 y 20999
 * mensaje la descripción del error

 DECLARE
 v_div NUMBER;
 BEGIN
      SELECT 1/0 INTO v_div FROM DUAL;
      EXCEPTION
      WHEN OTHERS THEN
          RAISE_APPLICATION_ERROR(-20001,'No se puede dividir por cero');
 END;



ORACLE Developer Forms 10g Programación                                        22
Funciones, procedimientos y paquetes
 ALGUNAS FUNCIONES PREDEFINIDAS

 SYSDATE
 NVL
 SELECT CO_PRODUCTO, NVL(PRECIO, 0) FROM PRECIOS;
 DECODE
 TO_DATE(<expresion>, [<formato>])
 TO_CHAR(<expresion>, [<formato>])
 TO_NUMBER(<expresion>, [<formato>])
 INSTR(<char>, <search_string>, <startpos>, <occurrence> )
 REPLACE(<expresion>, <busqueda>, <reemplazo>)
 SUBSTR, UPPER, LOWER, ROWIDTOCHAR,
 RPAD(<expresion>, <longitud>, <pad_string> )
 LPAD(<expresion>, <longitud>, <pad_string> )
 RTRIM, LTRIM, TRIM, MOD




ORACLE Developer Forms 10g Programación                      23
Funciones, procedimientos y paquetes

 Funciones definidas por el usuario
 CREATE OR REPLACE /* Or replace es opcional */
 FUNCTION fn_Obtener_Salario(p_empno NUMBER) RETURN NUMBER
 IS
 result NUMBER;
 BEGIN
      SELECT salary INTO result
      FROM employee
      WHERE emp_no = p_empno;
      return(result);
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
      return 0;
 END ;




ORACLE Developer Forms 10g Programación                      24
Funciones, procedimientos y paquetes
  Procedimientos
 Debemos especificar el tipo de datos de cada parametro. Al especificar el tipo de dato del
 parámetro no debemos especificar la longitud del tipo.
 Los parámetros pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT).
 El valor por defecto es IN, y se toma ese valor en caso de que no especifiquemos nada.

 Create or replace
 PROCEDURE Actualiza_Salario(p_empno NUMBER,
                                 p_new_salario NUMBER default 100)
 /*podemos usar Default o :=*/
 IS
 -- Declaracion de variables locales
 BEGIN
      -- Sentencias
      UPDATE employee
      SET salary = p_new_salario,
      hire_date = SYSDATE
      WHERE emp_no = p_empno;
 END Actualiza_Salario;


ORACLE Developer Forms 10g Programación                                               25
Funciones, procedimientos y paquetes
 Paquetes
 Un paquete es un conjunto de funciones y/o procedimiento. Permite facilitar la
 administración de los códigos (agrupaciones), y la seguridad (a nivel de paquete en vez de
 por función/procedimiento). En el paquete se pueden definir variable de alcance de todo
 el paquete (global variables).
 CREATE [OR REPLACE] PACKAGE <pkgName>
 IS
     -- Declaraciones de tipos y registros públicas
     {[TYPE <TypeName> IS <Datatype>;]}
     -- Declaraciones de variables y constantes publicas
     -- También podemos declarar cursores
     {[<ConstantName> CONSTANT <Datatype> := <valor>;]}
     {[<VariableName> <Datatype>;]}
     -- Declaraciones de procedimientos y funciones públicas
     {[FUNCTION <FunctionName>(<Parameter> <Datatype>,...)
     RETURN <Datatype>;]}
     {[PROCEDURE <ProcedureName>(<Parameter> <Datatype>, ...);]}
 END <pkgName>;


ORACLE Developer Forms 10g Programación                                               26
Funciones, procedimientos y paquetes
 CREATE [OR REPLACE] PACKAGE BODY <pkgName> IS
      -- Declaraciones de tipos y registros privados
      {[TYPE <TypeName> IS <Datatype>;]}
      -- Declaraciones de variables y constantes privadas
      -- También podemos declarar cursores
      {[<ConstantName> CONSTANT <Datatype> := <valor>;]}
      {[<VariableName> <Datatype>;]}
      -- Implementación de procedimientos y funciones
      FUNCTION <FunctionName>(<Parameter> <Datatype>,...)
      RETURN <Datatype>
      IS
             -- Variables locales de la función
             BEGIN
             -- Implementación de la función
             return(<Result>);
             [EXCEPTION]
             -- Control de excepciones
      END;
      PROCEDURE <ProcedureName>(<Parameter> <Datatype>, ...)
      IS
             -- Variables locales de la función
             BEGIN
             -- Implementación de procedimiento
             [EXCEPTION]
             -- Control de excepciones
      END;
 END <pkgName>;

ORACLE Developer Forms 10g Programación                        27
Triggers
 Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta como consecuencia de
 una determinada instrucción SQL (una operación DML: INSERT, UPDATE o DELETE) sobre
 dicha tabla.

 CREATE [OR REPLACE] TRIGGER <nombre_trigger>
 {BEFORE|AFTER}
 {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
 [OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}
 ON <nombre_tabla>
 [FOR EACH ROW [WHEN (<condicion>)]]
 DECLARE
 -- variables locales
 BEGIN
 -- Sentencias
 [EXCEPTION]
 -- Sentencias control de excepcion
 END <nombre_trigger>;




ORACLE Developer Forms 10g Programación                                             28
Triggers
 create or replace TRIGGER TR_EMP_AU
 Curso de SQL avanzado y PL/SQL basico para Oracle 10g (10.2) Pagina 40 / 44
 AFTER UPDATE ON EMPLOYEE
 FOR EACH ROW
 WHEN (OLD.salary<>NEW.salary)
 DECLARE
 -- local variables
 BEGIN
       INSERT INTO emp_audit
       (emp_no,fecha,msg)
       VALUES
       (:NEW.emp_no,SYSDATE,'Salario modificado de '||:old.salary||' a '||:new.salary);
 END TRIGGER TR_EMP_AU;




ORACLE Developer Forms 10g Programación                                                   29
Cierre

                               Sitios Recomendados

 http://www.oracle.com/technetwork/index.html Sitio Oficial de
 Oracle
 http://www.orasite.com/ Comunidad y foros de consulta sobre
 Oracle todo en Español
 http://es.scribd.com/ Libros con mucho información de varias
 herramientas de desarrollo

  Instructor: Edwin Alfredo Romero
  Email: romero.espinoza@gmail.com
  Blog: www.ejecucion.wordpress.com
  Twitter: @Wirwin2009
  Yo ruego a Dios, como si lo esperase todo de Él, pero trabajo como si lo esperase todo
  de mí.- Santo Tomas de Aquino
ORACLE Developer Forms 10g Programación                                              30

Weitere ähnliche Inhalte

Was ist angesagt? (20)

7.2. funciones sql
7.2.  funciones sql7.2.  funciones sql
7.2. funciones sql
 
Principios de Diseño de Componentes Web
Principios de Diseño de Componentes WebPrincipios de Diseño de Componentes Web
Principios de Diseño de Componentes Web
 
Oracle: Cursors
Oracle: CursorsOracle: Cursors
Oracle: Cursors
 
Relacion uno a uno en base de datos
Relacion uno a uno en base de datosRelacion uno a uno en base de datos
Relacion uno a uno en base de datos
 
Types of normalization
Types of normalizationTypes of normalization
Types of normalization
 
Modelo jerarquico
Modelo jerarquicoModelo jerarquico
Modelo jerarquico
 
Objeto relacional bases datos 2
Objeto relacional bases datos 2Objeto relacional bases datos 2
Objeto relacional bases datos 2
 
Oracle architecture with details-yogiji creations
Oracle architecture with details-yogiji creationsOracle architecture with details-yogiji creations
Oracle architecture with details-yogiji creations
 
Postgre sql
Postgre sqlPostgre sql
Postgre sql
 
10 sistemas gestores de base de datos
10 sistemas gestores de base de datos10 sistemas gestores de base de datos
10 sistemas gestores de base de datos
 
TRIGGERS
TRIGGERSTRIGGERS
TRIGGERS
 
Modelo vista controlador
Modelo vista controladorModelo vista controlador
Modelo vista controlador
 
2 normalization
2 normalization2 normalization
2 normalization
 
Oracle
OracleOracle
Oracle
 
Oledb
Oledb Oledb
Oledb
 
Base De Datos Orientada A Objetos
Base De Datos Orientada A ObjetosBase De Datos Orientada A Objetos
Base De Datos Orientada A Objetos
 
Reglas de codd y normalizacion
Reglas de codd y normalizacionReglas de codd y normalizacion
Reglas de codd y normalizacion
 
Lect 08 materialized view
Lect 08 materialized viewLect 08 materialized view
Lect 08 materialized view
 
Bootstrap
BootstrapBootstrap
Bootstrap
 
Control de eventos en gui
Control de eventos en guiControl de eventos en gui
Control de eventos en gui
 

Andere mochten auch

Sql plus temario
Sql plus temarioSql plus temario
Sql plus temarioHugo Mdz
 
Diapositivas Web Util
Diapositivas Web UtilDiapositivas Web Util
Diapositivas Web Utilsudamericano
 
Software de aplicación
Software de aplicaciónSoftware de aplicación
Software de aplicaciónGriseld Reyes
 
PL SQL Diplomado Oracle
PL SQL Diplomado OraclePL SQL Diplomado Oracle
PL SQL Diplomado OracleUzziel Chaidez
 
Oracle Forms: Non input Items
Oracle Forms:  Non input ItemsOracle Forms:  Non input Items
Oracle Forms: Non input ItemsSekhar Byna
 
Oracle Forms Triggers
Oracle Forms TriggersOracle Forms Triggers
Oracle Forms TriggersSekhar Byna
 
Oracle Forms Triggers
Oracle Forms TriggersOracle Forms Triggers
Oracle Forms TriggersSekhar Byna
 
Oracle Forms Mouse triggers
Oracle Forms Mouse triggersOracle Forms Mouse triggers
Oracle Forms Mouse triggersSekhar Byna
 
Oracle Forms Creation-List of Values (LOV)
Oracle Forms Creation-List of Values (LOV)Oracle Forms Creation-List of Values (LOV)
Oracle Forms Creation-List of Values (LOV)Sekhar Byna
 
Oracle Forms: Menu
Oracle Forms: MenuOracle Forms: Menu
Oracle Forms: MenuSekhar Byna
 
Oracle Forms-Canvas types
Oracle Forms-Canvas typesOracle Forms-Canvas types
Oracle Forms-Canvas typesSekhar Byna
 
Oracle Forms: create debug triggers
Oracle Forms: create debug triggersOracle Forms: create debug triggers
Oracle Forms: create debug triggersSekhar Byna
 
Oracle Forms : Transnational Triggers
Oracle Forms : Transnational TriggersOracle Forms : Transnational Triggers
Oracle Forms : Transnational TriggersSekhar Byna
 
Oracle Forms- key triggers
Oracle Forms- key triggersOracle Forms- key triggers
Oracle Forms- key triggersSekhar Byna
 
Oracle Forms : Validation Triggers
Oracle Forms : Validation TriggersOracle Forms : Validation Triggers
Oracle Forms : Validation TriggersSekhar Byna
 
Oracle Forms : Query Triggers
Oracle Forms : Query TriggersOracle Forms : Query Triggers
Oracle Forms : Query TriggersSekhar Byna
 

Andere mochten auch (20)

Sql plus temario
Sql plus temarioSql plus temario
Sql plus temario
 
Diapositivas Web Util
Diapositivas Web UtilDiapositivas Web Util
Diapositivas Web Util
 
Instalacion oracle forms
Instalacion oracle formsInstalacion oracle forms
Instalacion oracle forms
 
Software de aplicación
Software de aplicaciónSoftware de aplicación
Software de aplicación
 
PL SQL Diplomado Oracle
PL SQL Diplomado OraclePL SQL Diplomado Oracle
PL SQL Diplomado Oracle
 
Oracle Forms: Non input Items
Oracle Forms:  Non input ItemsOracle Forms:  Non input Items
Oracle Forms: Non input Items
 
Oracle Forms Triggers
Oracle Forms TriggersOracle Forms Triggers
Oracle Forms Triggers
 
Oracle Forms Triggers
Oracle Forms TriggersOracle Forms Triggers
Oracle Forms Triggers
 
Oracle Forms Mouse triggers
Oracle Forms Mouse triggersOracle Forms Mouse triggers
Oracle Forms Mouse triggers
 
Oracle Forms Creation-List of Values (LOV)
Oracle Forms Creation-List of Values (LOV)Oracle Forms Creation-List of Values (LOV)
Oracle Forms Creation-List of Values (LOV)
 
Oracle Forms: Menu
Oracle Forms: MenuOracle Forms: Menu
Oracle Forms: Menu
 
Oracle Forms-Canvas types
Oracle Forms-Canvas typesOracle Forms-Canvas types
Oracle Forms-Canvas types
 
Oracle Forms: create debug triggers
Oracle Forms: create debug triggersOracle Forms: create debug triggers
Oracle Forms: create debug triggers
 
Oracle Forms : Transnational Triggers
Oracle Forms : Transnational TriggersOracle Forms : Transnational Triggers
Oracle Forms : Transnational Triggers
 
Forms 6i guide
Forms 6i guideForms 6i guide
Forms 6i guide
 
Oracle Forms- key triggers
Oracle Forms- key triggersOracle Forms- key triggers
Oracle Forms- key triggers
 
forms builder
forms builderforms builder
forms builder
 
Oracle Forms : Validation Triggers
Oracle Forms : Validation TriggersOracle Forms : Validation Triggers
Oracle Forms : Validation Triggers
 
Oracle Forms : Query Triggers
Oracle Forms : Query TriggersOracle Forms : Query Triggers
Oracle Forms : Query Triggers
 
Exercícios PL/SQL
Exercícios PL/SQLExercícios PL/SQL
Exercícios PL/SQL
 

Ähnlich wie Forms 10g procedimientos y cursores

Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)José Toro
 
Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScripttovi27
 
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 sqlAndrei Hortúa
 
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
1.2.2 incorporando sentencias dml y funciones sql a bloques plsqlRicardo Riquelme Pinto
 
Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)José Toro
 
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM   TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM Kamisutra
 
Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)José Toro
 
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 Oracleluisguil
 
Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)José Toro
 

Ähnlich wie Forms 10g procedimientos y cursores (20)

Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)
 
Replica
ReplicaReplica
Replica
 
Principios de Programacion
Principios de ProgramacionPrincipios de Programacion
Principios de Programacion
 
Apunte plsql
Apunte plsqlApunte plsql
Apunte plsql
 
Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScript
 
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
 
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
1.2.2 incorporando sentencias dml y funciones sql a bloques plsql
 
Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)
 
Lumisaca hector bdii_t7
Lumisaca hector bdii_t7Lumisaca hector bdii_t7
Lumisaca hector bdii_t7
 
PLSQL y paquetes
PLSQL y paquetesPLSQL y paquetes
PLSQL y paquetes
 
Ejercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sqlEjercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sql
 
Pl Sql
Pl SqlPl Sql
Pl Sql
 
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM   TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
 
Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)
 
Pl
PlPl
Pl
 
Resumen java
Resumen javaResumen java
Resumen java
 
Sql
SqlSql
Sql
 
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
 
Turbo c++ 3.0
Turbo c++ 3.0Turbo c++ 3.0
Turbo c++ 3.0
 
Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)
 

Kürzlich hochgeladen

Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidaddanik1023m
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosLCristinaForchue
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...RaymondCode
 
Hazte partner: Club Festibity 2024 - 2025
Hazte partner: Club Festibity 2024 - 2025Hazte partner: Club Festibity 2024 - 2025
Hazte partner: Club Festibity 2024 - 2025Festibity
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx Emialexsolar
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfymiranda2
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfodalistar77
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfOBr.global
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETGermán Küber
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfalejandrogomezescoto
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfJoseAlejandroPerezBa
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxPaolaCarolinaCarvaja
 

Kürzlich hochgeladen (14)

BEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura SilvaBEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
 
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier FolchBEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidad
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
 
Hazte partner: Club Festibity 2024 - 2025
Hazte partner: Club Festibity 2024 - 2025Hazte partner: Club Festibity 2024 - 2025
Hazte partner: Club Festibity 2024 - 2025
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx E
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdf
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docx
 

Forms 10g procedimientos y cursores

  • 1. Capacitación Oracle Forms 10g Cuida de los minutos, que las horas se cuidan solas.- Lord Chesterfield Instructor: Edwin Forms 10g Programación ORACLE Developer Romero 1
  • 2. Contenido Variables Sentencias de Control y Bucles Cursores Exceptions Sentencia Raise Funciones, procedimientos y paquetes Triggers ORACLE Developer Forms 10g Programación 2
  • 3. Variables Los principales tipos de variables escalares en Oracle PL/SQL son los siguientes: VARCHAR2(tamaño) NUMBER[(precisión,escala)] DATE CHAR(tamaño) LONG BOOLEAN BINARY_INTEGER Un ejemplo de declaración de tipos de variable DECLARE variable1 VARCHAR2(50); variable2 BINARY_INTEGER:=0; variable3 NUMBER(10,4); ORACLE Developer Forms 10g Programación 3
  • 4. Variables Variables de tipo HOST Las variables No-PL/SQL o de tipo HOST son variables globales que pueden usarse tanto dentro como fuera de los bloques PL/SQL. Las referencias a estas variables vienen precedidas por dos puntos (:) VARIABLE total NUMBER(3,2); :total := 10/2; Atributo %TYPE El atributo %TYPE sirve para declarar una variable a partir de otras declaradas previamente, o a partir del tipo de una columna de la base de datos. Es decir, copiar el tipo de otra variable. El siguiente ejemplo asigna a la variable1 el mismo tipo que el campo de la base de datos. ver en popupcopiar a portapapelesimprimir variable1 tabla.campo%TYPE; ORACLE Developer Forms 10g Programación 4
  • 5. Variables Ejemplo: DECLARE v_cnt_emp number; v_fecha date; BEGIN select sysdate() into v_fecha from dual; select count(*) into v_cnt_emp from employee where salary>1000; BEGIN dbms_output.put_line ('Empleados con salario>1000 : '||v_cnt_emp); END; END; / ORACLE Developer Forms 10g Programación 5
  • 6. Sentencias de Control y Bucles DECLARE v_cnt_emp number; v_tot_emp number; BEGIN select count(*) into v_tot_emp from employee; dbms_output.put_line ('Hay un total de '||v_tot_emp||' empleados.'); select count(*) into v_cnt_emp from employee where salary>1000; dbms_output.put_line ('Hay '||v_cnt_emp||' empleados que ganan mas de 1000 $.'); dbms_output.put_line ('Resultado de la analisis.'); IF (v_tot_emp=v_cnt_emp) then dbms_output.put_line ('Los empleados ganan todos mas de 1000 $'); ELSIF (v_tot_emp<v_cnt_emp*2) then dbms_output.put_line ('Mas de la mitad empleados ganan todos mas de 1000 $'); ELSE dbms_output.put_line ('Menos de la mitad empleados ganan todos mas de 1000 $'); END IF; END; / ORACLE Developer Forms 10g Programación 6
  • 7. Sentencias de Control y Bucles DECLARE v_salary employee.salary%TYPE; begin select salary into v_salary from employee where emp_no=65; dbms_output.put_line('Salario:'|| v_salary); Case when v_salary=0 THEN dbms_output.put_line('Gratis!'); when v_salary<10000 then dbms_output.put_line('Salado!'); when v_salary<90000 then dbms_output.put_line('Mas o menos'); when v_salary>=90000 then dbms_output.put_line('Correcto'); end case; end; / ORACLE Developer Forms 10g Programación 7
  • 8. Sentencias de Control y Bucles DECLARE v_job_grade employee.job_grade%TYPE; begin select job_grade into v_job_grade from employee where emp_no=2; dbms_output.put_line('job_grade:'|| v_job_grade); case v_job_grade when 1 THEN dbms_output.put_line('Jefe!'); when 2 then dbms_output.put_line('Jefecito'); when 3 then dbms_output.put_line('Empleado regular'); ELSE dbms_output.put_line('Esclavo o dios'); end case; end; / ORACLE Developer Forms 10g Programación 8
  • 9. Bucles En PL/SQL podemos utilizar bucles: * LOOP * WHILE * FOR LOOP El bucle LOOP, se repite tantas veces como sea necesario hasta que se fuerza su salida con la instrucción EXIT. DECLARE v_cnt PLS_INTEGER DEFAULT 0; BEGIN LOOP v_cnt:=v_cnt+1; /*Suma 1 cada vuelta*/ dbms_output.put_line ('Contador = '||v_cnt); IF (v_cnt>=10) then /*Ingresa al If cuando es >= a 10*/ dbms_output.put_line (‘Salí Pues!'); exit; END IF; END LOOP; END; ORACLE Developer Forms 10g Programación 9
  • 10. Bucles WHILE El bucle WHILE, se repite mientras que se cumpla expresión. Ejemplo: DECLARE v_cnt PLS_INTEGER DEFAULT 0; BEGIN v_cnt:=10; WHILE (v_cnt>0) LOOP dbms_output.put_line ('Contador = '||v_cnt); v_cnt:=v_cnt-1; /*Cada vez que pasamos Restamos 1*/ END LOOP; END; / ORACLE Developer Forms 10g Programación 10
  • 11. Bucles FOR El bucle FOR, se repite tanta veces como le indiquemos en los identificadores inicio y final, generalmente es usado para recorrer Cursores. En el caso de especificar REVERSE el bucle se recorre en sentido inverso. FOR contador IN [REVERSE] inicio..final LOOP -- Instrucciones END LOOP; Ejemplo: DECLARE v_cnt PLS_INTEGER DEFAULT 0; BEGIN FOR v_cnt IN REVERSE 1..10 LOOP dbms_output.put_line ('Contador = '||v_cnt); END LOOP; END; / ORACLE Developer Forms 10g Programación 11
  • 12. Cursores PL/SQL utiliza cursores para gestionar las instrucciones SELECT. Un cursor es un conjunto de registros devuelto por una instrucción SQL. Técnicamente los cursores son fragmentos de memoria que reservados para procesar los resultados de una consulta SELECT. SQL%ISOPEN : True si el cursor esta abierto (entre open y close), SQL%FOUND : • NULL antes de ejecutar • TRUE si uno o mas registros fueron inserted, merged, updated, o deleted o si solo 1 registro fue seleccionado. • FALSE si ningún registro fue seleccionado, merged, updated, inserted, o deleted. SQL%NOTFOUND • NULL antes de ejecutar • TRUE si ningún registro fue seleccionado, merged, updated, inserted, o deleted. • FALSE si uno o mas registros fueron inserted, merged, updated, deleted o seleccionado. SQL%ROWCOUNT Cantidad de registros afectados por el cursor. ORACLE Developer Forms 10g Programación 12
  • 13. Cursores Un Cursor Implícito: DECLARE v_nacionalidad varchar2(15); BEGIN SELECT nacionalidad INTO v_nacionalidad FROM persona WHERE pid=2; dbms_output.put_line(La persona número 2 es de nacionalidad '|| v_nacionalidad ); end; DECLARE deptid employees.department_id%TYPE; jobid employees.job_id%TYPE; emp_rec employees%ROWTYPE; TYPE emp_tab IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER; all_emps emp_tab; BEGIN SELECT department_id, job_id INTO deptid, jobid FROM employees WHERE employee_id = 140; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid || ', Job Id: ' || jobid); END IF; SELECT * INTO emp_rec FROM employees WHERE employee_id = 105; SELECT * BULK COLLECT INTO all_emps FROM employees; DBMS_OUTPUT.PUT_LINE('Number of rows: ' || SQL%ROWCOUNT); END; ORACLE Developer Forms 10g Programación 13
  • 14. Cursores Ejemplo de cursor explicito: DECLARE CURSOR c_emp IS /*CURSOR*/ select ename, sal from employee; BEGIN FOR fila IN c_emp LOOP /*no es necesario definir la variable fila, será de tipo %ROW */ dbms_output.put_line(fila.ename||' tiene un salario de '||fila.sal); END LOOP; END; / ORACLE Developer Forms 10g Programación 14
  • 15. Cursores DECLARE emp_rec employee%ROWTYPE; /*declaramos la variable igual a la fila de la tabla*/ cursor c_emp is select * from employee for update; /*La opción “For Update” bloquea los registros */ BEGIN OPEN c_emp; /*Abrimos el Cursor*/ LOOP FETCH c_emp into emp_rec; /*Recuperamos una fila*/ EXIT WHEN c_emp%NOTFOUND OR c_emp%ROWCOUNT > 10; UPDATE employee SET salary = salary+5 where current of c_emp; END LOOP; CLOSE c_emp; END; ORACLE Developer Forms 10g Programación 15
  • 16. Excepciones Los bloques de excepciones permiten atrapar errores de ejecución y darles eventualmente un tratamiento para evitar que termine el programa de manera anormal. DECLARE -- Declaraciones BEGIN -- Ejecución EXCEPTION WHEN NO_DATA_FOUND THEN -- Se ejecuta cuando ocurre una excepción de tipo NO_DATA_FOUND WHEN ZERO_DIVIDE THEN -- Se ejecuta cuando ocurre una excepción de tipo ZERO_DIVIDE WHEN OTHERS THEN -- Se ejecuta cuando ocurre una excepción de un tipo no tratado -- en los bloques anteriores END; ORACLE Developer Forms 10g Programación 16
  • 17. Excepciones Ejemplo: DECLARE v_sal NUMBER; BEGIN BEGIN SELECT salary INTO v_sal FROM employee WHERE emp_no=1; dbms_output.put_line('El empleado numero 1 tiene un salario de '||v_sal||' $'); EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('El empleado numero 1 no existe!'); END; BEGIN SELECT emp_no INTO v_sal FROM employee WHERE salary>1000; dbms_output.put_line('El empleado que tiene un salario>1000 $ es el empleado numero'||v_sal); EXCEPTION WHEN too_many_rows THEN dbms_output.put_line('HAY MAS DE UN EMPLEADO QUE GANA MAS DE 1000 $!'); END; END; ORACLE Developer Forms 10g Programación 17
  • 18. Excepciones ACCESS_INTO_NULL El programa intento asignar valores a los atributos de un objeto no inicializado 6530 COLLECTION_IS_NULL El programa intento asignar valores a una tabla anidada aun no inicializada 6531 CURSOR_ALREADY_OPEN El programa intento abrir un cursor que ya se encontraba abierto. Recuerde que un cursor de ciclo FOR automáticamente lo abre y ello no se debe especificar con la sentencia OPEN 6511 DUP_VAL_ON_INDEX El programa intento almacenar valores duplicados en una columna que se mantiene con restriccion de integridad de un índice único (unique index) 1 INVALID_CURSOR El programa intento efectuar una operación no valida sobre un cursor 1001 INVALID_NUMBER En una sentencia SQL, la conversión de una cadena de caracteres hacia un número falla cuando esa cadena no representa un numero valido 1722 LOGIN_DENIED El programa intento conectarse a Oracle con un nombre de usuario o password invalido 1017 NO_DATA_FOUND Una sentencia SELECT INTO no devolvio valores o el programa referencio un elemento no inicializado en una tabla indexada 100 NOT_LOGGED_ON El programa efectuo una llamada a Oracle sin estar conectado 1012 PROGRAM_ERROR PL/SQL tiene un problema interno 6501 ORACLE Developer Forms 10g Programación 18
  • 19. Excepciones ROWTYPE_MISMATCH Los elementos de una asignación (el valor a asignar y la variable que lo contendra) tienen tipos incompatibles. También se presenta este error cuando un parámetro pasado a un subprograma no es del tipo esperado 6504 SELF_IS_NULL El parámetro SELF (el primero que es pasado a un método MEMBER) es nulo 30625 STORAGE_ERROR La memoria se termino o esta corrupta 6500 SUBSCRIPT_BEYOND_COUNT El programa esta tratando de referenciar un elemento de un arreglo indexado que se encuentra en una posición mas grande que el numero real de elementos de la colección 6533 SUBSCRIPT_OUTSIDE_LIMIT El programa esta referenciando un elemento de un arreglo utilizando un numero fuera del rango permitido (por ejemplo, el elemento “1”) 6532 SYS_INVALID_ROWID La conversión de una cadena de caracteres hacia un tipo rowid fallo porque la cadena no representa un numero 1410 TIMEOUT_ON_RESOURCE Se excedió el tiempo máximo de espera por un recurso en Oracle 51 TOO_MANY_ROWS Una sentencia SELECT INTO devuelve mas de una fila 1422 VALUE_ERROR Ocurrió un error aritmético, de conversión o truncamiento. Por ejemplo, sucede cuando se intenta calzar un valor muy grande dentro de una variable mas pequeña 6502 ZERO_DIVIDE El programa intento efectuar una división por cero 1476 ORACLE Developer Forms 10g Programación 19
  • 20. Excepciones DECLARE err_num NUMBER; err_msg VARCHAR2(255); result NUMBER; BEGIN SELECT 1/0 INTO result FROM DUAL; EXCEPTION WHEN OTHERS THEN err_num := SQLCODE; err_msg := SQLERRM; DBMS_OUTPUT.put_line('Error:'||TO_CHAR(err_num)); DBMS_OUTPUT.put_line(err_msg); END; ORACLE Developer Forms 10g Programación 20
  • 21. Sentencia Raise La sentencia RAISE permite lanzar una excepción en forma explicita. Es posible utilizar esta sentencia en cualquier lugar que se encuentre dentro del alcance de la excepción. DECLARE -- Declaramos una excepción identificada por VALOR_NEGATIVO VALOR_NEGATIVO EXCEPTION; valor NUMBER; BEGIN -- Ejecución valor := -1; IF valor < 0 THEN RAISE VALOR_NEGATIVO; END IF; EXCEPTION -- Excepción WHEN VALOR_NEGATIVO THEN dbms_output.put_line('El valor no puede ser negativo'); END; ORACLE Developer Forms 10g Programación 21
  • 22. Sentencia Raise En ocasiones queremos enviar un mensaje de error personalizado al producirse una excepcion PL/SQL. Para ello es necesario utilizar la instruccion RAISE_APPLICATION_ERROR; La sintaxis general es la siguiente: RAISE_APPLICATION_ERROR(<error_num>,<mensaje>); Siendo: * error_num es un entero negativo comprendido entre 20001 y 20999 * mensaje la descripción del error DECLARE v_div NUMBER; BEGIN SELECT 1/0 INTO v_div FROM DUAL; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001,'No se puede dividir por cero'); END; ORACLE Developer Forms 10g Programación 22
  • 23. Funciones, procedimientos y paquetes ALGUNAS FUNCIONES PREDEFINIDAS SYSDATE NVL SELECT CO_PRODUCTO, NVL(PRECIO, 0) FROM PRECIOS; DECODE TO_DATE(<expresion>, [<formato>]) TO_CHAR(<expresion>, [<formato>]) TO_NUMBER(<expresion>, [<formato>]) INSTR(<char>, <search_string>, <startpos>, <occurrence> ) REPLACE(<expresion>, <busqueda>, <reemplazo>) SUBSTR, UPPER, LOWER, ROWIDTOCHAR, RPAD(<expresion>, <longitud>, <pad_string> ) LPAD(<expresion>, <longitud>, <pad_string> ) RTRIM, LTRIM, TRIM, MOD ORACLE Developer Forms 10g Programación 23
  • 24. Funciones, procedimientos y paquetes Funciones definidas por el usuario CREATE OR REPLACE /* Or replace es opcional */ FUNCTION fn_Obtener_Salario(p_empno NUMBER) RETURN NUMBER IS result NUMBER; BEGIN SELECT salary INTO result FROM employee WHERE emp_no = p_empno; return(result); EXCEPTION WHEN NO_DATA_FOUND THEN return 0; END ; ORACLE Developer Forms 10g Programación 24
  • 25. Funciones, procedimientos y paquetes Procedimientos Debemos especificar el tipo de datos de cada parametro. Al especificar el tipo de dato del parámetro no debemos especificar la longitud del tipo. Los parámetros pueden ser de entrada (IN), de salida (OUT) o de entrada salida (IN OUT). El valor por defecto es IN, y se toma ese valor en caso de que no especifiquemos nada. Create or replace PROCEDURE Actualiza_Salario(p_empno NUMBER, p_new_salario NUMBER default 100) /*podemos usar Default o :=*/ IS -- Declaracion de variables locales BEGIN -- Sentencias UPDATE employee SET salary = p_new_salario, hire_date = SYSDATE WHERE emp_no = p_empno; END Actualiza_Salario; ORACLE Developer Forms 10g Programación 25
  • 26. Funciones, procedimientos y paquetes Paquetes Un paquete es un conjunto de funciones y/o procedimiento. Permite facilitar la administración de los códigos (agrupaciones), y la seguridad (a nivel de paquete en vez de por función/procedimiento). En el paquete se pueden definir variable de alcance de todo el paquete (global variables). CREATE [OR REPLACE] PACKAGE <pkgName> IS -- Declaraciones de tipos y registros públicas {[TYPE <TypeName> IS <Datatype>;]} -- Declaraciones de variables y constantes publicas -- También podemos declarar cursores {[<ConstantName> CONSTANT <Datatype> := <valor>;]} {[<VariableName> <Datatype>;]} -- Declaraciones de procedimientos y funciones públicas {[FUNCTION <FunctionName>(<Parameter> <Datatype>,...) RETURN <Datatype>;]} {[PROCEDURE <ProcedureName>(<Parameter> <Datatype>, ...);]} END <pkgName>; ORACLE Developer Forms 10g Programación 26
  • 27. Funciones, procedimientos y paquetes CREATE [OR REPLACE] PACKAGE BODY <pkgName> IS -- Declaraciones de tipos y registros privados {[TYPE <TypeName> IS <Datatype>;]} -- Declaraciones de variables y constantes privadas -- También podemos declarar cursores {[<ConstantName> CONSTANT <Datatype> := <valor>;]} {[<VariableName> <Datatype>;]} -- Implementación de procedimientos y funciones FUNCTION <FunctionName>(<Parameter> <Datatype>,...) RETURN <Datatype> IS -- Variables locales de la función BEGIN -- Implementación de la función return(<Result>); [EXCEPTION] -- Control de excepciones END; PROCEDURE <ProcedureName>(<Parameter> <Datatype>, ...) IS -- Variables locales de la función BEGIN -- Implementación de procedimiento [EXCEPTION] -- Control de excepciones END; END <pkgName>; ORACLE Developer Forms 10g Programación 27
  • 28. Triggers Un trigger es un bloque PL/SQL asociado a una tabla, que se ejecuta como consecuencia de una determinada instrucción SQL (una operación DML: INSERT, UPDATE o DELETE) sobre dicha tabla. CREATE [OR REPLACE] TRIGGER <nombre_trigger> {BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN] [OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]} ON <nombre_tabla> [FOR EACH ROW [WHEN (<condicion>)]] DECLARE -- variables locales BEGIN -- Sentencias [EXCEPTION] -- Sentencias control de excepcion END <nombre_trigger>; ORACLE Developer Forms 10g Programación 28
  • 29. Triggers create or replace TRIGGER TR_EMP_AU Curso de SQL avanzado y PL/SQL basico para Oracle 10g (10.2) Pagina 40 / 44 AFTER UPDATE ON EMPLOYEE FOR EACH ROW WHEN (OLD.salary<>NEW.salary) DECLARE -- local variables BEGIN INSERT INTO emp_audit (emp_no,fecha,msg) VALUES (:NEW.emp_no,SYSDATE,'Salario modificado de '||:old.salary||' a '||:new.salary); END TRIGGER TR_EMP_AU; ORACLE Developer Forms 10g Programación 29
  • 30. Cierre Sitios Recomendados http://www.oracle.com/technetwork/index.html Sitio Oficial de Oracle http://www.orasite.com/ Comunidad y foros de consulta sobre Oracle todo en Español http://es.scribd.com/ Libros con mucho información de varias herramientas de desarrollo Instructor: Edwin Alfredo Romero Email: romero.espinoza@gmail.com Blog: www.ejecucion.wordpress.com Twitter: @Wirwin2009 Yo ruego a Dios, como si lo esperase todo de Él, pero trabajo como si lo esperase todo de mí.- Santo Tomas de Aquino ORACLE Developer Forms 10g Programación 30