tema 17

24
TEMA 17: FUNDAMENTOS DEL LENGUAJE PL/SQL 1. Introducción En la unidad anterior hemos estudiado las características generales de PL/SQL y su utilización desde una perspectiva global y un tanto intuitiva. En esta unidad nos preocuparemos a ver los principales elementos del lenguaje: 1. Cuáles son los tipos de datos 2. Variables 3. Operadores y Expresiones 4. Reglas sintácticas 5. Estructuras de control 6. Procedimientos y Funciones 2. Tipos de datos básicos PL/SQL dispone de los mismos tipos de datos de SQL además de los suyos propios. CHAR(L) Almacena cadenas de caracteres de longitud fila. Opcionalmente podemos configurar la longitud máxima entre paréntesis. Las posiciones no usadas se rellenan con blancos. Ejemplos: Nombre CHAR(25); Letra_nif CHAR; Situación CHAR(); esta mal VARCHAR2(L) Almacena caracteres de longitud variable cuyo limite máximo se debe especificar en numero de bytes (L). Ejemplos: Nombre VARCHAR2(25); Letra_nif VARCHAR2; esta mal

Upload: antonio-gonzaga

Post on 08-Aug-2015

37 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tema 17

TEMA 17: FUNDAMENTOS DEL LENGUAJE PL/SQL

1. Introducción

En la unidad anterior hemos estudiado las características generales de PL/SQL y su utilización desde una perspectiva global y un tanto intuitiva.En esta unidad nos preocuparemos a ver los principales elementos del lenguaje:

1. Cuáles son los tipos de datos2. Variables3. Operadores y Expresiones4. Reglas sintácticas5. Estructuras de control6. Procedimientos y Funciones

2. Tipos de datos básicos

PL/SQL dispone de los mismos tipos de datos de SQL además de los suyos propios.

CHAR(L) Almacena cadenas de caracteres de longitud fila. Opcionalmente podemos configurar la longitud máxima entre paréntesis. Las posiciones no usadas se rellenan con blancos.Ejemplos:Nombre CHAR(25);Letra_nif CHAR;Situación CHAR(); esta mal

VARCHAR2(L) Almacena caracteres de longitud variable cuyo limite máximo se debe especificar en numero de bytes (L).Ejemplos:Nombre VARCHAR2(25);Letra_nif VARCHAR2; esta mal

LONG(L) Igual que el varchar2.Ejemplos:Observaciones LONG(5000);

NUMBER(P,E)P: Precisión: Nº de dígitosE: Nº de decimales

La precisión (P) y la escala (E) son opcionales, pero si se especifica la escala hay que especificar la precisión.Ejemplos:Importe NUMBER(5,2);Si al asignar un valor se excede la escala, se producirá un truncamiento, si se excede la precisión se producirá un error.PL/SQL usa de subtipos de tipo NUMBER, que son: DECIMAL, INTEGER, NUMERIC, REAL, SMALLINT.

Page 2: Tema 17

BINARY_INTEGER Es un tipo numérico entero que se almacena en memoria en formato binario para facilitar los cálculos, se usa en contadores. Sus subtipos son: NATURAL, POSITIVE.

PLS_INTEGER Es similar al BINARY_INTEGER pero con 2 ventajas: más rápido y si hubiera un desbordamiento se produciría un error y se levantaría la excepción correspondiente.

BOOLEAN Almacena tres valores: TRUE, FALSE Y NULL

DATE Almacena fechas, su formato por defecto es: dd/mm/aa

RAWIDRAW(L)LONG RAW

Se pueden hacer conversiones implícitas:TO_CHARTO_NUMBERTO_DATE

PL/SQL dispone también de tipos más complejos:a) Registrosb) Referencias c) Lob para objetos de gran tamañod) Permiten definir objetos.

3. Identificadores

Se usan para nombrar los objetos que se intervienen en un programa, variables, constantes, cursores, excepciones, procedimientos, funciones, etiquetas.En PL/SQL pueden tener los identificadores hasta 30 que empiezan por una letra, que pueden ir seguidas por letras, números y otros caracteres especiales.No identifica entre mayúsculas y minúsculas.

4.Variables

Toda variable en PL/SQL debe declararse en la sección correspondiente antes de su uso.

Sintaxis:

<nombre_variable> <tipo> [NOT NULL][ := { DEFAULT | VALOR }]

DECLAREImporte number(8,2);Contador number(2,0):=0;Nombre char(20) NOT NULL := ‘Miguel’;

Page 3: Tema 17

Para cada variable se debe especificar el tipo, NO se puede declarar como en otros lenguajes una lista de variables del mismo tipo y a continuación su tipo.La opción NOT NULL fuerza a que la variable tenga siempre ese valor, si se usa deberá inicializarse con la opción DEFAULT o con := para una asignación.Sino se inicializan las variables en PL/SQL se garantiza que su valor es NULL

4.1. Uso de atributos %TYPE y %ROWTYPE

En lugar de indicar explícitamente el tipo y la longitud de una variable, existe la posibilidad de utilizar los atributos %TYPE y %ROWTYPE para declarar las variables que sean del mismo tipo que otros objetos ya definidos.

%TYPE declara una variable del mismo tipo que otra, o que una columna de una tabla.

Ejemplo:

DECLARE

Total importe%TYPE;

Total recibe el mismo tipo que la variable importe.

DECLARE

Nombre clientes.clt_nom%TYPE;

La variable nombre recibe el tipo de la columna de la tabla clientes.

Al declarar una variable del mismo tipo que otro objeto usando los atributos %TYPE y %ROWTYPE, se hereda el tipo y la longitud, pero no son posibles los atributos NOT NULL, y los valores por defecto que tuviera definido el objeto original.

4.2. Constantes

La sintaxis en las constantes seria:

<nombre_cte> CONSTANT <tipo>:=<valor>;

En el caso de las constantes deberá asignarse siempre un valor en la declaración.

Ejemplo:

DECLARE

PCT_IVA CONSTANT REAL := 1.16;

Page 4: Tema 17

4.3 Ámbito y visibilidad de las variables

El ámbito de una variable es el bloque en el que se declara y los bloques hijos de dicho bloque. La variable será local para el bloque en que ha sido declarado y global para los bloques hijos de éste. No obstante las variables declaradas en los bloques hijos no son accesibles desde el bloque padre.

DECLARE

V1 NUMBER;

BEGIN

......V1 := 1;

DECLARE

V2 NUMBER;

BEGIN

V2 := 2;.......V1 := V2;

END;

V2 := V1; Error porque la variable V2 es sólo local a su procedimiento

END;

En este ejemplo podemos observar que V1 es accesible para los 2 bloques, es local al bloque padre y global al bloque hijo, mientras que V2 es accesible para el bloque hijo.Las variables se crean al comienzo del bloque y dejan de existir una finalizada la ejecución del bloque en el que han sido declaradas.Se pueden usar etiquetas y cualificadores para deshacer ambigüedades, en el caso de que un identificador local coincida con una global, sino se indica “+” se hace referencia al local.

<<padre>> etiquetaDECLARE

V CHAR;

BEGIN.......DECLARE

V CHAR;

Page 5: Tema 17

BEGIN

V := padre.V;........

END;

END;

5.Operadores

El operador de asignación se usa con “ := “Los operadores lógicos son “AND”, ”OR” y “NOT”.El operador de concatenación seria “ || “;Comparaciones “ = ”, “!=”, “<=”, “>=”, IS NULL, BETWEEN, LIKE, INSuboperadores aritmeticos “+”, ”-“, ”*”, ”/”, ”**”

5.1. Orden de precedencia de los operadores

El orden de precedencia o prioridad de los operadores determina el orden de evaluación de los operandos de una expresión.

Prioridad Operador Operación1 “**” y “NOT” Exponenciación y Negación2 “*” y “/” Multiplicación y División3 “+”, “-“ y “ || “ Mas, Menos y

concatenación4 “=”, “!=”, “>=”, “<=”, IS

NULL, BETWEEN, LIKE y IN

5 AND6 OR

Evaluación por cortocircuito

PL/SQL da por concluida la evaluación de una expresión lógica cuando el resultado ha quedado determinado por la evaluación de una parte de ella. Esto ocurre en los “AND” y los “OR”.

6. Funciones

En PL/SQL se pueden usar las distintas funciones SQL que se han estudiado. Se deben tener en cuenta 2 aspectos:

a) La función no modifica el valor de las variables o expresiones que se pasen como argumento sino que devuelve un valor a partir de dicho argumento.

Page 6: Tema 17

b) Si a una función se le pasa un valor uno en la llamada normalmente devolverá un valor nulo.Ejemplo: Hacer un procedimiento en PL/SQL que devuelva la fecha

BEGINDBMS_OUTPUT.PUT_LINE(‘La fecha es ‘||TO_CHAR(SYSDATE,'DAY DD MONTH YYYY'));END; /

Que daría:

La fecha es MIÉRCOLES 23 ENERO 2002PL/SQL procedure successfully completed.

7. Estructuras de control

Ejemplos:

Existe una opción dentro del FOR que es el “REVERSE”, utilizando el WHILE y utilizando el FOR. Este ejemplo toma la cadena hola y la visualiza al revés.

FOR:

DECLARE

CADENA VARCHAR2(10);

BEGIN

FOR i IN REVERSE1..LENGTH('HOLA') LOOPCADENA:=CADENA||SUBSTR('HOLA',i,1);END LOOP;DBMS_OUTPUT.PUT_LINE (CADENA);

END;/

WHILE:

DECLARE

CADENA VARCHAR2(10);i number;

BEGINi:=length('hola');WHILE i > 0 LOOPCADENA:=CADENA||SUBSTR('HOLA',i,1);

Page 7: Tema 17

i:=i-1;END LOOP;DBMS_OUTPUT.PUT_LINE (CADENA);

END;/

Ahora lo haremos pasándole una palabra:

CREATE OR REPLACE PROCEDURE VER_CONTRARIO(A VARCHAR2)

IS

CADENA VARCHAR2(10);i NUMBER;

BEGIN

FOR i IN REVERSE1..LENGTH(A) LOOPCADENA:=CADENA||SUBSTR(A,i,1);END LOOP;DBMS_OUTPUT.PUT_LINE (CADENA);

END;/

Le pasamos una palabra:

EXEC VER_CONTRARIO('HOLA');

Que daría:

ALOH

PL/SQL procedure successfully completed.

8. Consideraciones para el manejo de bucles

Los bucles se pueden etiquetar para obtener una mayor legibilidad.

Ejemplo:

<<mibucle>>

LOOP

<sentencias>;

Page 8: Tema 17

END LOOP mibucle;

9. Subprogramas: Procedimientos y Funciones

Los subprogramas son bloques PL/SQL que tienen un nombre, pueden recibir parámetros y en el caso de las funciones pueden devolver un valor. Se guardan en la base de datos y se pueden ejecutar invocándolos desde otros subprogramas o herramientas.En todo subprograma podemos distinguir:

a) La cabecera o especificación del subprograma, que contendrá:

1) el nombre del programa 2) la definición del parámetro con sus tipos3) el tipo de valor de retorno en el caso de las funciones

b) El cuerpo del subprograma, es un bloque PL/SQL que incluye declaraciones (opcional), instrucciones y manejos de excepciones (opcional)

9.1 Procedimientos

Sintaxis:

CREATE OR REPLACE PRODECURE <nombre_procedimiento>[(<lista_parámetros>)]

IS

<declaraciones>;BEGIN

<instrucciones>;

[EXCEPTION

<excepciones>;]

END [<nombre_procedimiento>];

En la lista de parámetros se encuentra la declaración de cada uno de los parámetros separados por comas ”,”.El formato genérico de cada declaración será:

<nombre_variable> [IN | OUT | IN OUT] <tipo_dato> [{ := | DEFAULT }<valor>]

Al indicar los parámetros debemos especificar el tipo pero no el tamaño, en caso de que no tenga parámetros no usaremos paréntesis “( )”. Las declaraciones se pueden hacer

Page 9: Tema 17

después de “IS” que equivale al “DECLARE” en este caso se debe indicar la longitud de las variables locales.Para crear un procedimiento lo haremos usando “CREATE [OR REPLACE]”, si el procedimiento no existía lo crea y sino lo sustituye.

Ejemplo: hacer un procedimiento llamado cambiar_población que cambiara la población, y los parámetros serán el numero del cliente y la nueva población. La salida será el numero del cliente la antigua población y la nueva población.

CREATE OR REPLACE PROCEDURE CAMBIAR_POB(NUM CLIENTES.CLT_NUM%TYPE,NUEVA_POB CLIENTES.CLT_POB%TYPE)

IS

POB CLIENTES.CLT_POB%TYPE;

BEGIN

SELECT CLT_POB INTO POB FROM CLIENTESWHERE CLT_NUM = NUM;UPDATE CLIENTES SET CLT_POB = NUEVA_POBWHERE CLT_NUM = NUM;

DBMS_OUTPUT.PUT_LINE ('EL NUMERO DE CLIENTE ES '||NUM);DBMS_OUTPUT.PUT_LINE ('SU ANTIGUA POBLACION ES '||POB);DBMS_OUTPUT.PUT_LINE ('SU NUEVA POBLACION ES '||NUEVA_POB);

END;/Lo compilamos ejecutamos y le pasamos un argumento:

EXEC CAMBIAR_POB(1,'ROTA');

Que daría:

EL NUMERO DE CLIENTE ES 1SU ANTIGUA POBLACION ES MADRIDSU NUEVA POBLACION ES ROTA

PL/SQL procedure successfully completed.

Para invocar al procedimiento lo que hay que hacer es compilarlo y después ejecutarlo.

9.2. Funciones

Las funciones tienen una estructura y funcionalidad similar a los procedimientos, pero a diferencia de ellos éstos devuelven un valor.

Sintaxis:

Page 10: Tema 17

CREATE OR REPLACE FUNCTION <nombre_función> [(lista_parámetros>)]

RETURN <tipo_valor_devuelto>

IS

<declaraciones>;

BEGIN

<instrucciones>;

RETURN <expresión>;

EXCEPTION

<expresiones>;

END [<nombre_función>];

Los parámetros tienen la misma sintaxis en las funciones que los procedimientos, y es valido todo lo indicado para ello. La cláusula “RETURN” de la cabecera retorna el tipo de valor que devuelve la función, en el cuerpo del programa se hará efectivo este retorno, utilizando dicha cláusula “RETURN” junto con la expresión cuyo valor se devolverá.Esta cláusula devuelve el control al programa que llamo a la función, asignando el valor devuelto por la función al identificador de la misma en el punto de la llamada.De manera análoga a los procedimientos para crear o modificar una función, “CREATE OR REPLACE FUNCTION”.

Ejemplo: función que le pasamos el numero y nos devuelve el apellido del cliente.

Debemos hacer 2 partes, una es la función y después un bloque en el que llamamos a la función mediante DBMS_OUTPUT.PUT_LINE (nombre_función (lista_parámetros));

CREATE OR REPLACE FUNCTION BUSCAR_APELLIDO(NUM CLIENTES.CLT_NUM%TYPE)

RETURN VARCHAR2

IS

APELL CLIENTES.CLT_APELL%TYPE;

BEGIN

SELECT CLT_APELL INTO APELL FROM CLIENTESWHERE CLT_NUM = NUM;

Page 11: Tema 17

RETURN APELL;END;/

El bloque seria:

BEGIN

DBMS_OUTPUT.PUT_LINE (BUSCAR_APELLIDO(1));

END;/

Que daría:

Input truncated to 1 charactersBORRAS

PL/SQL procedure successfully completed.

9.3 Parámetros

Los subprogramas usan parámetros para pasar y recibir información.Hay dos tipos:

a) Parámetros actuales o reales: son las variables o expresiones indicadas en la llamada a un subprograma. Las que pasamos como parámetro.

b) Parámetros formales: son las variables declaradas en la especificación del subprograma. Las que se encuentran dentro del subprocedimiento o función.

Si es necesario PL/SQL hará la conversión automática de tipos, sin embargo los tipos de los parámetros actuales y los correspondientes parámetros formales deben ser compatibles.Podemos hacer el paso de parámetros usando las notaciones posicional, nominal y mixta.

Notación posicional: el compilador asocia los parámetros actuales a los formales basándose en la posición.

Notación nominal: el símbolo “=>” después de parámetro actual y antes del parámetro formal indica al compilador la correspondencia.

Notación mixta: consiste un usar ambas notaciones con la restricción de que la notación posicional debe preceder a la nominal.

Ejemplo:cambiar_población(numero, población) posicionalcambiar_población(numero => num_cliente, población => nueva_población);

nominal

Page 12: Tema 17

cambiar_población(población => nueva_población, numero => num_cliente); nominal

cambiar_población(numero, población=> nueva_población); mixta

Valores por defecto en el paso de parámetros

Los parámetros en modo IN(entrada) estos parámetros se pueden inicializar con valores por omisión, es decir, indicando al subprograma que en el caso que no se pase el parámetro correspondiente asuma un valor por defecto.

Tipos de parámetros

Tipo Características y usosIN Permite pasar valores a un subprograma, el

parámetro actúa como una constante, es decir, no se le puede asignar ningún valor. El parámetro actual puede ser una variable, una constante, un literal o una expresión.

OUT Permite devolver valores al bloque que llamo al subprograma. Dentro del subprograma, el parámetro actúa como una variable no inicializada, no puede intervenir en ninguna expresión salvo para tomar un valor. El parámetro actual debe ser una variable.

IN/OUT Permite pasar un valor inicial y devolver un valor actualizado. Dentro del subprograma actúa como una variable inicializada, puede intervenir en otras expresiones y puede tomar nuevos valores. El parámetro actual debe ser una variable.

Ejemplo: recibe una cantidad en pesetas y devuelve la cantidad equivalente en la moneda cuyo cambio se especifica como segundo parámetro.

1. Realizar primero un procedimiento que se llame cambiar_divisas pasándole como parámetro pesetas y factor y devuelve un valor.

2. Desde otro bloque llamado convertir que llama a cambiar_divisas.

1. CREATE OR REPLACE PROCEDURE CAMBIAR_DIVISAS(pesetas IN number,factor IN number,valor OUT number)

IS

BEGIN

Page 13: Tema 17

VALOR := PESETAS / FACTOR;

END;/

2.CREATE OR REPLACE PROCEDURE CONVIERTE(PESETAS NUMBER,FACTOR NUMBER)

ISV_VALOR NUMBER(8,3);

BEGIN

CAMBIAR_DIVISAS(PESETAS,FACTOR,v_VALOR);DBMS_OUTPUT.PUT_LINE ('El valor es '||V_VALOR);

END;/

La llamamos pasándole un argumento:

exec convierte(100,166.386);

Que daría:

El valor es ,601

PL/SQL procedure successfully completed.

Para borrar un subprograma al igual que otros objetos se usa la cláusula “DROP”, seguido del tipo de subprograma.

9.4 Subprogramas almacenados

Los subprogramas procedimientos o funciones se pueden compilar independientemente y almacenar en la base de datos de Oracle. Cuando creamos procedimientos o funciones desde SQLPLUS usando los comandos “CREATE PROCEDURE” o “CREATE FUNCTION”, Oracle automáticamente compila el código fuente, genera el código objeto llamado “P-código” y los guarda en el diccionario de datos.De esta forma quedan disponibles para su utilización.Los programas almacenados tienen 2 estados: “VALID” o “INVALID”.Si alguna de los objetos referenciados por el programa ha sido borrado o alterado desde la ultima compilación del programa, quedara en situación de no disponible y se compilara de nuevo automáticamente en la próxima llamada.Al compilar, Oracle determina si hay que compilar algún otro programa referido por el actual, y se puede producir una cascada de compilaciones.

Page 14: Tema 17

Estos estados se pueden comprobar en la vista “USER_OBJECTS” que tiene diversos campos, pero solo nos interesan object_name, object_type, status.También se puede encontrar el código en la vista “USER_SOURCE”Para volver a compilar un subprograma almacenado en la base de datos se usa el subcomando “ALTER” indicando “PROCEDURE” o “FUNCTION” según el tipo de subprograma.

Sintaxis:

ALTER {PROCEDURE | FUNCTION } nombre_subprograma COMPILE;

9.5 Subprogramas locales

9.6 Recursividad

PL/SQL implementa al igual que muchos lenguajes de programación, la posibilidad de escribir subprogramas recursivos.

Ejemplo: hacer el factorial de un numero.

CREATE OR REPLACE FUNCTION FACTORIAL(N INTEGER)

RETURN INTEGER

IS

BEGIN

IF N = 0 THEN

RETURN 1;

ELSE

RETURN N * FACTORIAL(N-1);

END IF;

END;/

El bloque seria:

BEGIN

DBMS_OUTPUT.PUT_LINE(FACTORIAL(3));

END;/

Page 15: Tema 17

Que daría:

6

PL/SQL procedure successfully completed.

10. Ejercicios

1. Indicar los errores que aparecen en las siguientes instrucciones y la forma de corregirlo.

DECLARENum1 number(8,2):=0;Num2 number(8,2) NOT NULL DEFAULT 0;Num3 number(8,2) NOT NULL;Cantidad integer(3); INTEGER no lleva tamañoPrecio, descuento number(6); precio no tendría tipoNum4, num1%rowtype; habria que quitar la coma para que Num4 sea

del tipo de la fila de num1Descuento CONSTANT integer; falta el valor

BEGIN.....END;/

2. Escribir un procedimiento que reciba 2 números y visualice sus sumas.

CREATE OR REPLACE PROCEDURE SUMAR(A INTEGER,B INTEGER)

IS

BEGIN

DBMS_OUTPUT.PUT_LINE('LA SUMA DE ' ||A|| ' Y ' ||B|| ' ES IGUAL A '|| (A+B));

END;/

Page 16: Tema 17

3. Codificar un procedimiento que reciba una cadena y la visualice al revés.

CREATE OR REPLACE PROCEDURE VER_ALREVES(A VARCHAR2)

ISCONTRARIO VARCHAR2(100);i INTEGER;

BEGIN

FOR i IN REVERSE1..LENGTH(A) LOOP

CONTRARIO := CONTRARIO||SUBSTR(A,i,1);

END LOOP;

DBMS_OUTPUT.PUT_LINE('LA CADENA ' ||A|| ' AL REVES ES ' || CONTRARIO);

END;/

4. Escribir una función que reciba una fecha y devuelva el año, el número correspondiente a esa fecha.

CREATE OR REPLACE FUNCTION FECHA(A DATE)

RETURN NUMBER

ISVALOR INTEGER;

BEGINVALOR:= TO_NUMBER(TO_CHAR(A,'YYYYY'));RETURN VALOR;

END;/

5. Escribir un bloque PL/SQL que haga uso del bloque anterior.

SQL> SET SERVEROUTPUT ONSQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE(FECHA('23/02/1990')); 3 END; 4 /19900

PL/SQL procedure successfully completed.

Page 17: Tema 17

6. Dado el siguiente procedimiento:

PROCEDURE crear_depart(V_num_dept depart.dept_num%type,V_dnombre depart.dnombre%type DEFAULT ‘PROVISIONAL’,V_loc depart.loc%type DEFAULT ‘PROVISIONAL’)

ISBEGIN

INSERT INTO departVALUES v_num,v_dnombre,v_loc)

END crear_depart;/

Indicar cuales de las siguientes llamadas son correctas y los incorrectos, en este ultimo caso escribir la llamada correcta usando la notación posicional ( en los casos que se pueda).

Crear_depart; hay que pasarle por lo menos un parametroCrear_depart(50);Crear_depart(‘COMPRAS’);necesita el numeroCrear_depart(50,’COMPRAS’);Crear_depart(‘COMPRAS’,50);esta mal el ordenCrear_depart(‘COMPRAS’,’VALENCIA’); falta el numeroCrear_depart(50,’COMPRAS’,’VALENCIA’);Crear_depart(’VALENCIA’,50,’COMPRAS’); mal el ordenCrear_depart(‘VALENCIA’,’COMPRAS’); falta el numeroCrear_depart(VALENCIA’,50); esta mal el orden

7. Desarrollar una función que devuelva el número de años completos que hay entre dos fechas que se pasen como argumento.

CREATE OR REPLACE FUNCTION anos_dir(fecha1 date, fecha2 date)RETURN NUMBERIS

V_anos_dir NUMBER(6);BEGIN

V_anos_dif:= ABS(TRUNC(MONTHS_BETWEEN(fecha2,fecha1)/12));RETURN v_anos_dif;END anos_dif;

8. Escribir una función que haciendo uso de la función anterior devuelva los trienios(3 años completos) que hay entre 2 fechas.

CREATE OR REPLACE FUNCTION trienios(fecha1 date,fecha2 date)RETURN NUMBERAS

V_trienos NUMBER(6);

Page 18: Tema 17

BEGINV_trienos:=TRUN(anos_dif(fecha1/fecha2)/3);RETURN v_trienios;

END;

9. Codificar un procedimiento que reciba una lista de hasta 5 números y visualice su suma.

CREATE OR REPLACE PROCEDURE sumar_5numeros(Num1 NUMBER DEFAULT 0,Num2 NUMBER DEFAULT 0,Num3 NUMBER DEFAULT 0,Num4 NUMBER DEFAULT 0,Num5 NUMBER DEFAULT 0,

ASBEGIN

DBMS_OUTPUT.PUT_LINE(num1+num2+num3+num4+num5);END sumar_5numeros;

10. Escribir una función que devuelva sólo caracteres alfabéticos sustituyendo cualquier otro carácter por blancos a partir de una cadena que se pasara en la llamada.

CREATE OR REPLACE FUNCTION sust_por_blancos(cad VARCHAR2)RETURN VARCHAR2AS

Nueva_cad VARCHAR2(30);Car CHARACTER;

BEGINFOR i IN 1..LENGTH(cad) LOOP

Car:=SUBSTR(cad,i,1);IF(ASCII(car) NOT BETWEEN 65 AND 90)AND (ASCII(car) NOT BETWEEN 97 AND 122) THEN

Car :=’’;END IF;Nueva_cad:=nueva_cad || car;

END LOOP;RETURN nueva_cad;

END sust_por_blancos;

11. Implementar un procedimiento que reciba un importe y visualice el desglose del cambio en unidades monetarias. 1,5,25,100,200,500,1000,2000,5000 al orden inverso en el que aparecen aquí enumeradas.

12. Codificar un procedimiento que permita borrar un empleado cuyo numero se pasara en la llamada.

Page 19: Tema 17

13. Escribir un procedimiento que modifique la localidad de un procedimiento que recibirá el número del departamento y la localidad nueva.

14. Visualizar todas los procedimientos y funciones en la base de datos y su situación.