Está en la página 1de 34

Programación en PL/SQL -I

Manuel Chico Mena


Rosa Mª Zapata Calle

ÍNDICE DE CONTENIDOS

1. INTRODUCCIÓN A PL/SQL
2. FUNDAMENTOS DE PL/SQL

3. REGISTROS Y TABLAS EN PL/SQL

4. SQL EN PL/SQL

5. FUNCIONES PREDEFINIDAS

6. BIBLIOGRAFÍA

2
DASBD 2003-2004

1
Introducción a PL/SQL

I. Introducción
II. Características de PL/SQL
III. Versiones de PL/SQL y Oracle
IV. Arquitectura

3
DASBD 2003-2004

INTRODUCCION

PL/SQL (Procedural Language/SQL) es un lenguaje de programación para


acceder a base de datos Oracle desde varios entornos. Está integrado con el
servidor de datos por lo que el código es procesado rápida y eficientemente.
También se encuentra en las principales herramientas de Oracle (Forms,
Reports , Graphics,...)
¿Por qué PL/SQL?
SQL es un lenguaje de cuarta generación, es decir el lenguaje describe lo que
debe hacerse pero no cómo hacerse. En la sentencia:
DELETE FROM cliente WHERE saldo<10;
no sabemos de que forma se borrará los clientes indicados. Seguramente
recorrerá los registros en un determinado orden para seleccionarlos y borrarlos.
Pero el detalle de cómo tiene lugar esto lo desconocemos.

4
DASBD 2003-2004

2
INTRODUCCION

Los 4GL (lenguajes de cuarta generación) son bastante más simples y tienen
menos órdenes que los de 3GL (como C ó Pascal).Sin embargo tienen
limitaciones en cuanto al control de la secuencia de ejecución de
instrucciones, el uso de variables, la modularidad, gestión de errores.. Por
elllo se creó PL/SQL que combina la flexibilidad de SQL con la potencia y
configurabilidad de los 3GL.
PL/SQL añade respecto a SQL:
• Variables y tipos
• Estructuras de control: bucles y sentencias IF-THEN-ELSE
• Procedimientos y funciones
• Tipos de objetos y métodos ( PL/SQL 8.0 o superior )
Las construcciones procedimentales están perfectamente integradas con
Oracle SQL , lo cual da como resultado un lenguaje potente y estructurado. El
diseño de PL/SQL se basa en el lenguaje de tercera generación Ada. Los
programas PL/SQL se pueden almacenar en la BD como cualquier otro objeto
de ésta. 5
DASBD 2003-2004

CARACTERISTICAS

Modelo cliente-servidor
La mayor parte de las aplicaciones de BBDD utilizan este modelo. En la
máquina cliente está el programa PL/SQL y envía peticiones de información a
un servidor de base de datos. Las peticiones se llevan a cabo mediante SQL.

Se enviaría una petición por la red por cada orden SQL. Para evitar esta
afluencia de tráfico se empaquetan varias órdenes SQL en un bloque PL/SQL.

Con esto aumenta la velocidad de la aplicación.

PL/SQL no es un lenguaje creado para interactuar con el usuario, sino para


trabajar con la base de datos, por lo que no dispone de sentencias para
capturar datos por el teclado o visualizar en pantalla. Sin embargo incorpora el
paquete DBMS_OUTPUT con fines de depuración. Éste incluye, entre otros,
el procedimiento PUT_LINE que permite visualizar textos en pantalla :
DBMS_OUTPUT. PUT_LINE ( <expresión> )

6
DASBD 2003-2004

3
CARACTERISTICAS

La unidad básica en PL/SQL es el bloque. Todos los


programas PL/SQL están compuestos por bloques que
pueden estar situados de manera secuencial ( uno tras
otro ) o anidados. Cada bloque realiza una unidad lógica
de trabajo en el programa, estando así separadas unas
tareas de otras. El bloque tiene la siguiente estructura :

DECLARE
/*Sección declarativa */
BEGIN
/*Sección ejecutable */
EXCEPTION
/*Sección de manejo de excepciones*/
END;
7
DASBD 2003-2004

CARACTERISTICAS
Las únicas cláusulas obligatorias son BEGIN y END.
Las variables pueden ser del mismo tipo que las columnas de la base de
datos o de tipos adicionales :

DECLARE
v_nombre VARCHAR2(15);
v_AñoComienzo DATE;
v_contador BINARY_ INTEGER; -- tipo entero
o tipos definidos por el usuario:

DECLARE
TYPE t_RegistroEstudiante IS RECORD (
apellido VARCHAR2(10),
nombre VARCHAR2(10),
creditos NUMBER(3)
);

8
DASBD 2003-2004

4
CARACTERISTICAS
PL/SQL admite tipos de objetos que tienen métodos y
atributos ( a partir de PL/SQL 8.0) :
CREATE OR REPLACE TYPE ObjetoEstudiante As
OBJECT (
ID NUMBER(5),
apellido VARCHAR2(10),
nombre VARCHAR2(10),
-- a continuación pueden ir métodos
);

9
DASBD 2003-2004

VERSIONES DE PL/SQL y Oracle

Es importante saber la versión para aprovechar sus características :

Versión Versión Características


Oracle PL/SQL

6 1.0 Versión inicial


7.0 2.0 Subprogramas(procedimientos,funciones,paquetes y disparadores)
Paquete DBMS_OUTPUT
Tipos compuestos definidos por el usuario :Tablas y registros
7.1 2.1 Subtipos definidos por el usuario
Posibilidad de usar funciones predefinidas en órdenes SQL
PL/SQL dinámico con el paquete DBMS_SQL
7.2 2.2 Variables de cursor
7.3 2.3 Mejoras en las variables de cursores

8.0 8.0 Tipos de objetos y métodos


Procedimientos externos
Tipos de colección : tablas anidadas y varrays .
10
DASBD 2003-2004

5
ARQUITECTURA

Se trata de un motor o gestor que es capaz de ejecutar subprogramas y


bloques PL/SQL, que trabaja en coordinación con el ejecutor de órdenes SQL.

MOTOR PL/SQL

EJECUTOR
Órdenes DE
Bloque procedimentales ORDENES
Bloque PROCEDIMENTALES
PL/SQL PL/SQL
Órdenes SQL

Ejecutor de órdenes SQL

Procesamiento de un bloque PL/SQL

11
DASBD 2003-2004

Fundamentos de PL/SQL

I. Inicio al lenguaje
II. Tipos de datos
III. Ambito y visibilidad de variables
IV. Estructuras de control

12
DASBD 2003-2004

6
INICIO AL LENGUAJE

Tipos de bloques PL/SQL


• Bloques anónimos : Se construyen de manera dinámica y se ejecutan
una sóla vez.
• Bloques nominados : Son bloques anónimos con una etiqueta que le da
el nombre al bloque
• Subprogramas : procedimientos,fuciones y paquetes que se compilan y
son almacenados en la BBDD, disponibles para ser ejecutados. No
suelen cambiar y se ejecutan muchas veces mediante llamadas.
• Disparadores ( o triggers ) : Bloques nominados que se almacenan en la
BBDD. Se ejecutan de forma ímplicita cada vez que tiene lugar un suceso
de disparo, el cual puede ser una orden del DML que se ejecuta s obre una
tabla ( como insert, update o delete ).

13
DASBD 2003-2004

INICIO AL LENGUAJE

Estructura básica de un bloque


DECLARE
/*Sección declarativa */
BEGIN
/*Sección ejecutable */
EXCEPTION
/*Sección de manejo de excepciones*/
END;

14
DASBD 2003-2004

7
INICIO AL LENGUAJE

En la sección declarativa se localizan todas las variables, cursores, tipos,


funciones y procedimientos locales. Estos subprogramas solo están disponibles
para este bloque.
En la sección ejecutable se realiza el trabajo del bloque. En él hay tanto órdenes
SQL como órdenes procedimentales .
La sección de excepciones. Cuando hay un error en el programa el flujo se
desvía aquí, y se ejecutan las instrucciones que hallamos puesto.

15
DASBD 2003-2004

INICIO AL LENGUAJE

Ej:

DECLARE
v_num_empleados NUMBER(2);
BEGIN
INSERT INTO dep VALUES (99,’PROVISIONAL’),NULL);
UPDATE emp SET Dep_no=99 WHERE dep_no=20;
v_num_empleados:= SQL%ROWCOUNT;
DELETE FROM dep
WHERE dep_NO=20;
DBMS_OUTPUT.PUT_LINE ( v_num_empleados || Empleados
ubicados en provisional);
EXCEPTION
WHEN OTHERS THEN ROLLBACK;
RAISE_APPLICATION_ERROR (-20000, ‘ Error en la aplicación’);
END;
16
DASBD 2003-2004

8
INICIO AL LENGUAJE

Identificadores
Se utilizan para nombrar variables, procedimientos, funciones, cursores,
etiquetas...
No hay diferencia entre mayúsculas y minúsculas. Pueden tener hasta 30
caracteres empezando por una letra que puede ir seguida de letras,números y
los caracteres $,# y _.No pueden usarse palabras reservadas como DECLARE.
Podemos usar cualquier carácter imprimible y usar palabras reservadsa o
diferenciar entre mayúsculas y minúsculas usando comillas dobles , pero no es
recomendable.
Literales
Es un valor numérico,de carácter o booleano.
• De carácter. Son varios caracteres delimitados por comillas sim ples. Se pueden
asignar a los tipos Char o Varchar2. Para incluir la comilla simple hay que poner
2 comillas simples seguidas :
‘John’’s friends’.
17
DASBD 2003-2004

INICIO AL LENGUAJE

• Numéricos. Representa un valor entero o real que se puede asignar al tipo


NUMBER, precedidos opcionalmente del signo ( + o - ).También puede usarse
la notación científica.

Ejemplos:
-3.4
25.0 ó 25. (son tratados como reales)
-7.12e+12
• Booleano. Tres posibles valores : TRUE, FALSE o NULL. Se asignan a
variables booleanas .
Comentarios
• Monolínea:Comenzando con dos guiones
• Multilínea: Empiezan por el delimitador /* y finalizan con el delimitador */.
18
DASBD 2003-2004

9
INICIO AL LENGUAJE

Declaración de variables
Deben declararse en la sección correspondiente antes de
ser usadas. La sintaxis es :
<nombre_de_variable> <tipo> [CONSTANT] [NOT NULL][{
:= | DEFAULT } valor]
Si no se inicializa toma el valor NULL ( signigica valor
desconocido o no definido). Si se pone la cláusula NOT
NULL es obligatorio inicializarla. Con CONSTANT estamos
declarando una constante, hay que inicializarla y su valor no
puede ser luego modificado. Da igual usar el operador := o
DEFAULT. Sólo puede haber una declaración de variable
por línea.
19
DASBD 2003-2004

INICIO AL LENGUAJE

Operadores
• Asignación : Para dar valor a una variable se usa := . Ej: edad:=23;
• Lógicos: AND, OR y NOT.
• Concatenación: Para unir dos o más cadenas de caracteres se usa el operador
||.
• Comparación : <, >, =,<=, >=, != ó <>(distinto), IS NULL, BETWEEN, LIKE, IN
etc. ( igual que en SQL)
• Aritméticos: +, -, *, /, ** (exponenciación)
Precedencia de operadores:
Prioridad Operador
1 **, NOT
2 *, /
3 +, -, ||
4 =, !=, <, <,>=, >=, IS NULL, LIKE BETWEEN, IN
5 AND
6 OR 20
DASBD 2003-2004
6

10
TIPOS DE DATOS
Tipos PL/SQL
Hay 3 categorías de tipos : escalares, compuesto y referencias. Los
escalares no tienen componentes, mientras los compuestos sí. ( los tipos se
definen en el paquete STANDARD ).
Escalares
Existen las siguientes familias en esta categoría:
• Tipo numérico
- NUMBER
Sintaxis : NUMBER (P,S).
Contiene un valor entero o real. P es la precisión ( o nº de dígitos ) y S la
escala (o nº de valores decimales). P y S son opcionales, pero si se incluye
S hay que poner la P. Hay subtipos equivalentes por cuestiones de
compatibilidad con tipos de otras bases de datos :INT, INTEGER,REAL,
DECIMAL,NUMERIC ...

21
DASBD 2003-2004

TIPOS DE DATOS

BINARY_INTEGER
Se usa para valores que se usen durante cálculos y no
se almacenan en la base de datos.
- PLS_INTEGER
Es igual que el anterior, pero te avisa del error cuando
hay un desbordamiento en el cálculo.

22
DASBD 2003-2004

11
TIPOS DE DATOS
•Tipos de carácter
- VARCHAR2
Sintaxis: VARCHAR2 (L);
L es la longitud máxima de caracteres y es obligatorio indicarlo.
- CHAR
Sintaxis : CHAR (L);
Representa cadenas de caracteres de longitud fija. Se rellena con espacios en
blanco los caracteres sobrantes, algo que hay que tener en cuenta a la hora de
comparar cadenas. Es opcional, si no se indica la longitud es un solo carácter.
- LONG
Similar al tipo VARCHAR2. A diferencia del tipo LONG en las Bases de datos
que pueden almacenar hasta 2 Gigabytes, el tipo LONG de PL/SQL almacena
hasta 32.760 Bytes.
• Tipos Raw
Almacenan datos en formato binario, evitando la conversión entre conjunto de
caracteres que realiza Oracle y otras bases de datos. Hay 2 tipos: RAW y LONG
RAW.

23
DASBD 2003-2004

TIPOS DE DATOS

•Tipos de dato fecha


- DATE
Almacena también la hora. Para asignar valores a una variable de tipo DATE se
emplea la función TO_DATE ( convierte caracteres a tipo fecha ).
§ Tipo Rowid
Se puede almacenar un identificador de columna, que es una clave que identifica
unívocamente a cada fila de una base de datos. Para manipular es tos dato se
usa la función ROWIDTOCHAR cuya salida es : BBBBBBBB.RRRR.FFFF
donde B identifica el bloque dentro del archivo, R la fila dentro del bloque y F el
numero de archivo. Cada componente es un hexadecimal. Ej:
0000001E.00FF.0001
identifica el bloque 30 y la fila número 255 del bloque, en el archivo 1
§ Tipos booleanos
- BOOLEAN
Contiene sólo valores: True, False o Null.
Compuestos
Son registros,tablas y varrays ( éste a partir de PL/SQL 3.0 )

24
DASBD 2003-2004

12
TIPOS DE DATOS

§Tipos de referencia
REF
Cuando se declara una variable de tipo referencia puede
apuntar a distintas posiciones de memoria de durante la
vida del programa ( son como los punteros en C ).
Tipos LOB
Se emplean para objetos de gran tamaño ( hasta 4 GB ),
tales como imágenes, vídeo, gran cantidad de texto.... Es un
valor binario o de tipo carácter.

25
DASBD 2003-2004

TIPOS DE DATOS
Atributos %TYPE y %ROWTYPE
§%TYPE declara una variable del mismo tipo que otra o que una columna de una
base de datos. Ej:
total facturas.importe%TYPE; --si importe es un NUMBER(5,2), total es del
mismo tipo
--si cambia el tipo importe, la variable total también
cambia
•%ROWTYPE crea una variable de registro cuyos campos son los de las
columnas de la tabla o vista. Ej :
moroso clientes%ROWTYPE; --Declara la variable moroso que podrá contener 1
fila de clientes
moroso.nombre; --Para acceder a una columna se le pone un punto y el nombre
del campo.
Tanto en uno como en otro se hereda el tipo y la longitud pero no los posibles
atributos NOT NULL, ni valores por defecto.

26
DASBD 2003-2004

13
TIPOS DE DATOS

Subtipos definidos por el usuario


Es un tipo PL/SQL que se basa en un tipo existente
(DECIMAL e INTEGER son subtipos de NUMBER. Sintaxis:
SUBTYPE nuevo_tipo IS tipo_original;
Ej: DECLARE
SUBTYPE t_contador IS NUMBER; -- define el nuevo
subtipo
v_enumera t_contador; --declara una variable
del subtipo
SUBTYPE t_tipo_nombre IS
estudiante.nombre%TYPE;

27
DASBD 2003-2004

TIPOS DE DATOS

Conversiones
Para los tipos de una familia dada se pueden hacer conversiones sin niguna
restricción, salvo si se pretende convertir un tipo que ocupa más memoria a otro
de menos memoria.
Funciones de conversión de tipos de PL/SQL y SQL:
TO_CHAR(): Convierte su argumento en tipo VARCHAR2. El argumento puede
ser de tipo numérico o fecha.
TO_DATE(): Convierte a tipo DATE un tipo carácter.
TO_NUMBER(): a NUMBER un tipo carácter.
Utilizando estas funciones se realizan conversiones de tipo explícito ( es
recomendable ). Pero también se pueden hacer conversiones implícitas en las
que PL/SQL convierte de forma automática entre tipos de distintas familias. Ej:

28
DASBD 2003-2004

14
TIPOS DE DATOS

DECLARE
v_creditos VARCHAR2(5);
BEGIN
SELECT creditos INTO v_creditos FROM estudiante
WHERE id=100;
END;
La columna creditos es un tipo NUMBER(3). PL/SQL
convierte el dato numérico a una cadena de caracteres. Se
pueden realizar conversiones implíctas entre: caracteres y
numeros, caracteres y fechas

29
DASBD 2003-2004

AMBITO DE VARIABLES
Ambito y visibilidad de las variables
La variable será local para el bloque en el que se ha declarado y global para
los hijos de éste.
Sin un identificador local coincide con uno global, se usan etiquetas para
distinguirlos.
<<padre>>
DECLARE - - - - - - - - - - - - - - - - - Bloque PADRE
v1 CHAR;
BEGIN
...
DECLARE - - - - - - - - - - - - Bloque HIJO
v1 CHAR;
v2 NUMBER;
BEGIN
...
v1:= padre.v1; - - - - - - - - - - - - el primero es el identificador local
...
END;
v2:=v1; - - - - - - - -error : v2 desconocida
30
END;
DASBD 2003-2004

15
ESTRUCTURAS DE CONTROL PL/SQL

IF-THEN-ELSE
IF expresión_booleana THEN
secuencia de órdenes1;
[ELSIF
secuencia de órdenes2; ]
[ELSE
secuencia de órdenes3; ]
END IF;
BUCLES
Bucle simple
LOOP
EXIT [WHEN condición; ]
END LOOP;
El bucle se ejecuta mientras condición se evalue a verdadero ( si no, es bucle
infinito )
Bucles While
WHILE condición LOOP
secuencia de órdenes;
END LOOP;
31
DASBD 2003-2004

ESTRUCTURAS DE CONTROL PL/SQL

Bucles FOR numéricos


FOR contador IN [REVERSE ] límite inferior..límite superior LOOP
secuencia de órdenes;
END LOOP;
El índice del bucle se declara implícitamente como BINARY_INTEGER. Si se
declara anteriormente el índice ocultará la variable exterior al bucle, de la
misma forma que en bloques anidados.
El bucle FOR de cursor ya se verá.
Etiquetado de bucles
BEGIN
<<exterior>>
FOR v1 IN 1...50 LOOP
...
<<interior>>
FOR v2 IN 2..10 LOOP
...
EXIT exterior WHEN . . . ; - - - salida de ambos bucles
END LOOP interior; - - - la etiqueta es opcional;
END LOOP exterior;
END; 32
DASBD 2003-2004

16
REGISTROS Y TABLAS EN PL/SQL

I. Introducción a registros
II. Declaración de registros
III. Ejemplos
IV. Introducción a tablas
V. Definición y declaración
VI. Uso de variables
VII. Atributos
33
DASBD 2003-2004

REGISTROS EN PL/SQL

n El concepto de registro en PL/SQL es igual al de la mayoría de los


lenguajes de programación (estructuras de C).Se trata de una
estructura compuesta de otras más simples, llamadas campos , que
pueden ser de distintos tipos.
n Anteriormente hemos usado el atributo ROWTIME para crear una
estructura de datos idéntica a la fila de una tabla .Esta estructura de
datos es un registro. Esta forma de crear registros es muy sencilla y
rápida pero tiene algunas limitaciones:
n Tanto los nombres de los campos como sus tipos quedarán
determinados por los nombres y los tipos de las columnas de la tabla,
sin que exista posibilidad de variar alguno de ellos ni de excluir o incluir
algunos de ellos.
n No se incluyen restricciones como NOT NULL ni valores por defecto.
n La posibilidad de creación de variables de registro utilizando este
formato quedará condicionada a la existencia de la tabla de referencia
y a sus posibles variaciones.
PL/SQL permite salvar todas estas limitaciones definiendo nosotros
mismo el registro y declarando después todas las variables de es e tipo
que necesitemos.

34
DASBD 2003-2004

17
REGISTROS EN PL/SQL

Definición de un tipo genérico del registro:


TYPE nombre_tipo IS RECORD
(nombre_campo1 Tipo_campo1[NOT NULL]{:=| DEFAULT} :=valor1],
Nombre_campo2 Tipo_campo2[[NOT NULL]{:=|DEFAULT} :=valor2],
…);

Los tipos de los campos se pueden especificar también utilizando %TYPE y


%ROWTYPE.
Los tipos que tengan el especificador NOT NULL deben se inicializados.

35
DASBD 2003-2004

DECLARACIÓN DE REGISTROS

n Declaración de las variables que se necesiten de ese tipo según el


formato:
Nombre_variable nombre_tipo est_ciencias Testudiante
Para referirnos a la variable de registro completa , indicaremos su nombre,
Para referenciar solamente un campo, lo haremos utilizando la notación de
punto según el formato:
Nombre_variable.nombre_tipo; est_ciencias.DNI:=5666656;
n Asignación de registros:
Podemos usar esta notación para asignar valores como si se tratase de
cualquier otra variable.Pero debemos tener cuidado con expresiones del
tipo
Nom_var_reg:= Nom_car_reg2,
Ya que solamente funcionarán cuando ambas variables hayan sido
definidas sobre el mismo tipo base, En caso contrario, aun cuando
coincidan los tipos , longitudes y nombres de los campos, dará error.
36
DASBD 2003-2004

18
EJEMPLO USO DE REGISTROS

n Asignación de valores de registros:


se puede asignar un valor a un registro mediante un orden SELECT,
que extraería datos de la base de datos y los almacenaría en el
registro. Los campos del registro deben corresponderse con los
campos en la lista de selección de la consulta.
Ejemplo:
DECLARE
--define un registro que se correponda con algunos de los campos de
la tabla estudiante.
TYPE Testudiante IS RECORD(
Nombre estudiante.nombre%TYPE
Apellido estudiante.apellido%TYPE
--declaración de una variable para recibir los datos
Est_ciencias estudiante;
BEGIN
--recupera la información del estudiante con id=10000.la consulta
devuelve las columnas que son iguales a los campos de est_ciencias
37
DASBD 2003-2004

EJEMPLO USO DE REGISTROS

SELECT nombre,apellido INTO est_ciencias FROM estudiante


WHERE ID=1000.
END;
n Utilización de %ROWTYPE
Es habitual definir un registro en PL/SQL con los mismos tipos que una
fila de una base de datos. Para facilitar esta tarea,se incorpora el
operador %ROWTYPE(similar a %TYPE) que devuelve un tipo
basándose en la definición de la tabla.
DECLARE
est_ingenieria estudiante%ROWTYPE
Se define así un registro cuyos campos se corresponden con las
columnas de la tabla estudiante, por tanto est_ingenieria sería:

DNI NUMBER(5),
Nombre VARCHAR(10),
Apellido VARCHAR(10),
-Al igual que con %TYPE no se incluyen las restricciones NOT NULL
definidas en las columnas.
-Si cambia la definición de la tabla, %ROWTYPE también lo hace 38
DASBD 2003-2004

19
INTRODUCCIÓN A TABLAS PL/SQL

El tipo de dato TABLE en PL/SQL sirven para definir estructuras de


datos similares a los arrays que utilizan otros lenguajes;por tanto, es
completamente destinto del concepto tabla que utlilizan los SGBDR
para almacenar la información.
No obstante, estas TABLAS PL/SQL tienen unas características que
las hace distintas de lo que suelen ser los arrays en otros lenguajes de
programación:
n Tienen dos columnas:
-Una es el índice o clave de tipo BINARY_INTEGER
-La otra es la que guardará la información ,cuyo tipo deberá definir el
programador.
n El índice no tiene que ser necesariamente secuencial, y los elementos
no ocupan posiciones contiguas de memoria.
n No tienen una longitud predeterminada. El número de elementos(filas )
pude incrementarse dinámicamente,El límite lo determina el rango de
valores de BINARY_INTEGER( de -2147483647 a +2147483647).

39
DASBD 2003-2004

DEFINICIÓN Y DECLARACIÓN DE TABLAS

n Definiciones de tipo TABLE y declaración de variables


Para poder utilizar estas estructuras hay que seguir dos pasos:
1.Definir el tipo_base de la tabla:
TYPE nombre_tipo IS TABLE OF tipo_elementos[NOT NULL]
INDEX BY BINARY_INTEGER
Nombre_tipo es un especificador que indica el tipo base de la tabla
y que posteriormente se utilizará para definir tablas.
Tipo_elementos especifica el tipo de los elementos que va a
contener.Puede hacerse de varias maneras:
-Indicando el tipo( y la longitud se procede) como se fuera una
columna de una tabla.
-Indicando nombre_de_variable%TYPE.
-Indicando nombretabla. Nombre_columna%TYPE(haciendo
referencia a una columna de una tabla).

40
DASBD 2003-2004

20
DEFINICIÓN Y DECLARACIÓN

El siguiente ejemplo declara el tipo T_tabla_empl, cuyos elementos


tendrán la misma estructura que las filas de emple:
DECLARE
TYPE T_tabla_emple IS TABLE OF emple%ROWTYPE;
INDEX BY BINARY_INTEGER;

2.Una vez definido el tipo_base de la tabla, se pueden declarar tantas
tablas de ese tipo como desee utilizando el formato:
nombretabla nombre_tipo.
En el siguiente ejemplo se declara la variable tab_emple de tipo
T_tabla_empl:
DECLARE
TYPE T_tabla _emple IS TABLE OF emple%ROWTYPE;
INDEX BY BINARY_INTEGER;
Tab_emple T_tabla_emple;
… 41
DASBD 2003-2004

USO DE VARIABLES

n Utilización de variables de tabla


Para referirnos a los elementos de una variable de tabla indicaremos el
nombre de la tabla y entre paréntesis, el números del
elemento.Hatemos lo mismo para introducir valores.
Nombre_tabla(numero_elemento);
Cuando los elementos de la tabla son de tipo registro utilizamos notación
de punto:
Nombre_tabla(numeros_elemento).nombre_campo
DECLARE
TYPE T_tabla_emple IS TABLE OF emple%ROWTYPE;
INDEX BY BINARY_INTEGER
Tab_emple T_tabBla_emple;

BEGIN
SELECT *INTO tab_emple(7900)
WHERE emp_NO=7900;
……..
DBMS_OUTPUT.PUT_LINE(tab_emple(7900).apellido);
….
Tab_emple(7900).salario:=350000;

42
DASBDEND
2003-2004

21
ATRIBUTOS DE LAS TABLAS

n Atributos de tablas PL/SQL


Los atributos de las tablas facilitan la gestión de las variables de tipo
TABLE permitiendo recorrer la tabla, contar y borrar los elementos.En
general, para utilizar los atributos se empleará el siguiente formato:
Variable_de_tabla.atributo[(parámetros)]
Los parámetros harán referencia a valores de índice.

43
DASBD 2003-2004

ATRIBUTOS DE LAS TABLAS

Atributo Tipo devuelto descripción

COUNT Number Devuelve el número de filas de la tabla

DELETE N/A Borra filas de la tabla

EXITS BOOLEAN Devuelve TRUE si existe en la tabla


el elemento especificado
FIRST BINARY_INTEGER Devuelve el índice de la 1ªfila desde
la tabla.
LAST BINARY_INTEGER Devueve el índice de la última fila de
la tabla.
NEXT BINARY_INTEGER Devuelve el índice de la fila de la
tabla que sigue a la fila especificada.

PRIOR Devuelve el índice de la fila de la tavla


que antecede a la fila especificada.

44
DASBD 2003-2004

22
ATRIBUTOS DE TABLAS

n La sintaxis para utilizar un atributo es:


tabla.atributo
Ejemplo:
DECLARE
TYPE T_nombre_tabla IS TABLE OF NUMBER INDEX BY
BINARY_INTEGER
empleado Tnombre_tabla;
total NUMBER;
BEGIN
- inserta 50 filas en la tabla
FOR v_counter IN 1..50 LOOP
Empleado(v_counter):=v_counter;
END LOOP;
Total:=v_Number.count;
END

45
DASBD 2003-2004

SQL en PL/SQL

I. Introducción
II. Órdenes DML en PL/SQL
III. Sintaxis órdenes SQL

46
DASBD 2003-2004

23
INTRODUCCION

n EL lenguaje estructurado de consulta(SQL) define cómo manipular los


datos en Oracle.En este tema se exponen las órdenes SQL permitidas en
PL/AQL y las órdenes de control de tansacciones que garantizan la
consistencia de los datos.
n Las órdenes SQL pueden dividirse en seis categorías:

1.Las del Lenguaje de manipulación de datos(DML) permiten cambiar o


consultar los datos contenidos en una tabla de base de datos,pero no
permiten cambiar la estructura de una tabla u otro objeto.
SELECT,INSERT,UPDATE,DELETE,SET,TRANSACTION,EXPLAIN
PLAN..

2.Las del Lenguaje de definición de datos(DDL) permiten crear ,borrar o


modificar la estructura de un objeto del esquema.Las órdenes que cambian
los permisos relativos a los objetos del esquema también pertenecen al
DDL. DROP,CREATE,ALTER,GRANT,REVOKE (concesión de
privilegios)..
47
DASBD 2003-2004

INTRODUCCIÓN

3.Las órdenes de control de transacciones garantizan la consistencia de


los datos, organizando las órdenes SQL en transacciones lógicas, que se
completan o fallan como una unidad. COMMIT,ROLLBACK,SAVEPOINT…
4.Las de control de sesión cambian las opciones de una conexión
determinada con la base de datos, por ejemplo para habilitar la traza
SQL. ALTER SESSION,SET ROLE…

5.Las órdenes de control del sistema cambian las opciones que afectan a
la base de datos completa , por ejemplo para activar o desactivar el
archivado definitivo. ALTER SYSTEM

6.Las órdenes SQL empotradas (embedded) se emplean en los


programas de precompilación de Oracle. CONNET,DECLARE
CURSOR,ALLOCATE

n Las únicas órdenes SQL permitidas en un programa PL/SQL son las del
DML y las de control de transacciones. En particular las DDL son ilegales y
.EXPLAIN PLAN también aunque pertenezcan a DML ya que PL/SQL usa
un acoplamiento temprano (es decir determinación de la zona de
almacenamiento en tiempo de compilación .y las órdenes DDL modifica
los objetos de la base de datos, los permisos , etc. en tiempo de ejecución.
48
DASBD 2003-2004

24
DML EN PL/SQL

n Las órdenes DML permitidas son SELECT,INSERT,UPDATE Y DELETE.


SELECT devuelve filas de la base de datos que cumplan los criterios
definidos en su cláusula WHERE.
INSERT añade filas a una tabla de la base de datos.
UPDATE modifica las filas de una tabla que cumplan la cláusula WHERE.
DELETE borra las filas identificadas por la cláusula WHERE.

n Todos los valores empleados para cambiar los contenidos de clases son
fijos: son valores que ya se conocen en el momento de escribir la orden
.PL/SQL elimina esta restricción mediante el uso de las variables, que se
pueden usar allí donde este permitido usar una expresión. dentro de la
orden SQL. Cuando se las utiliza de esta manera ,se las conoce como
variables de acoplamiento. Por ejemplo en el siguiente ejemplo podemos
reemplazar el valor fijo del número de créditos con una variable de
acoplamiento.

49
DASBD 2003-2004

DML EN PL/SQL

UPDATE CLASSES UPDATE CLASSES


SET num_creditos=3 SET num_creditos =
v_creditos WHERE departamento = ‘Hist ’WHERE
departamento = ‘Hist AND CURSO=101;
AND CURSO=101;

n No todo componente de una orden SQL se puede reemplazar con una


variable, sólo las expresiones. En particular ,los nombres de tablas y de
columna deben ser conocidos, debido a que tienen un acoplamiento
temprano. Puede emplearse el paquete DBMS_SQL para evitar esta
restricción.

50
DASBD 2003-2004

25
SINTAXIS ÓRDENES SQL

n Sintaxis órdenes SQL:


n SELECT elementos_lista_elección INTO registro_PL/SQL o variable
FROM referencia_tabla WHERE cláusula where.
n INSERT INTO referencia_tabla (nombre columna) VALUES (expresión)
n UPDATE referencia_tabla SET(nombre_columna1) = expresión
(nombre_columna2)=expresión WHERE cláusula where
n DELETE FROM referencia_tabla alias WHERE clausula_where.
La cláusula referencia_tabla se refiere a una tabla Oracle,nombre
columna hace referencia a una columna de dicha tabla,y expresión es
uan espresión SQL o PL/SQL.
DECLARE
V_studentID student.id%TYPE;
BEGIN
--extrae un nuevo nnúmero de identificación de estudiant.
INTO
V_StudentID
51
FROM
DASBD dual;
2003-2004

SINTAXIS ÓRDENES SQL

n --añade una fila a la tabla students


n INSERT students(id,first_name,last_name)
VALUES (v_studentID,’Tomás’,’alto’);
END

n La clausula WHERE
Las órdenes SELECT,UPDATE y DELETE incluyen la cláusula
WHERE como parte integral de sus operaciones.Esta cláusula
define las órdenes que forman el conjunto activo,es decir, el
conjunto de filas devuelto por una consulta(SELECT)o solbre las
que actúa una orden UPDATE o DELETE.
La cláusula WHERE está compuestas de condiciones ,unidas
mediante los operadores booleanos AND,OR o NOT . Las
condiciones suelen adoptar la forma de comparaciones .

52
DASBD 2003-2004

26
Funciones predefinidas
I. Funciones de cadena
II. Funciones de cadena que devuelven valores
numéricos
III. Funciones numéricas
IV. Funciones de fecha
V. Funciones de conversión
VI. Funciones de grupo
VII. Otras funciones

53
DASBD 2003-2004

FUNCIONES DE CADENA

n CHR(x) Devuelve el carácter del conjunto de caracteres cuyo valor es


equivalente a x.

n CONCAT (cadena1, cadena2) Devuelve la cadena1 concatenada con la


cadena2.

n INITCAP (CADENA) Devuelve la misma cadena, con el primer carácter de


cada palabra en mayúscula y el resto en minúscula

n LOWER(cadena) Devuelve la cadena con todos los caracteres en


minúscula

n LPAD(cadena1, x [,cadena2]) Devuelve la cadena1 rellena hacia la


izquierda con los caracteres de la cadena2, hasta completar la longitud x

n LTRIM (cadena1[,cadena2]) Devuelve la cadena1, quitando los caracteres


de la izquierda contenidos en cadena2
54
DASBD 2003-2004

27
FUNCIONES DE CADENA

n NLS-INITCAP(cadena [,paramnls ]) Devuelve cadena, poniendo en


mayúsculas la primera letra de cada palabra, y en minúsculas las restantes

n NLS-LOWE(cadena[.paramnls ]) Devuelve cadena con todas las letras en


minúscula

n NLS-UPPER (cadena [,paramnsl]) Devuelve cadena con todas las letras en


mayúscula, dejando intactos los caracteres no alfabéticos

n REPLACE (cadena, cad-busc[, cad-subst]) Devuelve cadena,


reemplazando todas las apariciones de la cadena cad-busc con la cadena
cad-subst

n RPAD (cadena1, x [,cadena2]) Devuelve la cadena1 rellena por la derecha


con los caracteres de la cadena2, hasta completar la longitud x
55
DASBD 2003-2004

FUNCIONES DE CADENA

n RTRIM(cadena1[,cadena2]) Devuelve la cadena1, quitando los


caracteres de la derecha contenidos en cadena2

n SOUNDEX(cadena) Devuelve la representación fonética de cadena

n SUBSTR(cadena, a [,b]) Devuelve una porción, de b caracteres de


longitud, de la cadena proporcionada como argumento, empezando a
partir de la posición a

n SUBSTRB(cadena, a [,b]) Se comporta igual que SUBSTR, excepto en


que a y b se especifican en bytes, y no en caracteres

n TRANSLATE(cadena, cad-origen, cad-destino). Devuelve la cadena


proporcionada como argumento, con todas las apariciones de cada
carácter de la cadena cad-origen reemplazadas por el correspondiente
carácter de la cadena cad- destino

n UPPER(cadena) Devuelve la cadena proporcionada como argumento,


con todas las letras en mayúscula.El resultado tiene el mismo tipo que
la cadena
56
DASBD 2003-2004

28
FUNCIONES DE CADENA QUE DEVUELVEN
VALORES NUMERICOS

n ASCII(cadena) Devuelve la representación decimal, en el conjunto de


caracteres de la base de datos, del primer byte de la cadena

n INSTR(cadena1, cadena2 [,a [,b]]). Devuelve la posición de la cadena1


donde está contenida la cadena2.

n INSTRB(cadena1, cadena2, [,a [,b]])Se comporta como INSTR, salvo


en que a y el valor de retorno se expresan como bytes

n LENGTH(cadena) Devuelve la longitud de la cadena, en caracteres

n LENGTHB(cadena) Se comporta igual que LENGTH, salvo en que el


valor de retorno está expresado en byts, en lugar de en caracteres

n NLSSORT(cadena [, paramnls ])Devuelve la cadena de bytes empleada


para la ordenación de la cadena proporcionada como argumento 57
DASBD 2003-2004

FUNCIONES NUMÉRICAS

n ABS(x) Devuelve el valor absoluto de x


n ACOS(x) Devuelve el arco coseno de x.
n ASIN(x) Devuelve el arco seno de x
n ATAN(x) Devuelve el arco tangente de x
n ATAN2(x,y) Devuelve el arco tangente de x e y
n CEIL (x) Devuelve el menor entero que sea mayor o igual que x
n COS(x) Devuelve el coseno de x
n COSH(x) Devuelve el coseno hiperbólico de x
n EXP(x) Devuelve e elevado a la potencia x. e = 2.71828183...
n FLOOR(x) Devuelve el mayor entero igual o menor que x
n LN(x) Devuleve el logaritmo natural de x.
n LOG(x,y) Devuelve el logaritmo de y en base x

58
DASBD 2003-2004

29
FUNCIONES NUMÉRICAS

n MOD(x,y) Devuelve el resto resultante de dividir x por y


n POWER(x,y) Devuelve el número x elevado a la potencia de y
n ROUND(x [,y]) Devuelve x redondeado a y posiciones a la derecha del
punto decimal
n SIGN(x) Si x < 0, devuelve -1. Si x=0, devuelve 0. Si x> 0, devuelve 1
n SIN(x) Devuelve el seno de x
n SINH(x) Devuelve el seno hiperbólico de x
n SQRT(x) Devuelve la raíz cuadrada de x
n TAN(x) Devuelve la tangente de x
n TANH(x) Devuelve la tangente hiperbólica de x
n TRUNC(x[,y]) Devuelve el valor x truncado( en lugar de redondeado) a y
posiciones decimales

59
DASBD 2003-2004

FUNCIONES DE FECHA

n ADD-MONTJS(d, x) Devuelve la fecha d más x meses


n LAST-DAY(d) Devuelve la fecha del último día del mes al que d
pertenece
n MONTHS-BETWEEN(fecha1, fecha2) Devuelve el número de
meses exiostentes entre fecha1 y fecha2.
n NEW_TIME(d,zona1, zona2) Devuelve la fecha y hora en la franja
horaria zona2
n NEXT_DAY( d,cadena) Devuelve la fecha del día nombrado en
cadena que es posterior a la fecha d
n ROUND(d[.formato]) Redondea la fecha d a la unidad especificada
en el formato
n SYSDATE Devuelve la fecha y hora actuales, de tipo DATE
n TRUNC(d [.formato])Devuelve la fecha d, truncada a la unidad
especificada en el formato.

60
DASBD 2003-2004

30
FUNCIONES DE CONVERSIÓN

n CHARTOROWID(cadena) Convierte un valor CHAR o VARCHAR2,


de un valor ROWID
n CONVERT(cadena., conjunto_des [,conjunto_fuente]) Convierte la
cadena desde el conjunto de caracteres conjunto_fuente al conjunto
de caracteres conjunto_dest
n HEXTORAW(cadena) Convierte el valor binario representado por
cadena a un valor de tipo RAW.
n RAWTOHEX(valor_raw) Convierte el valor de tipo RAW valor_raw a
una cadena de caracteres que contiene su representación
hexadedimal.
n ROWIDTOCHAR(rowid) Convierte el valor ROWID a su
representación externa en forma de cadena de 18 caracteres
n TO_CHAR(d [,formato [paramnls]]) Convierte la fecha d a una
cadena de caracteres VARCHAR2.

61
DASBD 2003-2004

FUNCIONES DE CONVERSION

n TO_CHAR(etiqueta [,formato]) Convierte la etiqueta MLSLABEL al tipo


VARCHAR2
n TO_CHAR(num [,formato [,paramnls ]]) Convierte el argumento num , de
tipo NUMBER, al tipo VARCHAR2
n TO:DATE(cadena [, formato [,paramnls ]]) Convierte una cadena CHAR
o VARCHAR2 en un valor de fecha, de tipo DATE.
n TO_LABEL(cadena [,formato]) Convierte una cadena de tipo CHAR o
VARCHAR2 en una etiqueta MLSLABEL
n TO_MULTI_BYTE(cadena) Devuelve la cadena con todos los
caracteres de un único byte reemplazados por sus caracteres
equivalentes multibytes
n TO_NUMBER(cadena [,formato [parfamnls ]])Convierte la cadena
CHAR o VARCHAR2 a un valor tipo NUMBER
n TO_SINGLE_BYTE(cadena)Convierte todos los caracteres multibytes
de cadena a sus caracteres equivalentes de un único byte.

62
DASBD 2003-2004

31
FUNCIONES DE GRUPO

n AVG([DISTINCT[ALL]col)Devuelve e l promedio de los valores de la


columna
n COUNT(* I ^DISTINCT I ALL] COL) Devuelve el número de filas en
la consulta.
n GLB([DISTINCT I ALL]etiqueta)Devuelve la mayor cota inferior de
etiqueta.
n LUB( [DISTINCT I ALL] etiqueta)Devuelve la menor cota superior de
etiqueta.
n MAX([DISTINCT I ALL]col) Devuelve el valor máximo del elemento
de lista de selección
n MIN([DISTINCT I ALL]col) Devuelve el valor mínimo del elemento
de lista de selección
n STDDEV([DISTINCT I ALL]col) Devuelve la desviación estándar del
elemento de lista de selección

63
DASBD 2003-2004

FUNCIONES DE GRUPO

n SUM([DISTINCT I ALL]col) Devuelve la suma de los valores para el


elemento de lista de selección Dónde puede ser usada
n VARIANCE([DISTINCT I ALL]col) Devuelve la varianza estadística del
elemento de lista de selección.

64
DASBD 2003-2004

32
OTRAS FUNCIONES

n BFILENAME(directorio, nombre_archivo) Devuelve el localizador BDILE


asociado con el archivo físico nombre_archivo en el sistema operativo
n DECODE(expr_base, comparal, valor1,
compara2, valor2,
"""
predeterminado)
La expresión expr_base se compara sucesivamente con compara1,
compara2, etc. Si expr_base coincide con el elemento de comparación
número i, se devuelve el valor número i
n DUMP(expr[,formato_num [,pos_inicio [,longitud]]]) Devuelve un valor
VARCHAR2 que contiene información acerca de la representación interna
de expr

65
DASBD 2003-2004

OTRAS FUNCIONES

n EMPTY_CLOB devuelve un localizador LOB vacío de carácter


n EMPTY_BLOB devuelve un localizador LOB vacío binario
n GREATEST(expr1 [,expr2]...) Devuelve la expresión con mayor valor de
todos sus argumentos
n GREATEST_LB(etiqueta1 [,etiqueta2]...) Devuelve la mayor cota inferior de
la lista de etiquetas
n LEAST(expr1 [,espr2]...)Devuelve el menor de los valores en la lista de
expresiones
n LEAST_UB(etiqueta1 [,etiqueta2]...) devuelve la menor cota superior de la
lista de etiquetas
n NVL(espr1,expr2)Si el valor de expr1 es NULL, la función devuelve el valor
de expr2; si no, devuelve el valor de expr1

66
DASBD 2003-2004

33
BIBLIOGRAFÍA

n Desarrollo de aplicaciones en entornos de 4º generación y con herramientas


case. Mª Jesus Ramos, Mac Graw Hill.

n Lenguaje PL/SQL, Rama

67
DASBD 2003-2004

34

También podría gustarte