PL/SQL

UIPR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


PL/SQL (SINTAXIS)

 

       La estructura de una rutina de PL/SQL es como sigue.

        DECLARE

                /* Sección declarativa, se declaran las variables de PL/SQL, “types”, “cursors” */

        BEGIN

                /* Sección ejecutable, aquí van los comandos de PL/SQL y de SQL */

        EXCEPTION

                /* Sección de manejo de errores, es opcional.

                Errores customizados de –20000 hasta –20999. */

        END;

                -- Especifica que es el final de la rutina de PL/SQL.

        /       -- Debe estar luego del END.

 

PL/SQL (ESTRUCTURA)

 

      Se pueden crear variables de diferentes tipos:

    NUMBER – valores numéricos (E.g. en caso de decimales el formato es NUMBER (7,2), 7 lugares de los cuales 2 son decimales; 99999.99)

    VARCHAR2 – valores alfanuméricos; si los valores no ocupan todo el espacio del campo, ORACLE solo utiliza el el espacio del dato.

    CHAR – valores alfanuméricos; si los valores no ocupan todo el espacio del campo, ORACLE rellena con espacios en blanco.

    DATE – fechas y tiempo (E.g. 22-JUL-2002)

    %TYPE – toma el tipo de variable en la tabla.

    %ROWTYPE – toma la tabla completa.

      Se pueden crear estructuras de control   

    IF-THEN-ELSE  ELSIF

    LOOP Y WHILE

 

 

PL/SQL (“BLOCKS”)

 

      “Anonymous Blocks” – son dinámicos y ejecutan una sola vez.

 

Ej.

DECLARE

BEGIN

END ;

/

 

      “Named Blocks” – son iguales a los anónimos la diferencia es que se le da un nombre.

 

Ej.

<<insert_into>>

DECLARE

BEGIN

END insert_into;

/

 

PL/SQL (“BLOCKS”)

 

      “Subprograms” – son “Procedures”, “Packages”, “Functions” que se almacenan en la base de datos.  Estos tienen nombres, y pueden ser ejecutados llamándolos en la aplicación.

      “Triggers” – son “blocks” que se almacenan en la base de datos con un nombre; a diferencia de los “Subprograms”,  estos ejecutan de acuerdo a un evento estipulado en su programación.

 

PL/SQL (LOOPS)

DECLARE

inscount integer := 0;

BEGIN

WHILE inscount < 10 LOOP

insert into corredord values (sysdate, user);

inscount := inscount + 1;

END LOOP;

END;

/

DECLARE

inscount integer := 0;

BEGIN

LOOP

insert into corredord values (sysdate, user);

inscount := inscount + 1;

EXIT WHEN inscount = 10;

END LOOP;

END;

/

 

PL/SQL (Ejemplo Variables)

DECLARE

   id VARCHAR2(14):=  111223333';

   ins VARCHAR2(25);

BEGIN

   select asegurado INTO ins from corredor

   where id_cor = id;

  IF ins = 'NO' THEN

    DBMS_OUTPUT.PUT_LINE('El corredor con el seguro social '||id||' no está

    asegurado.');

  ELSE

    DBMS_OUTPUT.PUT_LINE('El corredor con el seguro social '||id||' puede correr.');

  END IF;

EXCEPTION

   WHEN no_data_found THEN

   raise_application_error (-20011, 'El corredor no existe.');

END;

/

 

PL/SQL (Ejemplo Variables %TYPE)

 

DECLARE

   id VARCHAR2(14):= '111223333';

   ins corredor.asegurado%TYPE;

BEGIN

   select asegurado INTO ins from corredor

   where id_cor = id;

  IF ins = 'NO' THEN

   DBMS_OUTPUT.PUT_LINE('El corredor con el seguro social '||id||' no está asegurado.');

  ELSE

   DBMS_OUTPUT.PUT_LINE('El corredor con el seguro social '||id||' puede correr.');

  END IF;

EXCEPTION

   WHEN no_data_found THEN

   raise_application_error (-20011, 'El corredor no existe.');

END;

/

 

PL/SQL (Ejemplo Variables %ROWTYPE)

 

DECLARE

   corredorpuede corredor%ROWTYPE;

BEGIN

   select * INTO corredorpuede from corredor

   where id_cor = '111223333';

  IF corredorpuede.asegurado = 'NO' THEN

    DBMS_OUTPUT.PUT_LINE('El corredor con el seguro social '||corredorpuede.id_cor|| ' llamado ' ||corredorpuede.nombre|| ' no está asegurado.');

  ELSE

    DBMS_OUTPUT.PUT_LINE('El corredor con el seguro social '||corredorpuede.id_cor|| ‘llamado ' ||corredorpuede.nombre|| ' está asegurado.');

  END IF;

EXCEPTION

   WHEN no_data_found THEN

   raise_application_error (-20011, 'El corredor no existe.');

END;

/

 

PL/SQL (CURSORES)

 

CURSOR – Cuando se procesa un “SQL Statement” ORACLE lo distribuye en un área de memoria conocida como el “context area”.  El cursor actua como un manejador de “context area”.  Por medio del cursor, un programa PL/SQL puede controlar el “context area” y lo que le sucede mientras el “statement” del cursor es procesado.

Cursor Explícito – es aquel que se le dá un nombre el cual realiza la ejecución por medio de un SELECT.

Cursor Implícito – es aquel que se utiliza para los “SQL Statement” de INSERT, UPDATE, DELETE. Los SELECT deben ser de una sola fila de resultado.

 

PL/SQL (CURSORES SYNTAXIS)

 

CURSOR EXPLICITO – la creación de un cursor explícito tiene cuatro pasos.

             DECLARE -  aquí se le da nombre al cursor asociándolo con un SELECT.

             OPEN - abrir el cursor para la búsqueda de datos.

             FETCH – desplega el resultado de los datos obtenidos por el cursor en una variable.

             CLOSE – es importante cerrar el cursor ya que su funcionamiento se basa en un “LOOP”.

             De la 2 a la 4 van entre el BEGIN y END de la estructura PL/SQL.

 

 

PL/SQL (CURSORES DETALLES)

 

             Las variables que van a utilizar los cursores deben estar en la sección DECLARE.

             Las variables que se declaran con %TYPE deben ir antes de la declaración del cursor.

             Las varibles que se declaran con %ROWTYPE deben ir después de la declaración del cursor.

 

PL/SQL (CURSORES Ejemplo %TYPE)

 

DECLARE

     c_id_cor corredor.id_cor%TYPE;

     c_nombre corredor.nombre%TYPE;

     cursor prueba_cur IS

     select id_cor, nombre from corredor;

BEGIN

  OPEN prueba_cur;

    LOOP

      FETCH prueba_cur INTO c_id_cor, c_nombre;

      EXIT WHEN prueba_cur%NOTFOUND;

      dbms_output.put_line(c_id_cor||' '|| c_nombre||' '||user);

    END LOOP;

  CLOSE prueba_cur;

END;

/

 

PL/SQL (CURSORES Ejemplo %ROWTYPE)

 

DECLARE

     cursor prueba_cur IS

     select * from corredor;

     corredores corredor%ROWTYPE;

BEGIN

  OPEN prueba_cur;

    FETCH prueba_cur INTO corredores;

      WHILE prueba_cur%FOUND LOOP

          dbms_output.put_line(corredores.id_cor||' '||  corredores.nombre||' '||user);

    FETCH prueba_cur INTO corredores;

       END LOOP;

  CLOSE prueba_cur;

END;

/

 

PL/SQL (CURSORES Ejemplo EXCEPTION)

 

DECLARE

     CURSOR prueba_cur IS

     select * from inscripcion;

     inscripciones inscripcion%ROWTYPE;

     invalidvalue EXCEPTION;

BEGIN

  OPEN prueba_cur;

    FETCH prueba_cur INTO inscripciones;

       IF prueba_cur%NOTFOUND THEN

        RAISE invalidvalue;

       END IF;

    WHILE prueba_cur%FOUND LOOP

      dbms_output.put_line(inscripciones.fecha_com||' '|| inscripciones.costo||' '||user);

    FETCH prueba_cur INTO inscripciones;

    END LOOP;

  CLOSE prueba_cur;

EXCEPTION

  WHEN invalidvalue THEN

  raise_application_error (-20111, 'No hay valores en la tabla.');

END;

/

 

PL/SQL (PROCEDURE SINTAXIS)

 

     Cuando creamos un “PROCEDURE” la estructura general es como sigue:

 

CREATE or REPLACE PROCEDURE ProcedureName(

     p_variable1 IN OUT date,

     p_variable2 IN OUT number,

     p_variable3 IN OUT varchar2,

       p_variableN IN OUT tablename.column%TYPE) AS

BEGIN

     insert into tablename VALUES (p_variable1, p_variable2, p_variable3, p_variableN);

  COMMIT;

END ProcedureName;

/

 

PL/SQL (PROCEDURE DETALLES)

 

             En los “PROCEDURES” no se utiliza %ROWTYPE.

             La variable se declara IN OUT cuando por medio del “PROCEDURE” tanto se insertan o se obtienen datos de esa variable en las tablas.

             La variable se declara IN cuando por medio del “PROCEDURE” solo se insertan datos de esa variable en las tablas.

             La variable se declara OUT cuando por medio del “PROCEDURE” solo se obtienen datos de esa variable en las tablas.

             El “PROCEDURE” se llama desde una programación.

 

PL/SQL (PROCEDURE Ejemplo)

 

CREATE or REPLACE PROCEDURE AddNewIns(

     p_fecha IN date,

     p_costo IN number,

     p_id IN varchar2,

     p_fecha_com IN date) AS

BEGIN

     insert into inscripcion values (p_fecha, p_costo, p_id, p_fecha_com);

  COMMIT;

END AddNewIns;

/

 

PL/SQL (PROCEDURE LLAMARLO)

 

DECLARE

     p_cant NUMBER(1) := 1;

     p_precio NUMBER(10) := 15;

     p_costo NUMBER(10) := p_cant * p_precio;

BEGIN

     AddNewIns(SYSDATE, p_costo, ‘222334444', '15-DEC-02');

END;

/

 

PL/SQL (TRIGGERS SINTAXIS)

 

CREATE or REPLACE TRIGGER TriggerName

     before insert or update or delete ON tablename

     for each row

BEGIN

     insert into tablename values (sysdate, user);

END TriggerName;

/

 

PL/SQL (TRIGGERS DETALLES)

 

              INSERT, UPDATE, DELETE son los DML que se especifican para que se dispare “TRIGGER”, existen otros más avanzados.

              BEFORE, AFTER especifica cuando en la ocurrencia del DML se dispare el “TRIGGER”.

              Los “TRIGGERS”  se pueden desactivar o reactivarlos.

        alter TRIGGER triggername disable;

        alter TRIGGER triggername enable;

              Para saber si un TRIGGER está activo:

     SELECT status from user_triggers

     where trigger_name = UPPER(‘triggername’);  El UPPER es preventivo por si se crean “TRIGGERs” en letras minúsculas.  ORACLE trae los datos de las tablas que crea se crean en ORACLE en mayúsculas, aunque se hayan creado en minúsculas por el usuario.  (No se confunda; las tablas que usted crea le trae los valores como fueron insertados en las tablas).

 

 

PL/SQL (TRIGGERS Ejemplo)

 

CREATE or REPLACE trigger AlterCorredor

     before insert or update or delete on corredor

     for each row

BEGIN

     insert into corredord values (SYSDATE, USER);

END AlterCorredor;

/

PL/SQL (“Debugging”)

 

Cuando creamos un objeto de PL/SQL y nos presenta un “Warning” escribimos:

     Select * from user_errors;

     Con esto recibimos un “feedback” de que estamos haciendo mal en la codificación.

 

Hosted by www.Geocities.ws

1