You are on page 1of 58

Taller de Oracle. Base de Datos Oracle. SQL PL/SQL Developer Forms. Developer Report.

PL/SQL. Revisin del da anterior. Introduccin. Terminologa. Conceptos Bsicos de PL/SQL. Tipos comunes de datos. Componentes de PL/SQL. Estructuras de Control. Bucles. Excepciones. Cursores.

PL/SQL. Introduccin. Existen dos versiones de PL/SQL, como parte del motor de base de datos, y otro motor separado incluido en las herramientas de oracle (developer, procedure builder). El PL/SQL de herramienta tiene una sintaxis adicional, diseada para satisfacer los requisitos de las herramientas.

PL/SQL. Terminologa. Las palabras reservadas tienen un significado especial en PL/SQL, no se las puede utilizar como nombres de variables. Ejem. Declare, begin, end, number, loop, etc. Los tipos de datos define la clase de un elemento de informacin. Un bucle es una estructura de un programa informtico en la que un segmento de cdigo se ejecuta de forma repetitiva.

PL/SQL. Terminologa. Una condicin de salida es la parte del bucle donde se realiza una prueba con los datos y, si la prueba resulta exitosa, concluye el bucle. La estructura de control influye en el flujo de procesamiento de un programa. Si existen dos formas distintas de procesar los datos, el mecanismo utilizado para decidir que procesamiento se lleva a cabo.

PL/SQL. Terminologa. Un objeto almacenado es un segmento de cdigo PL/SQL almacenado en la base de datos. Un procedimiento es un fragmento nominado de cdigo PL/SQL que se almacena en la base de datos. Una funcin es, tambin, un fragmento de cdigo PL/SQL que se almacena en la base de datos.

PL/SQL. Terminologa. Un paquete es una coleccin de procedimientos y funciones que se han empaquetado juntos. Un procedimiento es un fragmento nominado de cdigo PL/SQL que se almacena en la base de datos. Un disparador de base de datos tambin es cdigo PL/SQL ejecutable. Los disparadores de base de datos se ejecutan antes o despus de una instruccin de insercin, actualizacin o eliminacin.

PL/SQL. Conceptos bsicos de PL/SQL. Caracteres permitidos de PL/SQL. Los operadores aritmticos. Los operadores relacionales. Smbolos especiales.

PL/SQL. Caracteres permitidos de PL/SQL. Cuando de programa en PL/SQL, se est limitado a los siguientes caracteres:
Todas las letras maysculas. Los dgitos 0 a 9. Los smbolos ()+-*/<>!;:.@%,#$&_|{}?[

Algunos de estos caracteres se utilizan para el cdigo, otros como operadores y operaciones relacionales.

PL/SQL. Los operadores aritmticos. Los siguientes son los operadores aritmticos ms comunes utilizados en PL/SQL.
operador + * ** / significado suma multiplicacin exponenciacin divisin sustraccin

PL/SQL. Los operadores relacionales. operador significado <> distinto de != distinto de > mayor que < menor que = igual

PL/SQL. Smbolos especiales. Los siguientes son los smbolos ms comunes que se emplean para la programacin con PL/SQL. smbolo significado () separador de lista ; fin de orden . elemento separador := asignacin || concatenacin -delimitador de comentario /* y */ delimitador de comentario

PL/SQL. Variables. Las variables deben comenzar por una letra (AZ) Opcionalmente, las variables pueden ir seguidas de una o ms letras, de nmeros (0-9), de los caracteres especiales $,#_ Las variables no deben ser ms largas de treinta caracteres. En los nombres de variables no se pueden incluir espacios.

PL/SQL. Variables. variable vlido razn 23_letras prueba_nombre prueba-nombre mas nombre nombre_de_variable_es_demasiado_largo num________son$$$$$ mas_$$$$$$ 31

PL/SQL. Variables. variable vlido razn 23_letras NO Debe comenzar por una letra prueba_nombre S prueba-nombre NO Slo se permiten ($,#,_) mas nombre NO No puede haber espacios blanco nombre_de_variable_es_demasiado_largo NO ms de 30 caracteres num___son$$$$$ SI mas_$$$$$$ SI 31 NO debe comenzar por una letra
Mayo - 2002

PL/SQL. Tipo comunes de datos. Un programa PL/SQL se escribe para manipular y visualizar muchos tipos diferente de datos. Los principales son:
VARCHAR2 NUMBER DATE BOOLEAN

Mayo - 2002

PL/SQL. Tipo comunes de datos. VARCHAR2 Es un tipo de dato alfanumrico de longitud variable. Puede tener hasta 32.767 bytes de longitud. Se declaran en la seccin declare y terminan en ;
nombre_variablevarchar2(longitud); nombre_variablevarchar2(10); nombre_variablevarchar2(10):= ESPOL;

Mayo - 2002

PL/SQL. Tipo comunes de datos. NUMBER Es un tipo de dato que se puede usar para representar todos los datos numricos.
campo_numero campo_numero campo_numero number(entero,decimal); number; number(4):=100;

Mayo - 2002

PL/SQL. Tipo comunes de datos. DATE Este tipo de dato se usa para almacenar fechas de longitud fija. La declaracin no contiene calificadores.
campo_fecha campo_fecha date; date:=sysdate;

Mayo - 2002

PL/SQL. Tipo comunes de datos. BOOLEAN Este tipo de dato es un conmutador que puede almacenar los estado true y false. Se puede comprobar y se escoge si es verdadero o falso.
valida valida boolean; boolean:= true;

Mayo - 2002

PL/SQL. Componentes de PL/SQL. Codificacin mediante estructuras de bloque. Declaracin de variables. Estructuras de control, incluyendo el control de programa, estructuras lgicas condicionales y estructuras de bloque. Tratamiento de excepciones. La estructura de <<no hacer nada>>

Mayo - 2002

PL/SQL. Estructura de Bloque. Los programas PL/SQL se escriben en bloques de cdigo que disponen de secciones independientes para las declaraciones de variables, el cdigo ejecutable y el tratamiento de excepciones (errores). Cuando se almacena el cdigo PL/SQL en la base de datos, el subprograma incluye una seccin de cabecera en la que se nombra a la unidad almacenada, se declara el tipo de programa y, luego, opcionalmente, se definen argumentos in, out e in out.
Mayo - 2002

PL/SQL. Estructura de Bloque. IN.- Read-only Cuando se especifica IN, el valor del parmetro es solo de ingreso OUT.-Write-only El valor del parmetro es solo de salida IN OUT.- El valor del parmetro es entrada y salida.

Mayo - 2002

PL/SQL. Estructura de Bloque PL/SQL de base de datos.


create procedure proc ( codigo nombre telefono error vl_error varchar2(100); begin null; end; number, in varchar2, number, in out varchar2) is

Mayo - 2002

PL/SQL. Estructura de Bloque PL/SQL de base de datos.


create function proc1 ( codigo nombre telefono error return boolean is vl_error varchar2(100); begin null; end; number, in varchar2, number, in out varchar2)

Mayo - 2002

PL/SQL. Estructura de Bloque PL/SQL.


Declare ...... Begin .... End;

Mayo - 2002

PL/SQL. Estructura de Bloque PL/SQL.


Declare ...... Begin .... Exception ....... End;

Mayo - 2002

PL/SQL. Estructura de Bloque PL/SQL. Los bloques PL/SQL pueden anidarse creando numerosos bloques de cdigo BEGIN/END en el interior de otro bloque.
Declare ...... Begin .... Begin ..... End; .............................. Exception ....... End;

Mayo - 2002

PL/SQL. La seccin declare. En esta parte de los bloques PL/SQL es donde se definen las variables.
Create procedure...... () as nombre varchar2(200); codigo number; begin ----------------------------------------declare nombre varchar2(200); codigo number; begin
Mayo - 2002

PL/SQL. Estructura de control. Es la parte ms importante en cualquier lenguaje de programacin. Veremos los siguientes temas: Control de programa. Tres tipos de estructura lgica if Cuatro tipos de estructura de bucle.

Mayo - 2002

PL/SQL. Control de programa. El control del programa est gobernado por el estado de las variables que usa y los datos que lee y escribe en la base de datos. Si deseamos visualizar las variables que se ejecutan en un bloque PL/SQL, debemos ejecutar las siguientes sentencias:
SQL> SET SERVEROUTPUT ON declare ... Begin .... DBMS_OUTPUT.PUT_LINE(...);
Mayo - 2002

PL/SQL. Tres tipos de estructura lgica if Cuando se escriben programas de computacin, se presentan situaciones en las que se debe comprobar una condicin; cuando se enva y resulta ser verdadera se hace algo, cuando es falso se hace otra cosa diferente. R1.- Cada orden if va seguida de su correspondiente then. La lnea que empieza con if no debe terminarse con punto y coma (;). R2.- Cada bloque de la instruccin if se termina con su correspondiente end if.

Mayo - 2002

PL/SQL. Tres tipos de estructura lgica if R3.- Solo puede haber un else con cada instruccin if. R4.- La lnea que comienza por else no se termina con punto y coma (;). R5.- No existe el correspondiente end if por cada elsif

Mayo - 2002

PL/SQL. IF THEN Esta estructura prueba una nica condicin. Si la condicin es verdadera, se ejecutan una o ms lneas de cdigo. Si la condicin es falsa, el control de programa para a la instruccin siguiente.
If var > 10 then var2 := var1 + 10; end if;

Mayo - 2002

PL/SQL. IF THEN Se pueden escribir instrucciones if-then anidadas.


if provincia = GUAYAS then if ciudad = GUAYAQUIL then ...... end if; end if;

Mayo - 2002

PL/SQL. IF THEN Se pueden escribir instrucciones if-then anidadas.


if provincia = GUAYAS then if ciudad = GUAYAQUIL then ...... end if; elsif provincia = PICHINCHA then ............ end if;

Mayo - 2002

PL/SQL. IF THEN Se pueden escribir instrucciones if-then anidadas.


if provincia = GUAYAS then if ciudad = GUAYAQUIL then ...... end if; elsif provincia = PICHINCHA then ............ else .... end if;
Mayo - 2002

PL/SQL. Cuatro tipos de estructura de bucle. Los bucles proporcionan la capacidad de ejecutar un proceso repetidas veces hasta su terminacin. Uno de los problemas de la codificacin de bucles es estar seguro de que el cdigo permite terminar cuando se ha satisfecho una condicin de salida.

Mayo - 2002

PL/SQL. LOOP-EXIT- END LOOP


cont loop := 1;

cont := cont + 1; if cont >= 100 then exit; end if; ..... end loop;

Mayo - 2002

PL/SQL. LOOP-EXIT WHEN- END LOOP


cont loop := 1;

cont := cont + 1; exit when cont >= 100 ..... end loop;

Mayo - 2002

PL/SQL. WHILE-LOOP-END LOOP


cont := 1; while cont <= 100 loop cont := cont +1; ..... end loop;

Mayo - 2002

PL/SQL. FOR-IN-LOOP-END LOOP La parte for in, se define la variable para el control del bucle. Una o ms instrucciones dentro del bucle, indican que se ejecuta hasta que la variable que controla el bucle alcanza el valor de la condicin de salida. La parte end loop, indica que termina el bucle
for cnt in 1..3 loop insert into.... Values (cnt...); end loop;
Mayo - 2002

PL/SQL. EXCEPCIONES Esta seccin es opcional en cada bloque. La seccin de excepciones es el mecanismo que se utiliza en PL/SQL para manejar las condiciones de error. Siempre que se produce un error durante la ejecucin de una seccin de cdigo PL/SQL, el control pasa inmediatamente a la seccin de excepciones de los bloques en ejecucin.

Mayo - 2002

PL/SQL. EXCEPCIONES no_data_found Si una orden select intenta recuperar datos de acuerdo con sus condiciones, se produce esta excepcin cuando ninguna fila satisface los criterios de seleccin.
set serveroutput on declare nombre varchar2(60); error varchar2(2000); begin select descripcion into nombre from qa_proyectos where id_proyecto = 'ESPOL'; exception when no_data_found then error := sqlerrm; dbms_output.put_line('error: '||error); end;

Mayo - 2002

PL/SQL. EXCEPCIONES too_many_rows Dado que cada cursor implcito slo es capaz de recuperar una fila, esta excepcin detecta la existencia de ms de una fila.
declare nombre varchar2(60); error varchar2(2000); begin select descripcion into nombre from qa_proyectos where id_proyecto like '%A%'; exception when too_many_rows then error := sqlerrm; dbms_output.put_line('error: '||error); end;

Mayo - 2002

PL/SQL. EXCEPCIONES dup_val_on_index Esta excepcin detecta un intento de crear una entrada en un ndice cuyo valor ya existe en la(s) columna(s) clave(s).
declare nombre varchar2(60); error varchar2(2000); begin insert into a values (1); exception when dup_val_on_index then error := sqlerrm; dbms_output.put_line('error: '||error); end; Mayo - 2002

PL/SQL. EXCEPCIONES others Esta excepcin indica que se ha producido un error no manejado por oracle y se debe tomar las medidas necesarias para la ejecucin. Use siempre una rutina de tratamiento de errores when others. Si dispone de otras rutinas de tratamiento de errores en la seccin de excepciones, asegrese de que la clusula when others est en ltimo lugar.

Mayo - 2002

PL/SQL. EXCEPCIONES
declare nombre varchar2(60); error varchar2(4000); begin insert into b values ('hola'); exception when no_data_found then error := sqlerrm; dbms_output.put_line(sqlerrm); when dup_val_on_index then error := sqlerrm; dbms_output.put_line(sqlerrm); when too_many_rows then error := sqlerrm; dbms_output.put_line(sqlerrm); when others then error := sqlerrm; dbms_output.put_line('error: '||sqlerrm); end; Mayo - 2002

PL/SQL. Notas Adicionales.


alter session set nls_date_format = dd-mm-yyyy

Mayo - 2002

PL/SQL. CURSORES. PL/SQL utiliza cursores para gestionar las instrucciones SQL select. Son fragmentos de memoria asignados para procesar las instrucciones select. Existen cursores explcitos e implcitos

Mayo - 2002

PL/SQL. CURSORES EXPLCITOS. Para procesar instrucciones select que devuelve ms de una fila, se necesitan esta clase de cursores, combinados con una estructura de bucle. Se lo define en la seccin DECLARE.

Mayo - 2002

PL/SQL. CURSORES EXPLCITOS. Los pasos para esta operacin son los siguientes:
Nombrar los cursores. Abrir para usarlo. Extraer datos. Liberar memoria.

Mayo - 2002

PL/SQL. CURSORES EXPLCITOS.


declare cursor c1 is select ename from emp; nombre varchar2(20); begin open c1; fetch c1 into nombre; while c1%found loop fetch c1 into nombre; dbms_output.put_line('dato: '||nombre); end loop; close c1; end;
Mayo - 2002

PL/SQL. CURSORES EXPLCITOS. declare cursor c1 is select ename,empno from emp; begin for i in c1 loop dbms_output.put_line('dato: '||i.ename||'-'||i.empno); end loop; end;

Mayo - 2002

PL/SQL. CURSORES IMPLCITOS. Si se requiere utilizar la instruccin select en el cuerpo del bloque. No es necesario declararlo.

Mayo - 2002

PL/SQL. CURSORES IMPLCITOS. Con cada cursor implcito debe existir una palabra clave into. Al igual que los cursores explcitos, las variables que reciben los datos con la palabra clave into tienen que contener el mismo tipo de dato que las columnas asociadas. Los cursores implcitos slo pueden devolver una fila, por lo que debe controlarse con las excepciones anteriores.
No_data_found too_many_rows
Mayo - 2002

PL/SQL. CURSORES IMPLCITOS.

declare nombre varchar2(20); begin select ename into nombre from emp where empno = 7900; dbms_output.put_line('dato: '||nombre); end;

Mayo - 2002

PL/SQL. Qu mtodos utilizar?. Los cursores explcitos utilizan la variable del sistema PL/SQL: %found o %notfound. Dado que el cursor explcito se define manualmente en la seccin declare, el bloque PL/SQL puede estar ms estructurado, porque la definicin se la realiza en un lado y el cdigo del cursor en otro. La estructura <<for i... loop>> reduce la cantidad de cdigo y es ms fcil de usar.

Mayo - 2002