Professional Documents
Culture Documents
problemas de diferentes versiones, esto es muy til y perfecto para evitar machacar el trabajo de
otros. Pero el principal y ms notable problema es la falta de un entorno visual para disear el
formulario, es decir, nos aparece una estructura como de rbol en la cual insertamos un
formulario, a la vez dentro de ste insertamos bloques o mdulos que son las estructuras que
contendrn los elementos del formularios, que pueden estar basados en tablas o no.
Por lo tanto si queremos hacer formularios para practicar o para probar qu es esto de Oracle, os
recomiendo que usis Developer pues es mucho ms fcil e intuitivo al principio
*sql con Oracle
Empezamos un nuevo curso sobre SQL con Oracle que puede resultar muy interesante para
ampliar los conocimientos de SQL que habamos adquirido anteriormente.
Introduccin:
Antes de empezar me gustara decir que este curso esta basado en Oracle, es decir los ejemplos
expuestos y material se han utilizado sobre Oracle. Por otro lado decir que pienso que es
interesante saber algo de SQL antes de comenzar con MYSQL, ya que, aunque existen algunos
cambios insignificantes, sabiendo manejar SQL sabes manejar MYSQL.
Algunas caracteristicas:
SQL: Structured query language.
Tipos de datos:
CHAR:
Almacena de 1 a 255.
Si se introduce una cadena de menos longitud que la definida se rellenara con blancos a la
derecha hasta quedar completada.
Si se introduce una cadena de mayor longitud que la fijada nos dar un error.
VARCHAR:
Si se introduce una cadena de menor longitud que la que esta definida, se almacena con
esa longitud y no se rellenara con blancos ni con ningn otro carcter a la derecha hasta
completar la longitud definida.
Si se introduce una cadena de mayor longitud que la fijada, nos dar un error
NUMBER:
Ejemplo:
X=number (7,2)
X=155'862 Error ya que solo puede tomar 2 decimales
X= 155'86 Bien
Nota: El rango mximo va de 1 a 38.
LONG:
DATE:
Siglo/Ao/Mes/Da/Hora/Minutos/Segundos
RAW:
LONGRAW:
ROWID:
Select:
Select [ALL | Distinct] [expresin_columna1, expresin_columna2, ., | *]
From [nombre1, nombre_tabla1, , nombre_tablan]
{[Where condicin]
[Order By expresin_columna [Desc | Asc]]};
Vamos a explicar como leer la consulta anterior y as seguir la pauta para todas las dems. Cuando
ponemos [] significa que debemos la que va dentro debe existir, y si adems ponemos | significa
que deberemos elegir un valor de los que ponemos y no mas de uno. En cambio si ponemos {}
significa que lo que va dentro de las llaves puede ir o no, es decir es opcional y se pondr segn la
consulta.
Nota: En el select el valor por defecto entre ALL y DISTINCT es ALL.
Desc Emple; = Nos da un resumen de la tabla y sus columnas. En este caso de la tabla
Emple.
Not Null= Si aparece en una lista de una columna significa que la columna no puede tener
valores nulos.
Nota: Ntese que cada consulta de SQL que hagamos hemos de terminarla con un punto y coma
";".
Varios ejemplos para verlo mas claro:
SELECT JUGADOR_NO, APELLIDO, POSICION, EQUIPO
FROM JUGADORES
WHERE EQUIPO_NO = 'VALENCIA'
ORDER BY APELLIDO;
Este ejemplo mostrar el nmero de jugador (jugador_no) el apellido (Apellido), la posicin en la
que juega (Posicin), y el equipo (Equipo) al que pertenece.
Seleccionara todos los datos de la tabla jugadores donde (Where) el nombre de equipo
(Equipo_No) sea igual que la palabra 'Valencia' y se ordenara (order by) apellido. Notemos
tambin que no pone ni 'Distinct' ni 'All'. Por defecto generara la sentencia con ALL.
SELECT *
FROM JUGADORES
WHERE POSICION = 'DELANTERO'
ORDER BY JUGADOR_NO;
Este ejemplo muestra todos los campos de la tabla jugadores donde (Where) la posicin sea igual
que 'Delantero' y lo ordena por nmero de jugador. Al no poner nada se presupone que es
ascendentemente (Asc).
SELECT *
FROM JUGADORES
WHERE EQUIPO_NO = 'VALENCIA' AND POSICION = 'DELANTERO'
ORDER BY APELLIDO DESC, JUGADOR_NO ASC;
En este ejemplo selecciona todos los campos de la tabla jugadores donde (Where) el nombre del
equipo sea igual a 'Valencia' y la posicin de los jugadores sea igual a 'Delantero'. Por ultimo los
ordena por 'Apellido' descendentemente y por numero de jugador ascendentemente.
*Instalar Oracle Database 10g Express
Pasamos a describir los pasos necesarios para instalar el sistema gestor de base de datos Oracle
Database 10g Express.
Vamos a guiar a los lectores de DesarrolloWeb.com a travs de la instalacin de Oracle Database
10g Express, para que podis tener el sistema gestor de base de datos y realizar pruebas desde un
navegador antes de instalarlo en un servidor en produccin.
Lo primero que tenemos que hacer es descargar los archivos de instalacin del sistema gestor de
bases de datos. Para ello accedemos a la pgina oficial de Oracle y nos descargamos el archivo
Oracle Database 10g Express Edition (Universal) de esta URL. La pgina de Oracle solicitar nuestro
registro para realizar la descarga, pues tenemos que ser usuarios registrados para poder bajarlo.
En realidad se tarda dos minutos en registrarse.
Una vez descargado, iniciamos la instalacin y lo primero que nos pedir sera introducir una
contrasea para el usuario sys y el system (implementa la misma a los dos usuarios por defecto).
Podemos elegir cualquier clave, adems siendo una instalacin en local tiene menos importancia
que sea segura. De cualquier modo, lo que s es importante es que la recodemos, as que no estar
de ms el apuntar dicha contrasea en algn lugar, ya que ms adelante la necesitaremos.
Una vez instalado el sistema gestor, podemos acceder a nuestra base de datos online a travs de
tu men inicio / programas / base de datos Oracle. En este men podemos iniciar los servicios de
Oracle, iniciar el sql *plus, as como dirigirnos a la pgina de inicio de nuestra base de datos.
Es importante tener arrancados los servicios relacionados con la base de datos Oracle, ya que si no
lo estn, la base de datos no funcionar. Pero cabe comentar por otro lado, que tener los servicios
funcionando come muchos recursos, por lo que os recomiendo que, cuando no estis utilizando la
base de datos Oracle, paris los servicios.
La puesta en marcha o parado de los servicios relacionados con la base de datos Oracle se puede
hacer desde el panel de control / herramientas administrativas / servicios. Entonces tenis que
buscar los servicios que se llaman Oracleservicesxe y OracleXETNSListener y cambiarlos a manual,
para as poderlos arrancar y parar cuando vosotros queris.
Ahora podemos irnos a la pagina de inicio de nuestra base de datos, la cual accedemos mediante
el menu inico->programas->Base de datos Oracle 10g Express Edition->pagina de inicio de la base
de datos, para ver la forma visual de hacer todas estas cosas.
Cuando abramos la pgina de incio de nuestra base de datos nos pedir un usuario y una
contrasea, tendris que poner como usuario system y la contrasea que le hayis dado al instalar
el sistema. Una vez dentro, tenemos las opciones de administracin (todo lo referente a la
seguridad de sistema), explorador de objetos (todo lo referente a las tablas), sql ( para hacer las
cosas por linea de comando) y utilidades diversas para tu base de datos.
Este interfaz visual que nos ofrece la pagina de inicio de nuestra base de datos te facilitar mucho
el trabajo pero no nos valdr para hacer nada con SQL *Plus ya que solo nos deja realizar
operaciones sql bsicas.
Por lo tanto, quizs nos interesar utilizar la opcin que tenemos en nuestro escritorio, que se
llama "ejecutar linea de comandos SQL". Con ello nos abre una pantalla de DOS con el editor de
SQL *Plus.
Nota:Quiero recordar que esto es una versin online de tu base de datos, para instalar una versin
completa tendramos que bajarnos el Oracle Database 10g ( que incluye sistema cliente, ejemplos,
sistema gateway y sistema clusterware para desarrolladores) y tendramos muchas ms opciones
que ya comentaremos ms adelante. La diferencia fundamental es que la version express puede
manejar solamente hasta 4 GB de datos y 1 GB de memoria. Esta versin puede embeberse con
otras aplicaciones de terceros y se puede distribuir gratuitamente.
Con esto instalado ya podemos comenzar a explicar el SQL *Plus y sus mltiples opciones.
Antes de comenzar os comento que necesitaremos una serie de tablas para ir haciendo ejercicios y
os aconsejara que os creis algunos usuarios ms con distintos privilegios para ir repasando lo que
hemos comentado de la seguridad en Oracle. Esto lo podis hacer de forma visual o por linea de
comando desde la pagina inicial de tu base de datos.
*gestin de seguridad con Oracle
Conceptos bsicos para la gestin de seguridad de una base de datos en Oracle.
Un administrador de Oracle puede controlar dos tipos de seguridad;
Seguridad de los datos: Son los mecanismos que controlan el acceso y uso de la base de
datos a nivel del objectos (tablas, vistas, usuario, etc). Son lo que llamamos los permisos a
nivel de objetos.
Recurso
Descripcin
SESSION_PER_USER
CPU_PER_SESSION
CONNECT_TIME
IDLE_TIME
PRIVATE_SGA
COMPOSITE_LIMIT
dice, es una unidad lgica de almacenamiento de datos compuesta por uno o ms archivos. En
Oracle antes de introducir los datos en la base de datos tenemos que crear un tablespace para que
nos deje trabajar.
Es importante tener un tablespace para cada tipo de datos es decir, un tablespace para cada
aplicacin.
La sintaxis de la creacin de un tablespace es la siguiente:
create tablespace nombre_tablespace
datafile 'nombre_Archivo' [size entero [K|M]] [reuse]
[autoextend {off|on clausulas}]
[,'nombre_archivo' [size entero [K|M]] [reuse]
[autoextend {off|on clausulas}] ] ...
[ default storage {
initial tamao
next tamao
minextents tamao
maxextents tamao
pctincrease valor }] [online|offline];
Donde:
Dafault storage: define el almacenamiento por defecto para todos los objectos que se
creen en ese tablespace
Para modificar un tablespace cambiamos el create por el alter mientras que para borrarlo basta
con hacer drop tablespace nombre_tablespace;
*gestin de seguridad con Oracle II
Continuamos con los conceptos bsicos en la gestin de seguridad de una base de datos.
Seguridad de los datos en Oracle.
En el articulo anterior hablbamos de que existan dos tipos de seguridad en un sistema gestor de
base de datos. El primero era el encaminado a la seguridad del sistema (enlace al articulo anterior)
y el segundo el encaminado a la seguridad de los datos, tema que vamos a abarcar en este
segundo articulo.
Lo que hace tener una cierta seguridad en nuestros datos es la utilizacin de usuarios.
Estos usuarios son nombres que definimos y a los cuales damos una contrasea para acceder a la
base de datos.
En Oracle cada usuario esta asignado a un esquema. Siendo un esquema una coleccin lgica de
objetos. Por defecto un usuario tiene acceso a todos los objectos de su esquema y podra acceder
a los objetos de otros esquemas como los permisos necesarios.
Cuando instanciamos Oracle se crean por defecto dos usuarios importantes:
system manager: usuario para realizar las tareas de administracin de la base de datos
privilegios de sistema: son los que nos dan derecho a realizar ciertas operaciones sobre
objetos de un tipo especificado.
privilegios sobre objetos: estos privilegios nos permiten realizar cambios en los datos de los
objetos de otros usuarios
connect: Todos los permisos necesarios para iniciar una sesin en Oracle
resource: Todos los permisos necesarios para tener recursos para la creacin de objetos
Es un nombre definido en la base de datos que se puede conectar a ella y acceder a determinados
objetos segn ciertas condiciones que establece el administrador.
Los objetos del diccionario de datos a los que un usuario puede acceder se encuentran en la vista
DICTIONARY, que es propiedad del usuario SYS.
DESC DICTIONARY;
Con la orden:
SELECT TABLENAME FROM DICTIONARY;
Se visualizan los objetos del diccionario de datos a los que se puede acceder.
Creacin deusuarios:
CREATE USER NOMBRE_USUARIO
IDENTIFIED BY CLAVE_ACCESO
[DEFAULT TABLESPACE ESPACIO_TABLA]
[TEMPORARY TABLESPACE ESPACIO_TABLA]
[QUOTA {ENTERO {K | M} | UNLIMITED } ON ESPACIO_TABLA]
[PROFILE PERFIL];
DEFAULT TABLESPACE= Asigna a un usuario el tablespace por defecto para almacenar los objetos
que cree. Si no se asigna ninguno, el tablespace por defecto es SYSTEM.
TEMPORARY TABLESPACE= Especifica el nombre del tablespace para trabajar temporales. Si no se
especifica ninguno, el tablespace por defecto es SYSTEM.
QUOTA= Asigna un espacio en megabites o kilobites en el tablespace asignado. Si no se especifica
esta clusula, el usuario no tiene cuota asignada y no podr crear objetos en el tablespace. Para
tener espacio y acceso ilimitad a un tablespace es:
GRANT UNLIMITED TABLESPACE NOMBRE_TABLESPACE;
PROFILE= Asigna un perfil a un usuario.
Modificacin de usuarios:
ALTER USER NOMBRE_USUARIO
IDENTIFIED BY CLAVE _ACCESO
[DEFAULT TABLESPACE ESPACIO_TABLA]
[TEMPORARY TABLESPACE ESPACIO_TABLA]
[QUOTA {ENTERO {K | M } | UNLIMITED } ON ESPACIO_TABLA
[PROFILE PERFIL];
Borrado de usuarios:
QUIT
EXIT
CONNECT
DISCONNECT
CREATE TABLE
CREATE VIEW
GRANT
REVOQUE
DROP TABLE
DROP VIEW
ALTER
AUDIT
NO AUDIT
Su primer carcter debe ser alfabtico y el resto pueden ser letras, nmeros y el carcter
subrayado.
CREATE TABBLE NOMBRETABLA
(COLUMNA1 TIPO_DATO {NOT NULL},
COLUMNA2 TIPO_DATO {NOT NULL},
) TABLESPACE ESPACIO_DE_TABLA;
Caractersticas:
Los usuarios pueden consultar las tablas creadas por medio de la vista USER_TABLES.
Integridad de datos:
La integridad hace referencia al hecho de que los datos de la base de datos han de ajustarse a
restricciones antes de almacenarse en ella. Una restriccin de integridad ser:
Una regla que restringe el rango de valores para una o ms columnas en la tabla.
Restricciones en create table:
Usamos la clusula CONSTRAINT, que puede restringir una sola columna o un grupo de columnas
de una misma tabla.
Hay dos modos de especificar restricciones:
Formato:
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DE_DATO
{CONSTRAINT NOMBRE_RESTRICCION}
{NOT NULL}
{UNIQUE}
{PRIMARY KEY}
{DEFAULT VALOR}
{REFERENCES NOMBRETABLA [(COLUMNA, [,COLUMNA])
{ON DELETE CASCADE}}
{CHECK CONDICION},
COLUMNA2...
)
{TABLESPACE ESPACIO_DE_TABLA} ;
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DATO ,
COLUMNA2 TIPO_DATO,
COLUMNA3 TIPO_DATO,
...
{CONSTRAINT NOMBRERESTRICCION}
[{UNIQUE} | {PRIMARY KEY} (COLUMNA [, COLUMNA])],
{CONSTRAINT NOMBRERESTRICCION}
{FOREIGN KEY (COLUMNA [, COLUMNA])
REFERENCES NOMBRETABLA {(COLUMNA [,
COLUMNA])
{ON DELETE CASCADE}},
{CONSTRINT NOMBRERESTRICCIONI}
{CHECK (CONDICION)}
)[TABLESPACE ESPACIO_DE_TABLA];
*definiciones de claves para tablas y restrinciones
Vemos claves primarias y claves externas (foreing keys) y aprendemos a aplicar restricciones a
los distintos campos de las tablas.
Clave primaria: Primary key
Es una columna o un conjunto de columnas que identifican unvocamente a cada fila. Debe ser
nica, no nula y obligatoria. Como mximo, podemos definir una clave primaria por tabla.
Esta clave se puede referenciar por una columna o columnas. Cuando se crea una clave primaria,
automticamente se crea un ndice que facilita el acceso a la tabla.
Formato de restriccin de columna:
CREATE TABLE NOMBRE_TABLA
(COL1 TIPO_DATO [CONSTRAINT NOMBRE_RESTRICCION] PRIMARY KEY
COL2 TIPO_DATO
)[TABLESPACE ESPACIO_DE_TABLA];
Formato de restriccin de tabla:
CREATE TABLE NOMBER_TABLA
(COL1 TIPO_DATO,
COL2 TIPO_DATO,
[CONSTRAINT NOMBRERESTRICCION] PRIMARY KEY (COLUMNA [,COLUMNA]),
)[TABLESPACE ESPACIO_DE_TABLA];
Claves ajenas: Foreign Key:
Esta formada por una o varias columnas que estn asociadas a una clave primaria de otra o de la
misma tabla. Se pueden definir tantas claves ajenas como se precise, y pueden estar o no en la
misma tabla que la clave primaria. El valor de la columna o columnas que son claves ajenas debe
ser: NULL o igual a un valor de la clave referenciada (regla de integridad referencial).
Formato de restriccin de columna:
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DATO
[CONSTRAINT NOMBRERESTRICCION]
REFERENCES NOMBRETABLA [(COLUMNA)] [ON DELETE CASCADE]
)[TABLESPACE ESPECIO_DE_TABLA];
Formato de restriccin de tabla:
CREATE TABLE NOMBRE_TABLA
(COLUMNA1 TIPO_DATO,
COLUMNA2 TIPO_DATO,
[CONTRAINT NOMBRERESTRICCION]
FOREIGN KEY (COLUMNA [,COLUMNA])
REFERENCES NOMBRETABLA [(COLUMNA [,
COLUMNA])]
[ON DELETE CASCADE],
)[TABLESPACE ESPACIO_DE_TABLA];
Notas:
Hay que crear primero una tabla y despus aquella que le hace referencia.
Hay que borrar primero la tabla que hace referencia a otra tabla y despus la tabla que no
hace referencia.
Borrado en cascada (ON DELETE CASCADE): Si borramos una fila de una tabla maestra,
todas las filas de la tabla detalle cuya clave ajena sea referenciada se borraran
automticamente. La restriccin se declara en la tabla detalle. El mensaje "n filas
borradas" solo indica las filas borradas de la tabla maestra.
UNIQUE: Evita valores repetidos en la misma columna. Puede contener una o varias columnas. Es
similar a la restriccin PRIMARY KEY, salvo que son posibles varias columnas UNIQUE definidas en
una tabla. Admite valores NULL. Al igual que en PRIMARY KEY, cuando se define una restriccin
UNIQUE se crea un ndice automticamente.
Vistas del diccionario de datos para las restricciones:
Contienen informacin general las siguientes:
USER_CONSTRAINTS: Definiciones de restricciones de tablas propiedad del usuario.
ALL_CONSTRAINTS: Definiciones de restricciones sobre tablas a las que puede acceder el usuario.
DBA_CONSTRAINTS: Todas las definiciones de restricciones sobre todas las tablas.
Creacin de una tabla con datos recuperados en una consulta:
CREATE TABLE: permite crear una tabla a partir de la consulta de otra tabla ya existente. La nueva
tabla contendr los datos obtenidos en la consulta. Se lleva a cabo esta accin con la clusula AS
colocada al final de la orden CREATE TABLE.
CREATE TABLE NOMBRETABLA
(COLUMNA [,COLUMNA]
)[TABLESPACE ESPACIO_DE_TABLA]
AS CONSULTA;
No es necesario especificar tipos ni tamao de las consultas, ya que vienen determinadas por los
tipos y los tamaos de las recuperadas en la consulta.
La consulta puede tener una subconsulta, una combinacin de tablas o cualquier sentencia select
valida.
Las restricciones CON NOMBRE no se crean en una tabla desde la otra, solo se crean aquellas
restricciones que carecen de nombre.
*Supresin y modificacin de tablas con SQL
Vemos sentencias en SQL para la supresion y modificacin tanto de tablas como de
restricciones.
Supresin de tablas:
DROP TABLE: suprime una tabla de la base de datos. Cada usuario puede borrar sus propias tablas,
pero solo el administrador o algn usuario con el privilegio "DROP ANY TABLE" puede borrar las
tablas de otro usuario. Al suprimir una tabla tambin se suprimen los ndices y los privilegios
asociados a ella. Las vistas y los sinnimos creados a partir de esta tabla dejan de funcionar pero
siguen existiendo en la base de datos por tanto deberamos eliminarlos.
Ejemplo:
DROP TABLE [USUARIO].NOMBRETABLA [CASCADE CONSTRAINTS];
TRUNCATE: permite suprimir todas las filas de una tabla y liberar el espacio ocupado para otros
usos sin que reaparezca la definicin de la tabla de la base de datos. Una orden TRUNCATE no se
puede anular, como tampoco activa disparadores DELETE.
TRUNCATE TABLE [USUARIO.]NOMBRETABLA [{DROP | REUSE} STORAGE];
Modificacin de tablas:
Se modifican las tablas de dos formas: Cambiando la definicin de una columna (MODIFY)
aadiendo una columna a una tabla existente (ADD):
Formato:
ALTER TABLE NOMBRETABLA
{[ADD (COLUMNA [,COLUMNA])]
[MODIFY (COLUMNA [,COLUMNA])]
[ADD CONSTRAINT RESTRICCION]
[DROP CONSTRAINT RESTRICCION]};
ADD= Aade una columna o mas al final de una tabla.
MODIFY= Modifica una o mas columnas existentes en la tabla.
ADD CONSTRAINT= Aade una restriccin a la definicin de la tabla.
DROP CONSTRAINT= Elimina una restriccin de la tabla.
A la hora de aadir una columna a una tabla hay que tener en cuenta:
Si la columna no esta definida como NOT NULL se le puede aadir en cualquier momento.
Si la columna esta definida como NOT NULL se pueden seguir estos pasos:
1. Se aade una columna sin especificar NOT NULL.
2. Se da valor a la columna para cada una de las filas.
3. Se modifica la columna NOT NULL.
La opcin MODIFY NOT NULL solo ser posible cuando la tabla no contenga ninguna fila
con valor nulo en la columna que se modifica.
Adicin de restricciones:
Con la orden ALTER TABLE se aaden restricciones a una tabla.
Formato:
ALTER TABLE NOMBRETABLA
ADD CONSTRAINT NOMBRECONSTRAINT
Borrado de restricciones:
La orden ALTER TABLE con la clusula DROP CONSTRAINT; con la que se borran las restricciones
con nombre y las asignadas por el sistema. Formato:
ALTER TABLE NOMBRETABLA
DROP CONSTRAINT NOMBRE_CONSTRAINT,
NOMBRE_RESTRICCION:
*Manipulacin de datos con SQL
Utilizando SQL con Oracle aprendemos como hacer Inserciones, actualizaciones y a eliminar
datos.
Insert, Update y Delete:
Insert:
Se aaden filas de datos en una tabla:
INSERT INTO NOMBRETABLA [(COL [,COL])]
VALUES (VALOR [,VALOR]);
Nombretabla= Es la tabla en la que se van a insertar las filas.
Propiedades:
Si las columnas no se especifican en la clusula Insert se consideran, por defecto, todas las
columnas de la tabla.
Los valores que se dan a las columnas deben coincidir con el tipo de dato definido en la
columna.
Los valores constantes de tipo carcter han de ir encerrados entre comillas simples (' ') (los
de tipo fecha tambin).
Con Select:
Se aaden tantas filas como devuelva la consulta:
INSERT INTO NOMBRETABLA [(COL [,COL])]
SELECT {COLUMNA [, COLUMNA] | *}
FROM NOMBRETABLA2 [CLAUSULAS DE SELECT];
Update:
Actualiza los valores de las columnas para una o varias filas de una tabla:
UPDATE NOMBRETABLA
SET COLUMNA1= VALOR1, , COLUMNAN= VALORN
WHERE CONDICION;
Set= Indica las columnas que se van a actualizar y sus valores.
Con Select:
Cuando la subconsulta (orden select) forma parte de SET, debe seleccionar el mismo numero de
columnas, (con tipos de datos adecuados) que los que hay entre parntesis al lado de SET.
UPDATE NOMBRETABLA
SET COLUMNA= VALOR1, COLUMNA2= VALOR2,
WHERE COLUMNA3= (SELECT)
UPDATE NOMBRETABLA
SET (COLUMNA1, COLUMNA2, )= (SELECT )
WHERE CONDICION;
Delete:
Elimina una o varias filas de una tabla:
DELETE [FROM] NOMBRETABLA
WHERE CONDICION;
*SQL con Oracle. Operadores
Empezamos a ver los tipos de operadores y trabajamos con algunos ejemplos.
Operadores aritmticos:
+ = Suma
- = Resta
* = Multiplicacin
/ = divisin
Operadores de comparacin y lgicos:
!> = Distinto
>= = Mayor o igual que
<= = Menor o igual que = = Igual que
Like = Se utiliza para unir cadenas de caracteres. Propiedades:
% = representa cualquier cadena de caracteres de 0 o mas caracteres.
_= representa un nico carcter cualquiera.
Not = Negacin
And = y
a and b
Cierto si son ciertas a y b.
Or = o
a or b
Cierto si a o b son ciertas
Veamos un par de ejemplos:
Obtenemos los datos de los jugadores cuyos apellidos empiecen con una "S":
SELECT APELLIDO
FROM JUGADORES
WHERE APELLIDO LIKE 'S%';
Obtenemos aquellos apellidos que tengan una "R" en la segunda posicin:
SELECT APELLIDO
FROM JUGADORES
WHERE APELLIDO LIKE '_R*';
Obtenemos aquellos apellidos que empiezan por "A" y tiene una "o" en su interior:
SELECT APELLIDO
FROM JUGADORES
WHERE APELLDIOS LIKE 'A%O%';
Comprobacin con conjuntos de valores:
Ejemplo:
SELECT APELLIDOS
FROM JUGADORES
WHERE JUGADOR_NUM IN (10, 20);
Selecciona los apellidos de los jugadores donde el nmero de jugador (Jugador_num) sea (In) o 10
o 20
SELECT APELLIDOS
FROM JUGADORES
WHERE SALARIO NOT BETWEEN 15000000 AND 20000000;
Selecciona los apellidos de los jugadores donde el salario de estos no este entre (Not Between)
15000000 y 20000000.
*funciones sql
Vemos los distintos tipos de funciones y algunos ejemplos de las mismas con SQL para Oracle.
Funciones de valores simples:
ABS(n)=Devuelve el valor absoluto de (n).
CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n".
FLOOT(n) =Devuelve el valor entero inmediatamente inferior o igual a "n".
MOD (m, n)=Devuelve el resto resultante de dividir "m" entre "n".
NVL (valor, expresin)=Sustituye un valor nulo por otro valor.
POWER (m, exponente)=Calcula la potencia de un numero.
ROUND (numero [, m])=Redondea nmeros con el numero de dgitos de precisin indicados.
SIGN (valor)=Indica el signo del "valor".
SQRT(n)=Devuelve la raz cuadrada de "n".
TRUNC (numero, [m])=Trunca nmeros para que tengan una cierta cantidad de dgitos de
precisin.
VAIRANCE (valor)=Devuelve la varianza de un conjunto de valores.
Funciones de grupos de valores:
AVG(n)=Calcula el valor medio de "n" ignorando los valores nulos.
COUNT (* | Expresin)=Cuenta el numero de veces que la expresin evala algn dato con valor
no nulo. La opcin "*" cuenta todas las filas seleccionadas.
MAX (expresin)=Calcula el mximo.
MIN (expresin)=Calcula el mnimo.
SUM (expresin)=Obtiene la suma de los valores de la expresin.
GREATEST (valor1, valor2)=Obtiene el mayor valor de la lista.
LEAST (valor1, valor2)=Obtiene el menor valor de la lista.
Funciones que devuelven valores de caracteres:
CHR(n) =Devuelve el carcter cuyo valor en binario es equivalente a "n".
CONCAT (cad1, cad2)=Devuelve "cad1" concatenada con "cad2".
LOWER (cad)=Devuelve la cadena "cad" en minsculas.
UPPER (cad)=Devuelve la cadena "cad" en maysculas.
INITCAP (cad)=Convierte la cadena "cad" a tipo titulo.
LPAD (cad1, n[,cad2])=Aade caracteres a la izquierda de la cadena hasta que tiene una cierta
longitud.
RPAD (cad1, n[,cad2])=Aade caracteres a la derecha de la cadena hasta que tiene una cierta
longitud.
LTRIM (cad [,set])=Suprime un conjunto de caracteres a la izquierda de la cadena.
RTRIM (cad [,set])=Suprime un conjunto de caracteres a la derecha de la cadena.
FORM EMPLE
WHERE POSICION = (SELECT OFICIO
FROM EMPLE
WHERE APELLIDO LIKE 'GIL');
Seleccionamos en todos los campos de la tabla Jugadores cuya sede est en Madrid o Barcelona:
SELECT *
FROM JUGADORES
WHERE EQUIPO_NOM IN (SELECT EQUIPO_NOM
FROM SEDE
WHERE LOC IN ('MADRID', 'BARCELONA');
FROM SEDE
WHERE LOC IN ('MADRID', 'BARCELONA');
*Agrupacin y combinacin de elementos con SQL
Aprendemos a agrupar elementos y a combinar filas seleccionadas con SQL para Oracle
Agrupacin de elementos. Group by y Having:
Para saber cual es el salario medio de cada departamento de la tabla Jugadores sera:
SELECT EQUIPO_NO, AVG (SALARIO) "SALARIO MEDIO"
FROM JUGADORES
GROUP BY DEPT_NO;
La sentencia "Select" posibilita agrupar uno o ms conjuntos de filas. El agrupamiento se lleva a
cabo mediante la clusula "GROUP BY" por las columnas especificadas y en el orden especificado.
Formato:
SELECT
FROM
GROUP BY COLUMNA1, COLUMNA2, COLUMNAN
HAVING CONDICION
GROUP BY
Los datos seleccionados en la sentencia "Select" que lleva el "Group By" deben ser:
Una constante.
Los nombres de columna de la primera sentencia "Select" no tiene porque ser los mismos
que los nombres de la segunda.
Los tipos de datos deben coincidir, aunque la longitud no tiene que ser la misma.
Normaliza las tablas, al menos hasta la tercera forma normal, para asegurar que no hay
duplicidad de datos y se aprovecha al mximo el almacenamiento en las tablas. Si hay que
desnormalizar alguna tabla piensa en la ocupacin y en el rendimiento antes de proceder.
Los primeros campos de cada tabla deben ser aquellos campos requeridos y dentro de los
requeridos primero se definen los de longitud fija y despus los de longitud variable.
Es muy habitual dejar un campo de texto para observaciones en las tablas. Si este campo
se va a utilizar con poca frecuencia o si se ha definido con gran tamao, por si acaso, es
mejor crear una nueva tabla que contenga la clave primaria de la primera y el campo para
observaciones.
Un caso en el que los ndices pueden resultar muy tiles es cuando realizamos peticiones
simultneas sobre varias tablas. En este caso, el proceso de seleccin puede acelerarse
sensiblemente si indexamos los campos que sirven de nexo entre las dos tablas.
Los ndices pueden resultar contraproducentes si los introducimos sobre campos triviales a partir
de los cuales no se realiza ningn tipo de peticin ya que, adems del problema de memoria ya
mencionado, estamos ralentizando otras tareas de la base de datos como son la edicin, insercin
y borrado. Es por ello que vale la pena pensrselo dos veces antes de indexar un campo que no
sirve de criterio para bsquedas o que es usado con muy poca frecuencia por razones de
mantenimiento.
Campos a Seleccionar
En la medida de lo posible hay que evitar que las sentencias SQL estn embebidas dentro
del cdigo de la aplicacin. Es mucho ms eficaz usar vistas o procedimientos
almacenados por que el gestor los guarda compilados. Si se trata de una sentencia
embebida el gestor debe compilarla antes de ejecutarla.
No utilizar nunca SELECT * por que el gestor debe leer primero la estructura de la tabla
antes de ejecutar la sentencia
Si utilizas varias tablas en la consulta especifica siempre a que tabla pertenece cada
campo, le ahorras al gestor el tiempo de localizar a que tabla pertenece el campo. En lugar
de SELECT Nombre, Factura FROM Clientes, Facturacion WHERE IdCliente =
IdClienteFacturado, usa: SELECT Clientes.Nombre, Facturacion.Factura WHERE
Clientes.IdCliente = Facturacion.IdClienteFacturado.
Campos de Filtro
Se procurar elegir en la clusula WHERE aquellos campos que formen parte de la clave
del fichero por el cual interrogamos. Adems se especificarn en el mismo orden en el que
estn definidos en la clave.
caso, no puede usar el primer ndice y ambas sentencias son equivalentes por que la
condicin APELLIDO Like '%' devolvera todos los registros.
Orden de las Tablas
Cuando se utilizan varias tablas dentro de la consulta hay que tener cuidado con el orden
empleado en la clusula FROM. Si deseamos saber cuantos alumnos se matricularon en el ao
1996 y escribimos: FROM Alumnos, Matriculas WHERE Alumno.IdAlumno = Matriculas.IdAlumno
AND Matriculas.Ao = 1996 el gestor recorrer todos los alumnos para buscar sus matriculas y
devolver las correspondientes. Si escribimos FROM Matriculas, Alumnos WHERE Matriculas.Ao =
1996 AND Matriculas.IdAlumno = Alumnos.IdAlumnos, el gestor filtra las matrculas y despus
selecciona los alumnos, de esta forma tiene que recorrer menos registros.
*Gestin de vistas en SQL
Creacin, modificacin y supresin de vistas con SQL.
Creacin y uso de vistas
No contienen informacin por si mismas, sino que estn basadas en las que contienen otras tablas
y refleja los datos de estas.
Si se suprime una tabla la vista asociada se invalida. Formato:
CREATE [OR REPLACE] VIEW NOMBREVISTA
[(COLUMNA [,COLUMNA])]
AS CONSULTA;
AS CONSULTA= Determina las columnas y las tablas que aparecern en la vista.
[OR REPLACE]= Crea de nuevo la vista si ya exista.
Para consultar la vista creada, USER_VIEWS:
SELECT VIEW_NAME FROM
Nota: al borrar las tablas, las vistas de esas tablas no se borran y quedan inutilizadas.
Borrado de vistas
Se hace con DROP VIEW. Formato:
DROP VIEW NOMBREVISTA;
Operaciones sobre vistas
Se pueden realizar las mismas operaciones que se hacen sobre las tablas. Restricciones:
Actualizacin Si una vista esta basada en una sola tabla, se pueden modificar las filas de la
vista.
Borrado de filas a travs de una vista= Para borrar filas de una tabla a travs de una vista,
esta se debe crear:
o
Actualizacin de filas a travs de una vista: Para actualizar filas en una tabla a travs de
una vista, esta ha de estar definida segn las restricciones anteriores y , adems, ninguna
de las columnas que se va a actualizar se habr definido como una expresin.
Insercin de filas a travs de una vista: Para insertar filas en una tabla a travs de una vista
se han de tener en cuenta todas las restricciones anteriores y, adems, todas las columnas
obligatorias de la tabla asociada deben estar presentes en la vista.
Nos encontramos ante un gestor que va incorporado en Oracle para solventar las grandes
limitaciones que tenamos con los editores SQL, en cuanto al control de las secuencias de
ejecucin de instrucciones, el uso de variables, la gestin de posibles errores, etc.
Este lenguaje esta basado en ADA, por lo que incluye todas las caractersticas de los lenguajes de
tercera generacin. Esto nos permite manejar las variables, tener una estructura modular
(procedimientos y funciones) y controlar las excepciones. Adems incorpora un completo soporte
para la programacin orientada a objetos (POO).
Los programas creados con PL/SQL los podemos almacenar en nuestra base de datos como
cualquier otro objeto quedando disponibles para los usuarios. El uso del lenguaje PL/SQL es
imprescindible para construir disparadores de bases de datos (triggers).
PL/SQL esta incluido en el servidor y en algunas herramientas de cliente. Soporta todos los
comandos de consulta y manipulacin de datos, aportando al lenguaje SQL las estructuras de
control y otros elementos propios de los lenguajes de programacin de 3 generacin.
La unidad de trabajo en PL/SQL es el bloque, constituido por un conjunto de declaraciones,
instrucciones y mecanismos de gestin de errores y excepciones.
Bloques
Con PL/SQL se pueden construir distintos tipos de programas: procedimientos, funciones y
bloques annimos, paquetes, etc. Todos ellos tienen en comn una estructura bsica denominada
bloque.
Un bloque tiene 3 zonas:
Zona de declaraciones: donde se declaran objectos locales. Suele ir precedida por la clusula
declare (o is o as en los procedimientos y funciones).
Un conjunto de instrucciones precedido por la clusula BEGIN
Zona de excepciones: es una zona opcional precedida por la clusula EXCEPTION, donde se
gestionan las excepciones.
El formato genrico de un bloque es el siguiente:
[ DECLARE
<declaraciones>]
BEGIN
<instrucciones>
[EXCEPTION
<gestin de excepciones>]
END;
Las nicas clusulas obligatorias son BEGIN y END
Antes de hacer ningn bloque tenemos que ejecutar el siguiente comando en nuestra ventana de
Sql *PLUS
set serveroutput on;
Aunque ahora no entendis mucho os dejo un ejemplo de un bloque para que os vayis
familiarizando con la sintaxis.
DECLARE
v_num_empleados number(2);
BEGIN
insert into depart values(99,'provisional',null);
update emple set dept_no=99 where dept_no=20;
v_num_empleados:=SQL%ROWCOUNT;
delete from depart where dept_no=20
DBMS_OUTPUT.PUT_LINE (v_num_empleados || 'Empleados cambiados a provisional');
Ya en prximos artculos nos meteremos de lleno en la construccin de bloque y en entender las
lineas arriba escritas.
*Caractersticas de PL/SQL primera parte
Para poder trabajar con PL/SQL tenemos que tener claros una serie de conceptos y definiciones
sobre todo en lo referente a compatibilidad de datos y estructuras de control.
Definicin de datos compatibles con SQL
Este lenguaje suele tener unos tipos de datos compatibles con SQL para las columnas de las tablas,
pero adems puede tener otros tipos de datos propios.
Para declarar los datos en un bloque tenemos que utilizar una sintaxis como esta:
DECLARE
nombre_variable Tipo dato;
BEGIN
...
Un ejemplo seria este:
DECLARE
precio NUMBER(8,2);
suma NUMBER(2) DEFAULT 0;
prenda CHAR(20) NOT NULL :='Camiseta';
descripcin VARCHAR2(15);
BEGIN
....
Una de las ventajas de PL/SQL es que nos permite declarar una variable del mismo tipo que otra
variable o que una columna de una tabla. Esto lo hacemos con el atributo %TYPE.
DECLARE
nombre emple.nombre%TYPE;
Otra ventaja es que nos permite guardar el contenido de una fila entera de una tabla en una
variable. Esto lo hacemos con el atributo %ROWTYPE
DECLARE
mifila emple%ROWTYPE;
Con esto ya podemos trabajar con variables dentro de nuestro bloque. Ahora tenemos que ver las
estructuras de control que podemos manejar dentro de nuestros bloques.
Estructuras de control
Las estructuras de control son bsicamente las mismas que podemos utilizar en cualquier lenguaje
de programacin.
La vamos a dividir en estructuras de control alternativas (IF) y estructuras de control repetitivas
(WHILE, FOR, LOOP)
La estructura del IF seria la siguiente:
IF <condicin> THEN
instrucciones
ELSEIF <condicin> THEN
instrucciones
....
ELSE
instrucciones
END IF;
La estructura del WHILE seria la siguiente:
WHILE <condicin> LOOP
instrucciones
END LOOP;
La estructura del FOR se escribira as:
FOR <variable> IN <mnimo> <mximo> LOOP
instrucciones
END LOOP
Si queremos que nos vaya contando al revs, es decir de 5 hasta 0 por ejemplo, la sintaxis seria la
siguiente:
FOR <variable> IN REVERSE
<final>.......<inicio> LOOP
instrucciones
.....
END LOOP;
Y la estructura del LOOP seria de esta forma:
LOOP
instrucciones
....
get nombrefichero
Una vez cargado el fichero ejecutamos el bloque con la sentencia run nombrefichero.
O podemos hacer los dos pasos con una sola sentencia: start nombrefichero
Sin embargo para los procedimientos es totalmente distinto ya que al tener nombre se almacena
automticamente en la base de datos y para ejecutarlo tan solo tenemos que realizar la siguiente
operacin:
execute nombre_procedimiento(parmetros);
En el siguiente capitulo revisaremos todo lo que hemos visto en la introduccin del PL/SQL, pero
de una forma mas exhaustiva.
*Bloques annimos y procedimientos PL/SQL
En este artculo vamos a ver el uso y ejemplos de los bloques annimos en PL/SQL y los
procedimientos.
Para continuar las explicaciones sobre PL/SQL que estamos publicando en el Tutorial de Oraclede
Desarrolloweb.com, veamos a continuacin dos importantes elementos de esta plataforma.
Bloques annimos PL/SQL
Empezaremos con los bloques annimos, caracterizados porque no tienen nombre y se suelen
crear y ejecutar desde PL/SQL.
Todo bloque debe acabar en . para que sea almacenado en el buffer SQL. Una vez guardado lo
podemos ejecutar con la orden run. Tambin podemos guardarlo en un fichero con la siguiente
orden:
save nombrefichero [replace]
El replace slo lo pondremos si el fichero ya esta creado.
Para cargar y ejecutar este bloque annimo guardado en fichero ejecutaremos la siguiente orden:
start nombrefichero
El start lo podemos cambiar por la @ y nos funcionar igualmente.
Pero tambin podemos cargarlo sin ejecutarlo con la orden get y luego ejecutarlo
posteriormente con la orden run
Un ejemplo muy sencillo de bloque seria el que nos muestra en pantalla un nombre.
BEGIN
DBMS_OUTPUT.PUT_LINE('nombre');
END;
.
Adems en los bloques PL/SQL se pueden utilizar lo que llamamos variables de sustitucin, que
nos pedirn datos por pantalla antes de ejecutar el bloque. Estas variables tienen que ir
antepuestas del & para que funcionen.
Un ejemplo seria un bloque que nos pide el DNI de un usuario y nos muestra su nombre.
DECLARE
Vnom clientes.nombre%TYPE;
BEGIN
select nombre into Vnom from clientes where NIF= '&V_nif';
DBMS_OUTPUT.PUT_LINE (Vnom);
END;
.
Como veis es bastante sencillo, pero no tienen tanta funcionalidad como los procedimientos o
funciones.
Procedimientos y funciones PL/SQL
Los procedimientos y funciones quedan almacenados en la base de datos a diferencia de los
bloques annimos que se almacenaban en el buffer.
Nota: Al quedar los bloques annimos almacenados en el buffer, a no ser que se guardasen en
ficheros, se perderan al limpiar el buffer, cosa que no ocurre con los procedimientos y funciones,
que se almacenan en la propia base de datos.
Otra cosa que nos diferencia los bloques annimos de los procedimientos o funciones es que en
los procedimientos o funciones no se pueden utilizar variables de sustitucin.
En cuanto a su construccin es la dada en el articulo Caractersticas de PL/SQL segunda
parte aadiendo al principio la siguiente secuencia CREATE OR REPLACE para crearlo, o
modificarlo si ya existe.
Pasamos a escribir un procedimiento que nos muestre los datos de un usuario:
CREATE OR REPLACE PROCEDURE ver_usuario(nomusu VARCHAR2)
IS
NIFusu VARCHAR2(10);
Domusu VARCHAR2(10);
BEGIN
select nif, domicilio into NIFusu,Domusu from usuario where nombre=nomusu;
DBMS_OUTPUT.PUT_LINE('Nombre:'||nomusu|| 'NIF:' ||NIFusu|| 'Domicilio' ||Domusu);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hemos encontrado al usuario || nomusu);
END;
/
Si el compilador detecta errores nos saldr un mensaje como este: Procedimiento creado con
errores de compilacin. Para ver estos errores tenemos la orden SHOW ERRORS.
Al tener almacenado el procedimiento en la base de datos, este puede ser llamado por cualquier
usuario que tenga los permisos oportunos. Para invocar un procedimiento utilizamos la orden
EXECUTE
Para invocar al procedimiento que hemos creado antes tendramos que ejecutar la siguiente
orden:
EXECUTE ver_usuario('Luis');
Pero tambin podemos invocarlo desde un bloque PL/SQL de ls siguiente forma:
BEGIN
ver_usuario('Luis');
END;
.
Como en cualquier lenguaje, podemos agregar comentarios a nuestros procedimientos de la
siguiente forma:
- - para comentar en una sola linea
/* <comentario>*/ para varias lineas.
*Fundamentos del lenguaje PL/SQL
En este artculo estudiaremos los fundamentos de PL/SQL y algunos de los elementos que
constituyen este lenguaje.
Para continuar con el manual de Oracle publicado en DesarrolloWeb.com, es hora de adentrarnos
en las explicaciones de los elementos que forman parte del lenguaje PL/SQL.
Tipos de datos
Este lenguaje dispone de los mismo tipos de datos que podemos encontrar en SQL, pero adems
se han incorporado algunos nuevos:
etc.
Adems es importante sealar que el programador puede definir sus propios tipos de datos a
partir de los ya definidos.
Identificadores
Se utilizan para nombrar los objetos que intervienen en los programas PL/SQL como son las
variables, constantes, cursores, excepciones, procedimientos, etc.
Pueden tener como mximo 30 caracteres empezando siempre por una letra, que puede ir
seguida por otras letras, numeros, $, # _. Es importante destacar que PL/SQL no diferencia entre
maysculas y minsculas. Tambin debemos sealar que no pueden contener espacios ni signos
de puntuacin.
Variables
Como doy por sentado que todos sabemos lo que son las variables, pasaremos directamente a
comentar como se declara una variable en PL/SQL.
<nombreVariable> <tipo> [NOT NULL] [{:= | DEFAULT } <valor>]
No podemos indicar una lista de variables del mismo tipo y luego declarar el tipo, tenemos que
hacerlo una a una.
Uno ejemplo de declaracin de variables seria el siguiente:
DECLARE
importe NUMBER (8,2);
contador NUMBER(2'0);
nombre char(5) NOT NULL :="Sara";
...
Uso de los atributos %TYPE y %ROWTYPE
%TYPE: declara una variable del mismo tipo que otra, o que una columna de una tabla
%ROWTYPE : crea una variable registro cuyos campos se corresponden con las columnas de una
tabla o vista.
Por ejemplo si tenemos una variable definida previamente llamada cantidad podemos definir otra
de la siguiente forma:
total cantidad%TYPE;
De esta forma la variable total tendr las mismas caractersticas que la variable cantidad.
Otro ejemplo seria declarar una variable que fuera del mismo tipo que la columna nombre de la
tabla profesor.
nombre_alta nombre%ROWTYPE;
:=
Lgicos
AND
OR
NOT
Concatenacin ||
Is null
=
!=
<>
<
>
<=
>=
between...and
like
in
Comparacin y sus correspondientes negaciones
Aritmticos
+ - * / **
Funciones predefinidas
En PL/SQL tenemos las mismas funciones predefinidas que en SQL (AVG, MIN, MAX, COUNT, SUM,
etc), pero tenemos que tener dos cosas muy claras a la hora de utilizarlas y son:
1. La funcin no modifica el valor de las variables o expresiones que se pasan como
argumentos, sino que devuelve un valor a partir de dicho argumento.
2. Si a una funcin se le pasa un valor nulo en la llamada, posiblemente devolver un valor
nulo.
Etiquetas
Podemos utilizar etiquetas para poder irnos a cualquier parte del programa utilizando la sentencia
GOTO siempre y cuando se cumplan las siguientes reglas:
No pueden haber etiquetas con los mismos nombres en un mismo programa.
La etiqueta debe preceder a un bloque o a un conjunto de ordenes ejecutables
la etiqueta no puede estar dentro de estructuras de control (IF, LOOP)
*Subprogramas PL/SQL
Los subprogramas son los bloques PL/SQL con nombre que pueden recibir y devolver valores.
En cualquier subprograma podemos distinguir:
La cabecera, compuesta por el nombre del subprograma, los parmetros y el tipo de valor
de retorno.
Podemos distinguir entre dos tipos de subprogramas, como ya hemos comentado en artculos
anteriores:
Procedimientos
Los procedimientos ya los hemos visto en el articulo Bloques annimos y procedimientos
PL/SQL por lo que pasamos directamente a las funciones.
Funciones
Las funciones son muy similares a los procedimiento con la diferencia que stas siempre
devolvern un valor. Su estructura es la siguiente:
CREATE [OR REPLACE] FUNCTION NombreFuncion [(parmetros)] RETURN tipo
IS [parte declarativa]
BEGIN
instrucciones
RETURN <valor o expresin>;
[EXCEPTION excepciones]
END;
La clusula RETURN de la cabecera nos especifica el tipo de valor que nos va a devolver la funcin.
Parmetros
Todos los subprogramas utilizan parmetros para pasar y recibir informacin.
Dentro de los parmetros podemos distinguir dos tipos:
Adems podemos hacer el paso de parmetros de un tipo a otro. Generalmente si los tipos son
compatibles PL/SQL lo hace automticamente. En cualquier caso, podemos hacerlo de forma
manual utilizando las siguientes notaciones:
Nominal: el smbolo => despus del parmetro actual y antes del nombre del formal,
indica al compilador correspondencia.
Para que esto quede ms claro pasamos a escribir un ejemplo de paso de parmetros y conversin
de tipos.
Tenemos la especificacin de un procedimiento como esta:
PROCEDURE departamento(
n_departamento INTEGER,
localidad VARCHAR2
IS...
Desde el siguiente bloque se podrn realizar las llamadas indicadas:
DECLARE
num_departamento INTEGER;
aula VARCHAR(30)
BEGIN
...
- - posicional departamento(num_departamento, aula);
- - nominal departamento(num_departamento => n_departamento, aula =>localidad);
...
END;
Esto nos pasara los parmetros num_departamento al mismo tipo que n_departamento y
localidad al mismo tipo que aula.
Los parmetros que soporta PL/SQL pueden ser de entrada, salida o entrada/salida
IN
Los cursores explcitos los utilizamos cuando tenemos consultas que nos devuelven ms de una
fila.
Tenemos 4 operaciones bsicas para trabajar con un cursor explcito.
1. Declaracin del cursor: lo tenemos que declarar en la zona de declaraciones, con el
siguiente formato:CURSOR <nombrecursor> IS <sentencia SELECT>;
2. Apertura del cursor: Deber colocarse en la zona de instrucciones, con el siguiente
formato:
OPEN <nombrecursor>;
Al hacerlo se ejecuta automticamente la sentencia select y sus resultados se almacenan
en las estructuras internas de memoria manejadas por el cursor.
3. Recogida de informacin: Para recuperar la informacin anteriormente guardada en las
estructuras de memoria interna tenemos que usar el siguiente formato:
FETCH <nombrecursor> INTO {<variable> | <listavariables>};
Si tenemos una nica variable que recoge los datos de todas las columnas, el formato de la
variable seria el siguiente:
<variable> <nombrecursor>%ROWTYPE;
Si tenemos una lista de variables, cada una recoger la columna correspondiente de la
clusula select, por lo que sern del mismo tipo que las columnas.
4. - Cierre del cursor:
CLOSE <nombrecursor>;
Ahora, veamos un ejemplo de utilizacin de cursores explcitos:
DECLARE
CURSOR C1 IS SELECT nombre, apellido FROM arbitro;
Vnom VARCHAR2(12);
Vape VARCHAR2(20);
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO Vnom, Vape;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(Vnom || '' || Vapen);
END LOOP;
CLOSE C1;
END;
Si nos fijamos, en la declaracin de los cursores explcitos no utilizamos la clusula INTO, que s se
utilizaba en los cursores implcitos.
Ademas podis ver que despus del FETCH hemos comprobado si nos devuelve valores con la linea
del EXIT. Es algo importante ya que si no nos devuelve nada el LOOP se interrumpir.
DBMS_OUTPUT.PUT_LINE(Vnom);
FETCH C1 INTO Vnom;
END LOOP;
CLOSE C1;
END;
*Cursores PL/SQL segunda parte
Continuamos con los cursores de PL/SQL, esta vez vamos a ver variables de acoplamiento y
cursores con parmetros.
Dando continuidad al Manual de Oracle que estamos publicando en DesarrolloWeb.com, y en el
apartado del lenguaje PL/SQL, continuamos nuestras explicaciones sobre los cursores, que
habamoscomenzado a explicar en el artculo anterior.
Variables de acoplamiento
Si os fijis en el siguiente ejemplo veris que en la clusula where se incluye una variable que se
deber declarar previamente. Este tipo de variables recibe el nombre de variables de
acoplamiento. El programa la sustituir por su valor en el momento en que se abre el cursor, y se
seleccionarn las filas segn dicho valor.
Create or replace procedure ver_jugador(codeq varchar2)
IS
vequi varchar2(3);
cursor c1 is select nombre from jugador where cod=vequi;
vnom varchar2(15);
BEGIN
vequi:=codeq;
OPEN c1;
FETCH c1 INTO vnom;
WHILE c1%found LOOP
DBMS_OUTPUT.PUT_LINE(vnom);
FETCH c1 INTO vnom;
END LOOP;
CLOSE c1;
END;
Cursor FOR . LOOP
El trabajo normal de un cursor consiste en declarar un cursor, declarar una variable que recoger
los datos del cursor, abrir el cursor, recuperar con fetch, una a una, las filas extradas
introduciendo los datos en las variables, procesndolos y comprobando si se han recuperado
datos o no.
Para resumir todas esas tareas, tenemos una estructura cursor FOR...LOOP que hace todas estas
cosas de forma implcita, todas menos la declaracin del cursor.
El formato y el uso de esta estructura es:
SQL%NOTFOUND: nos dice si el ltimo insert, update,delete o select into no han afectado
a ninguna fila.
SQL%FOUND: nos dice si el ltimo insert, update,delete o select into ha afectado a una o
mas filas
SQL%ISOPEN: Nos dice si el cursor esta cerrado, por lo que en teora siempre nos dar
falso ya que Oracle cierra automticamente el cursor despus de cada orden SQL.
Cuando un select into hace referencia a una funcin de grupo nuca se levantar la excepcin
NO_DATA_FOUND y SQL%FOUND siempre ser verdadero. Esto se explica porque las funciones de
grupo siempre devuelven algn valor (NULL se considera un valor).
Uso de cursores para actualizar filas
Para realizar una actualizacin con un cursor tenemos que aadir la siguiente FOR UPDATE al final
de la declaracin del cursor:
CURSOR nombre_cursor <declaraciones> FOR UPDATE
Esto indica que las filas seleccionadas por el cursor van a ser actualizadas o borradas. Una vez
declarado un cursor FOR UPDATE, se incluir el especificador CURRENT OF nombre_cursor en la
clusula WHERE para actualizar o borrar la ltima fila recuperada mediante la orden FETCH.
{UPDATE|DELETE}... WHERE CURRENT OF nombre_cursor.
Os pongo un ejemplo para que quede claro:
Subir el salario a todos los empleados del departamento indicado en la llamada. El porcentaje se
indicar tambin en la llamada.
CREATE OR REPLACE PROCEDURE subir_salario (num_dept NUMBER, incre NUMBER)
IS
CURSOR c IS SELECT oficio, salario FROM empleados WHERE cod_dept=num_dept
FOR UPDATE;
reg c%ROWTYPE;
inc NUMBER (8);
BEGIN
OPEN c;
FETCH c INTO reg;
WHILE c%FOUND LOOP
inc :=(reg.salario/100 )* inc;
UPDATE empleados SET salario=salario+inc WHERE CURRENT
FETCH c INTO reg;
END LOOP;
END;
OF c
Tambin podemos usar ROWID en lugar de FOR UPDATE. ROWID nos indicar la fila que se va a
actualizar. Para ello, al declarar el cursor en la clusula SELECT indicaremos que seleccione
tambin el identificador de fila:
CURSOR nombre_cursor IS SELECT columna1,columna2,...ROWID FROM tabla;
Al ejecutarse el FETCH se guardar el nmero de fila en una variable y despus ese nmero se
podr usar en la clusula WHERE de la actualizacin:
{UPDATE |DELETE } ... WHERE ROWID = variable_rowid
El ejemplo anterior utilizando ROWID quedara de la siguiente manera:
CREATE OR REPLACE PROCEDURE subir_salario (num_dept NUMBER, incre NUMBER)
IS
CURSOR c IS SELECT oficio, salario,ROWID FROM empleados WHERE cod_dept=num_dept
FOR UPDATE;
reg c%ROWTYPE;
inc NUMBER (8);
BEGIN
OPEN c;
FETCH c INTO reg;
WHILE c%FOUND LOOP
inc :=(reg.salario/100 )* inc;
UPDATE empleados SET salario=salario+inc WHERE ROWID =
reg.ROWID;
FETCH c INTO reg;
END LOOP;
END;
Con este artculo damos por terminado todo lo referente a cursores y empezamos a tratar las
excepciones en el siguiente artculo.
*Excepciones en Oracle y PL/SQL
Las excepciones en el sistema gestor Oracle y el lenguaje PL/SQL, nos ayudan a detectar y tratar
errores en tiempo de ejecucin.
En este artculo del Manual de PL/SQL de Oracle vamos a ver lo que son las excepciones, para qu
sirven y cmo utilizarlas. Daremos un repaso tambin a los tipos de excepciones, las excepciones
definidas por el usuario y la sintaxis con la que tenemos que especificarlas.
Por ltimo, de paso que vemos cosas acerca del tratamiento de errores en PL/SQL, explicaremos el
RAISE_APPLICATION_ERROR, un componente del sistema gestor de base de datos Oracle que
ayuda a gestionar errores y sus mensajes de error.
Qu son las excepciones en Oracle
Las excepciones, presentes en la mayora de los lenguajes de programacin, sirven para tratar
errores en tiempo de ejecucin. En el sistema que nos ocupa, Oracle, sirven tambin para definir
qu se debe hacer frente a errores en sentencias definidas por el usuario. Cuando se produce un
error PL/SQL levanta una excepcin y pasa el control a la seccin excepcin correspondiente al
bloque PL/SQL.
El formato sera el siguiente:
BEGIN
.........
......
......
EXCEPTION
WHEN <nombre_excepcin> THEN
<instrucciones>;
......
[WHEN OTHERS THEN <instrucciones>;]
END;
Excepciones predefinidas
Son aquellas que se disparan automticamente al producirse determinados errores. Estas son las
ms comunes:
too_many_rows: Se produce cuando select into devuelve ms de una fila.
no_data_found: se produce cuando un select . into no devuelve ninguna fila.
login_denied: error cuando intentamos conectarnos a Oracle con un login y clave no validos.
not_logged_on: se produce cuando intentamos acceder a la base de datos sin estar conectados.
program_error: se produce cuando hay un problema interno en la ejecucin del programa.
value_error: se produce cuando hay un error aritmtico o de conversin.
zero_divide: se puede cuando hay una divisin entre 0.
dupval_on_index: se crea cuando se intenta almacenar un valor que creara duplicados en la clave
primaria o en una columna con restriccin UNIQUE.
invalid_number: se produce cuando se intenta convertir una cadena a un valor numrico.
Hay alguna ms pero estas son las ms utilizadas y tenemos que tener en cuenta que no es
necesario declararlas en la seccin DECLARE.
Excepciones definidas por el usuario
Son aquellas que crea el usuario. Para ello se requieren tres pasos:
1. Definicin: se realiza en la zona de DECLARE con el siguiente formato: nombre_excepcin
EXCEPTION
2. Disparar o levantar la excepcin mediante la orden raise: RAISE ;
3. Tratar la excepcin en el apartado EXCEPTION: WHEN THEN ;
Para que esto quede ms claro ponemos un ejemplo a continuacin.
DECLARE
...
Importe_mal EXCEPTION;
...
BEGIN
...
IF precio NOT BETWEEN mnimo and mximo THEN
RAISE importe_mal;
END IF;
...
EXCEPTION
WHEN importe_mal THEN DBMS_OUTPUT.PUT_LINE("Importe incorrecto");
...
END;
Otras excepciones
Existen otros errores internos de Oracle que no tienen asignada una excepcin, sino un cdigo de
error y un mensaje, a los que se accede mediante funciones SQLCODE y SQLERRM. Cuando se
produce un error de estos se trasfiere directamente el control a la seccin EXCEPTION donde se
tratara el error en la clausula WHEN OTHERS de la siguiente forma:
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error'||SQLCODE||SQLERRM.)
Utilizacin de RAISE_APPLICATION_ERROR
En el paquete DBMS_STANDARD se incluye un procedimiento llamado
RAISE_APPLICATION_ERROR que nos sirve para levantar errores y definir mensajes de error. Su
formato es el siguiente:
RAISE_APPLICATION_ERROR(numero_error,mensaje_error);
Es importante saber que el numero de error esta comprendido entre -20000 y -20999 y el mensaje
es una cadena de caracteres de hasta 512 bytes.
Este procedimiento crea una excepcin que solo puede ser tratada en WHEN OTHERS.
Ponemos un ejemplo para que nos quede ms claro.
Rollback
Este comando da por concluida la transaccin actual y deshace los cambios que se pudiesen haber
producido en la misma, liberando las filas bloqueadas. Se utiliza especialmente cuando no se
puede concluir una transaccin porque se han levantado excepciones.
Savepoint
Se utiliza para poner marcas o puntos de salvaguarda al procesar transacciones. Se utiliza junto
con rollback permitiendo deshacer cambios hasta los savepoint.
El nmero de savepoint esta limitado a 5 por sesin pero lo podemos modificar con la siguiente
sentencia:
savepoint numero;
Rollback implicito
Este comando se ejecuta cuando un programa almacenado (procedimiento o funcin) falla y no se
controla la excepcin que produjo el fallo. Pero si en el programa tenemos un commit estos
cambios no sern deshechos.
Rollback to
Deshace el trabajo realizado despus del punto indicado. Pero no se confirma el trabajo hecho
hasta el savepoint. La transaccin no finaliza hasta que se ejecuta un comando de control de
transacciones o hasta que finaliza la sesin.
Os dejo a continuacin un ejemplo bastante completo de lo que seria el control de transacciones:
create or replace procedure prueba (nfilas number)
as
begin
savepoint ninguna;
insert into tmp values ('primera fila');
savepoint una;
insert into tmp values ('segunda fila');
savepoint dos;
if nfilas=1 then
rollback to una;
else if nfilas=2 then
rollback to dos;
else
rollback to ninguna;
end if;
commit;
exception
when other then
rollback
end prueba;
Con este artculo terminamos la parte bsica sobre oracle, PL/SQL y pasamos a lo que podemos
denominar programacin avanzada de sql. Empezaremos con triggers en el siguiente artculo.
Cuando el evento que dispara el trigger es un delete haremos referencia al valor :old
porque el valor :new es nulo
Cuando el evento que dispara el trigger es un insert haremos referencia al valor :new
porque el :old es nulo.
Cuando el evento es un update tiene sentido hacer referencia a los dos valores.
Slo se pueden utilizar cuando el trigger es a nivel de fila (for each row).
Vamos a a crear un trigger que se dispar automticamente despus de la modificacin del salario
de la tabla empleado y pase un comentario a la tabla auditar.
Create or replace trigger auditar_salario
after update of salario
on empleado
for each row
begin
insert into auditar values
('se ha modificado el salario' || :old.num_empleado);
end;
Orden de ejecucin de los trigger
Una misma tabla puede tener varios triggers y el orden de disparo seria el siguiente:
1. Antes de comenzar a ejecutar la orden que provoca el disparo se ejecutaran los triggers
del tipo before.... for each statement
2. Para cada fila afectada por la orden:
a) se ejecutan los triggers del tipo before for each row
b) se ejecuta la actualizacin de la fila
c) se ejecutan los triggers after... for each row
3. Una vez realizada la operacin se ejecuta el after for each statement
Cuanndo se dispara un trigger este forma parte de la operacin que lo dispar de manera que si el
trigger falla, Oracle dar por fallida la operacin completa. Aunque el fallo sea a nivel de fila se
har rollback a toda la operacin.
Ejemplo:
create or replace trigger nombre_trigger
before insert or delete
begin
if insert then
.....
elseif deleting then
....
Estos trigger se disparan cuando se arranca o para la base de datos, entra o sale un usuario,
cuando se crea, modifica o elimina un objeto, etc.
En Oracle para crear este tipo de trigger tenemos que tener privilegios de Administer database
trigger.
La sintaxis de este trigger seria la siguiente:
create [or replace] trigger nombre_trigger
{ before | after } { <lista eventos de definicin> | <lista eventos del sistema>}
on { database | schema} [when (condicin)]
<cuerpo del trigger (bloque PL/SQL)>
Donde la lista de eventos de definicin puede tener uno o ms eventos DDL separados por or y la
lista de eventos del sistema igualmente separados por or.
Al asociar un disparador a un evento debemos indicar el momento en que se dispare. A
continuacin os dejo una tabla de evento, momento y cuando se disparara para dejarlo todo mas
o menos claro.
Evento
Momento
Se disparan:
STARTUP
AFTER
SHUTDOWN BEFORE
LOGON
AFTER
LOGOFF
BEFORE
SERVERERROR AFTER
CREATE
BEFORE |
AFTER
DROP
BEFORE |
AFTER
ALTER
BEFORE |
AFTER
TRUNCATE
BEFORE |
AFTER
GRANT
BEFORE |
AFTER
REVOKE
BEFORE |
AFTER
BEFORE |
AFTER
DLL
Oracle tiene algunas funciones que permiten acceder a los atributos del evento del disparo
ORA_YSEVENT, ORA_LOGIN, etc. Estas funciones pueden usarse en la clausula WHEN o en el
cuerpo del disparador. En el manual de Oracle podis encontrar el listado de todas estas
funciones.
Un ejemplo seria un trigger que nos guarda los datos de un usuario al hacer login en la base de
datos:
create or replace trigger control
after logon
on database
begin
insert into control_conexion (usuario, momento, evento)
values {ORA_LOGIN_USER, SYSTIMESTAMP, ORA_SYSEVENT);
end;
*Paquetes en Oracle
Vamos a ver que son los paquetes en el sistema gestor de base de datos Oracle, explicando
estructura y funcionamiento.
En este artculo que pertenece al tutorial de Oracle trateremos el tema de los paquetes de forma
detenida.
Los paquetes en Oracle se utilizan para guardar subprogramas y otros objetos de la base de datos.
Un paquete consta de los siguientes elementos:
Especificacin o cabecera: contiene las declaraciones pblicas (es decir, accesibles desde
cualquier parte de la aplicacin) de sus programas, tipos, constantes, variables, cursores,
excepciones, etc.
<cdigo de subprogramas>
[begin
<instrucciones iniciales>]
end nombre_paquete;
Como podis observar la cabecera se compila independientemente del cuerpo. Os dejo un
ejemplo de paquete para que lo veis ms claro.
/* Cabecera */
create or replace package busar_emple as
TYPE t_reg_emple is RECORD
(num_empleado emple.emp_no%TYPE,
apellido emple.apellido%TYPE,
salario emple.salario%TYPE,
departamento emple.dept_no%TYPE);
procedure ver_por_numero(v_cod emple.emp_no%TYPE);
procedure ver_por_apellido(v_ape emple.apellido%TYPE);
function datos (v_cod emple.emp_no%TYPE)
return t_reg_emple;
end buscar_emple;
/* Cuerpo */
create or replace package body buscar_emple as
vg_emple t_reg_emple;
procedure ver_emple; /* procedimiento privado*/
procedure ver_por_numero (v_cod emple.emp_no%TYPE)
is
begin
select emp_no, apellido, salario, dept_no into vg_emple from emple where emp_no=v_cod;
ver_emple;
end ver_por_numero;
procedure ver_por_apellido (v_ape emple.apellido%TYPE)
is
begin
select emp_no,apellido,salario,dept_no into vg_emple from emple where apellido=v_apellido;
ver_emple;
end ver_por_apellido;
function datos (v_cod emple.emp_no%TYPE)
return t_reg_emple
is
begin
select emp_no,apellido,salario,dept_no into vg_emple from emple where emp_no=v_cod;
procedure ver_emple
is
begin
DBMS_OUTPUT.PUT_LINE(vg_emple.num_empleado || '*' || vg_emple.apellido || '*' ||
vg_emple.salario || '*'|| vg_emple.departamento);
end ver_emple;
end buscar_emple;
Como podis ver este paquete nos permite buscar un empleado de tres formas distintas y
visualizar sus datos.
Utilizacin de los objetos definidos en los paquetes
Podemos utilizar los objetos definidos en los paquetes bsicamente de dos maneras distintas:
Desde el mismo paquete: esto quiere decir que cualquier objeto puede ser utilizado
dentro del paquete por otro objeto declarado en el mismo.
Para utilizar un objeto dentro del paquete tan slo tendramos que llamarlo. La llamada
sera algo as: v_emple :=buscar_emple.datos(v_n_ape); (como veis no utilizamos el
execute ya que nos encontramos dentro del paquete).
Desde fuera del paquete: Podemos utilizar los objetos de un paquete siempre y cuando
haya sido declarado en la especificacin del mismo. Para llamar a un objeto o
procedimiento desde fuera del paquete utilizaramos la siguiente notacin: execute
nombre_paquete.nombre_procedimiento(lista de parametros);