Basico de Oracle
Basico de Oracle
Basico de Oracle
UNIANDES
TEMA
“MANUAL BASICO DE ORACLE”
AUTOR
PATRICIO SANGOQUIZA
TUTOR
ING. OSCAR LLEREN
AMBATO-ECUADOR
2009
MANUAL DE ORACLE
COMO INSTALAR
CUSTOM OK
FORMS RUNTIME
GRAFICS RUNTTIME
RUNT TIME REPORTRS
ORACLE CONFIGURATION MANAGERS
ORACLE ODBC
ORACLE OPEN CLOSE
SERVIDOR:
Ponemos siguiente:
c.\orainst920NT_Disk\stage\productd.jar
Nombre: HOME_ORADATA_9I
RUTA DE ACCESO C:\ORACLE\DATABASE
SIGUIENTE:
ORACLE9IDATABASE 9.2.0.1
SIGUIENTE:
TIPO DE INSTALACION
ESTANDARS
SIGUEINTE
1 USO GENERAL
SIGUIENTE
SIGUIENTE
C:\ORACLE.DATABASE
SIGUIENTE
SIGUIENTE
INSTALAR
RUTA DE ACCESO UBICACION DEL DISCO
USUARIOS:
ACEPTAR
Para conectarse el servidor con el cliente, SERVIDOR base de datos listener puerto
1521
CUAL ES EL SERVIDOR
CUAL ES LA INSTANCIA (SID)
USUARIO/ CONTRASEÑA
EL CLIENTE:
LAB2-3/192.168.2.22
ORCL
SYSTEM/MASTER
SE TRABAJA EN: SQL PLUS
CONFIGURACION DEL CLIENTE
ASEMOS PING
192.168.2.22
TNSPING ORCL_CLI1 ENTER
CONECCIONES ODBC
REQUISITOS:
➢ INSTALAR DRIVE ODBC A ORACLE
➢ CREAR CONECCION NATIVA
➢ CREAR CONECCION ODBC
PANEL DE CONTROL
ORIGEN DE DATOS
ODBC
DNS DEL SISTEMA
ACCESS NUEVO
DATOS EXTERNOS
ENLAZAMOS A SCOTT
POR LO GENERAL NOS MUESTRA LAS TALAS DE EL USUARIO SCOTT
HERRAMIENTAS
SENTENCIAS
SQL> DDL: DATA DEFINITION LANGUAJE
DML: DATA MANIPULATION LENGUAJE
HISTORIA
El nacimiento del lenguaje SQL data de 1970 cuando E. F. Codd publica su libro: "Un
modelo de datos relacional para grandes bancos de datos compartidos". Ese libro
dictaría las direcrices de las bases de datos relacionales. Apenas dos años después IBM
(para quien trabajaba Codd) utiliza las directrices de Codd para crear el Standard
English Query Language (Lenguaje Estándar Inglés para Consultas) al que se le
llamó SEQUEL. Más adelante se le asignaron las siglas SQL (aunque en inglés se
siguen pronunciando SEQUEL, en español se le llama esecuele).
Actualmente el último estándar es el SQL del año 1999 que amplió el anterior estándar
conocido como SQL 92. El SQL de Oracle es compatible con el SQL del año 1999 e
incluye casi todo lo dictado por dicho estándar.
TIPOS DE INSTALACIONES
HARDWARE
NAVEGADOR:
Nota:
ORACLE_HOME es la ruta donde se instalará los componentes Oracle.
ORACLE_HOME name es el nombre del actual Oracle Home. Cada Oracle home tiene
un home name que distingue este de otros Oracle homes en el computador.
Nota:
Si ya existen componentes Oracle instalados en el pc, se recomienda instalarlos en otros
Oracle Home. No instale software de Oracle9i release 2 (9.2) dentro de un Oracle home
existente que contenga software Oracle8i o superior.
El nombre del Oracle home puede tener hasta 16 caracteres de longitud y esto incluye
solo caracteres alfanuméricos y underscores. Los espacios no son permitidos. El Oracle
Universal Installer no acepta un número como el primer caracter en el campo Nombre.
5. La base de datos Oracle9i es una base de datos relacional orientada a objetos, la cual
consiste de una base de datos y una instancia. Hay cuatro tipos de instalación:
• Enterprise Edition (la que se instalará): Si selecciona este tipo, Oracle Universal
Installer instala una base de datos preconfigurada, servicios, herramientas del ambiente
de la base de datos, opciones de licencias de Oracle, el Oracle Enterprise
Manager incluyendo Console, Management Server, y Intelligent Agent, utilidades
Oracle, y documentación en línea. Estos productos se usan mas en ambientes data
warehousing y transaction processing.
• Standard Edition: Si selecciona este tipo, Oracle Universal Installer instala una base
de datos preconfigurada, servicios, herramientas del ambiente de la base de datos, el
Oracle Enterprise Manager incluyendo Console, Management Server, y Intelligent
Agent, utilidades Oracle.
• Personal Edition: Si selecciona este tipo, Oracle Universal Installer instala el mismo
software del Enterprise Edition, pero soporta solo un simple usuario desarrollador y
ambiente que requiere full compatibilidad con Enterprise Edition y Standard Edition.
• Uso General: Los usuarios ejecutan una variedad de tareas en la base de datos, desde
simples transacciones a complejas consultas.
8. En esta ventana se detecta si ya existe una base de datos, si ya existe una base de
datos, asegúrese de preguntarse bien que desea hacer, actualizar o migrar la base de
datos. Si no va a actualizar o migrar una base de datos haga click Next para crear una
nueva.
9. En el campo Nombre de la Base de Datos Global, digite UNAB. En el campo SID,
acepte el valor por defecto, UNAB. Click Next.
Nota:
El nombre de la base de datos global es el nombre completo de la base de datos que
distingue únicamente de cualquier otra base de datos en el dominio de la red. Por
defecto del SID es el mismo nombre que el nombre de la base de datos global.
10. Entre la ubicación de archivos de la base de datos, acepte el valor por defecto,
C:\oracle\oradata, o escoja otra ruta. Click Next.
11. Acepte por defecto el Juego el Caracteres. Click Next.
20. Expanda Network / Databases, entonces de click en el signos más (+) para
expandir UNAB. Para loguearse a la instancia, entre system en el campo Usuario y la
contraseña dada en al instalación en el campo Contraseña, click OK.
21. Expanda Instancia y seleccione Configuración para ver el estado de la Base de Datos.
SQL*Plus
Para poder escribir sentencias SQL al servidor Oracle, éste incorpora la herramienta
SQL*Plus. Toda instrucción SQL que el usuario escribe, es verificada por este
programa. Si la instrucción es válida es enviada a Oracle, el cual enviará de regreso la
respuesta a la instrucción; respuesta que puede ser transformada por el programa
SQL*Plus para modificar su salida.
Para que el programa SQL*Plus funcione en el cliente, el ordenador cliente debe haber
sido configurado para poder acceder al servidor Oracle. En cualquier caso al acceder a
Oracle con este programa siempre preguntará por el nombre de usuario y contraseña.
Estos son datos que tienen que nos tiene que proporcionar el administrador (DBA) de la
base de datos Oracle.
Oracle desde un navegador. Para ello necesitamos tener configurado un servidor web
Oracle que permita la conexión con la base de datos. Utilizar iSQL*Plus es indicar una
dirección web en un navegador, esa dirección es la de la página iSQL*Plus de acceso a
la base de datos.
Desde la página de acceso se nos pedirá nombre de usuario, contraseña y nombre de la
base de datos con la que conectamos (el nombre de la base de datos es el nombre con el
que se la conoce en la red). Si la conexión es válida aparece esta pantalla:
Ilustración 1,
SEGURIDADES
➢ En las bases de datos se plantean problemas de seguridad como la compartición
de datos, acceso a estos, protección contra fallos, contra accesos no permitidos,
etc.
➢ El SGBD facilita mecanismos para prevenir los fallos (subsistema de control),
para detectarlos (subsistema de detección) y para corregirlos (subsistema de
recuperación).
➢ Aspectos fundamentales de la seguridad:
➢ Confidencialidad. No desvelar datos a usuarios no autorizados. Comprende
también la privacidad (protección de datos personales).
➢ Accesibilidad o disponibilidad. La información debe estar disponible y también
el acceso a los servicios.
➢ Integridad. Permite asegurar que los datos no han sido falseados o modificados
de forma indebida.
PROBLEMAS DE SEGURIDAD
Existen dos tipos de mecanismos de seguridad contra el acceso no autorizado:
• Discrecionales, se usan para otorgar privilegios a los usuarios.
• Obligatorios, sirven para imponer seguridad de múltiples niveles
clasificando los datos los usuarios en varias clases de seguridad e
implementando después la política de seguridad apropiada de la
organización.
➢ Además se pueden crear cuentas de acceso a la base de datos para los distintos
usuarios, las cuales se podrían agrupar en roles.
➢ En una base de datos estadística no se deber permitir tener acceso a información
confidencial detallada sobre individuos específicos. En ocasiones es posible
deducir ciertos hechos relativos a los individuos a partir de consultas, lo que
tampoco debe permitirse.
➢ Otra técnica de seguridad es el cifrado de datos.
CONFIDENCIALIDAD
PRIVILEGIOS DE AUTORIZACIÓN
PRIVILEGIOS:
Son de dos tipos
Sistema y objeto
Sistema
Concedida por administrador
Generado afecta al esquema o toda la base de datos
Objeto
Especificado para cada objeto en particular se los concede los dueños del objeto
Sistema
Create table en el esquema del usuario
Create an1 table
Crea una tabla en cualquier parte del sistema
Objeto
Insert into clientes
Ingresa elementos en la tabla
FORMAS DE CREACION
SHOW USER
El usuario es "SYSTEM"
SQL> CREATE USER US3
2 IDENTIFIED BY PUS3
3 PASSWORD EXPIRE
4 ACCOUNT LOCK;
Usuario creado
SQL> CONNECT SYSTEM/MASTER @SEPTIMO;
Conectado.
SQL> ALTER USER US3
2 IDENTIFIED BY JESSICA
Usuario modificado.
SQL> CONNECT US3/JESSICA @SEPTIMO;
Conectado.
SQL> GRANT CREATE SESSION TO US3;
Concesión terminada con éxito.
SQL> CONNECT SYSTEM/MASTER @SEPTIMO;
Conectado.
SQL> ALTER USER US3
2 ACCOUNT UNLOCK;
Usuario modificado.
Usuario modificado.
Usuario modificado.
1 fila creada.
SQL> COMMIT;
Validación terminada.
COD NOM
--------- --------------------
1 JESSICA
1 fila creada.
COD NOM
--------- --------------------
1 JESSICA
2 PATRICIO
COD NOM
--------- --------------------
1 DIEGO
SQL> INSERT INTO US2.EJERUS2 VALUES (3,'JESSICA');
INSERT INTO US2.EJERUS2 VALUES (3,'JESSICA')
COD NOM
--------- --------------------
1 daniel
COD NOM
--------- --------------------
1 DIEGOS
1 fila creada.
SQL> COMMIT;
Validación terminada.
1 fila creada.
SQL> COMMIT;
Validación terminada.
COD NOM
--------- --------------------
1 DIEGO
3 JESSICA
7 PATRICIO
6 DIEGOS
1 fila creada.
SQL> COMMIT;
Validación terminada.
SQL> INSERT INTO US5.EJERUS5 VALUES (14,'COSITA');
1 fila creada.
SQL> COMMIT;
Validación terminada.
SQL> SELECT
2 * FROM US5.EJERUS5;
COD NOM
--------- --------------------
1 daniel
14 COSITA
COD NOM
--------- --------------------
3 SANCHEZ DIEGO
1 JESSICA
2 PATRICIO
9 LUCRESIA LOCA
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
TEMP
CWMLITE
DRSYS
EXAMPLE
INDX
ODM
TOOLS
USERS
XDB
SEPTIMO2
SEPTIMO3
SEPTIMO5
SEPTIMO7
SEPTIMO1
SEPTIMO9
OTRO3
OTRO5
OTRO
OTRO7
TABLESPACE_NAME
------------------------------
OTRO2
SEPTIMO
ORTO
24 filas seleccionadas.
Usuario creado.
➢ SELECT. Se trata del comando que permite realizar consultas sobre los datos
de la base de datos. Obtiene datos de la base de datos.
➢ DML, Data Manipulation Language (Lenguaje de manipulación de datos).
Modifica filas (registros) de la base de datos. Lo forman las instrucciones
INSERT, UPDATE, MERGE y DELETE.
➢ DDL, Data Definition Language (Lenguaje de definición de datos). Permiten
modificar la estructura de las tablas de la base de datos. Lo forman las
instrucciones CREATE, ALTER, DROP, RENAME y TRUNCATE.
➢ Instrucciones de transferencia. Administran las modificaciones creadas por las
instrucciones DML. Lo forman las instrucciones ROLLBACK, COMMIT y
SAVEPOINT
➢ DCL, Data Control Language (Lenguaje de control de datos). Administran
los derechos y restricciones de los usuarios. Lo forman las instrucciones
GRANT y REVOKE.
NORMAS DE ESCRITURA
Cada usuario de una base de datos posee un esquema. El esquema tiene el mismo
nombre que el usuario y sirve para almacenar los objetos de esquema, es decir los
objetos que posee el usuario.
Esos objetos pueden ser: tablas, vistas, secuencias, índices, sinónimos e instantáneas.
Esos objetos son manipulados y creados por los usuarios. En principio sólo los
administradores y los usuarios propietarios pueden acceder a cada objeto, salvo que se
modifiquen los privilegios del objeto para permitir su acceso por parte de otros usuarios.
CREACIÓN DE TABLAS
ORDEN DESCRIBE
DESCRIBE proveedores;
Y aparecerán los campos de la tabla proveedores.
ORDEN INSERT
Permite añadir datos a las tablas. Más adelante se comenta de forma más detallada. Su
sintaxis básica es:
Ejemplo:
En el diccionario de datos hay una entrada que permite consultar las tablas de cada
usuario. Esa entrada es USER_TABLES. De forma que SELECT * FROM
USER_TABLES obtiene una vista de las tablas del usuario actual. Hay diversas
columnas que muestran datos sobre cada tabla, entre ellas la columna
TABLES_NAME muestra el nombre de la tabla.
BORRAR TABLAS
La orden DROP TABLE seguida del nombre de una tabla, permite eliminar la tabla en
cuestión.
Al borrar una tabla:
El tipo DATE permite almacenar fechas. Las fechas se pueden escribir en formato día,
mes y año entre comillas. El separador puede ser una barra de dividir, un guión y casi
cualquier símbolo.
Para almacenar la fecha actual basta con utilizar la función SYSDATE que devuelve
esa fecha.
TIMESTAMP
Es una extensión del anterior, almacena valores de día, mes y año, junto con hora,
minuto y segundos (incluso con decimales). Con lo que representa un instante concreto
en el tiempo. Un ejemplo de TIMESTAMP sería ‘2/2/2004 18:34:23,34521’. En este
caso si el formato de fecha y hora del sistema está pensado para el idioma español, el
separador decimal será la coma (y no el punto)
INTERVALOS
Hay unos cuantos tipos de datos en Oracle que sirven para almacenar intervalos de
tiempo (no fechas, sino una suma de elementos de tiempo).
INTERVAL YEAR TO MONTH
Este tipo de datos almacena años y meses. Tras la palabra YEAR se puede indicar la
precisión de los años (cifras del año), por defecto es de dos. Ejemplo:
CREATE TABLE tiempos (meses INTERVAL YEAR(3) TO MONTH);
INSERT INTO tiempos VALUES(’3-2’);
En el ejemplo se inserta un registro que representa 3 años y dos meses.
RAW
Sirve para almacenar valores binarios de hasta 2000 bytes (se puede especificar el
tamaño máximo entre paréntesis). El valor LONG RAW almacena hasta 2GB.
LOB
Son varios tipos de datos que permiten almacenar valores muy grandes. Más adelante se
comentan en su totalidad. Incluye a BLOB, CLOB, NCLOB y BFILE.
ROWID
Valor hexadecimal que representa la dirección única de una fila en su tabla.
MODIFICAR TABLAS
CAMBIAR DE NOMBRE
La orden RENAME permite el cambio de nombre de cualquier objeto. Sintaxis:
RENAME nombreViejo TO nombreNuevo
MODIFICAR TABLAS
La versátil ALTER TABLE permite hacer cambios en la estructura de una tabla.
AÑADIR COLUMNAS
ALTER TABLE nombreTabla ADD(nombreColumna TipoDatos
[Propiedades]
[,columnaSiguiente tipoDatos [propiedades]...)
Permite añadir nuevas columnas a la tabla. Se deben indicar su tipo de datos y sus
propiedades si es necesario (al estilo de CREATE TABLE).
Las nuevas columnas se añaden al final, no se puede indicar otra posición.
BORRAR COLUMNAS
ALTER TABLE nombreTabla DROP(columna);
Elimina la columna indicada de manera irreversible e incluyendo los datos que contenía.
No se puede eliminar la última columna (habrá que usar DROP TABLE).
MODIFICAR COLUMNA
Permite cambiar el tipo de datos y propiedades de una determinada columna. Sintaxis:
ALTER TABLE nombreTabla MODIFY(columna tipo [propiedades]
[columnaSiguiente tipo [propiedades] ...]
Los cambios que se permiten son:
Incrementar precisión o anchura de los tipos de datos
Sólo se puede reducir la anchura si la anchura máxima de un campo si esa columna
posee nulos en todos los registros, o todos los valores so o no hay registros
Se puede pasar de CHAR a VARCHAR2 y viceversa (si no se modifica la anchura)
Se puede pasar de DATE a TIMESTAMP y viceversa
RESTRICCIONES
Una restricción es una condición de obligado cumplimiento para una o más columnas de
la tabla. A cada restricción se le pone un nombre, en el caso de no poner un nombre (en
las que eso sea posible) entonces el propio Oracle le coloca el nombre que es un
mnemotécnico con el nombre de tabla, columna y tipo de restricción.
Su sintaxis general es:
{CREATE TABLE nombreTabla |
ALTER TABLE nombreTabla {ADD | MODIFY}}
(campo tipo [propiedades] [,...]
CONSTRAINT nombreRestricción tipoRestricción (columnas)
[,CONSTRAINT nombrerestricción tipoRestricción (columnas) ...)
Las restricciones tienen un nombre, se puede hacer que sea Oracle el que les ponga
nombre, pero entonces será críptico. Por eso es mejor ponerle uno mismo.
Los nombres de restricción no se pueden repetir para el mismo esquema, por lo que es
buena idea incluir de algún modo el nombre de la tabla, los campos involucrados y el
tipo de restricción en el nombre de la misma. Por ejemplo pieza_id_pk podría indicar
que el campo id de la tabla pieza tiene una clave principal (PRIMARY KEY).
PROHIBIR NULOS
La restricción NOT NULL permite prohibir los nulos en una determinada tabla. Eso
obliga a que la columna tenga que tener obligatoriamente un valor para que sea
almacenado el registro.
Se puede colocar durante la creación (o modificación) del campo añadiendo la palabra
NOT NULL tras el tipo:
CREATE TABLE cliente(dni VARCHAR2(9) NOT NULL);
En ese caso el nombre le coloca Oracle. La otra forma (que admite nombre) es:
CREATE TABLE cliente(dni VARCHAR2(9)
CONSTRAINT dni_sinnulos NOT NULL(dni));
VALORES ÚNICOS
Las restricciones de tipo UNIQUE obligan a que el contenido de uno o más campos no
puedan repetir valores. Nuevamente hay dos formas de colocar esta restricción:
CREATE TABLE cliente(dni VARCHAR2(9) UNIQUE);
En ese caso el nombre de la restricción la coloca el sistema Oracle. Otra forma es:
CREATE TABLE cliente(dni VARCHAR2(9) CONSTRAINT dni_u UNIQUE);
Esta forma permite poner un nombre a la restricción. Si la repetición de valores se
refiere a varios campos, la forma sería:
CREATE TABLE alquiler(dni VARCHAR2(9),
cod_pelicula NUMBER(5),
CONSTRAINT alquiler_uk UNIQUE(dni,cod_pelicula) ;
La coma tras la definición del campo cod_pelicula hace que la restricción sea
independiente de ese campo. Eso obliga a que, tras UNIQUE se indique la lista de
campos.
Los campos UNIQUE son las claves candidatas de la tabla (que habrán sido detectadas
en la fase de diseño de la base de datos).
CLAVE PRIMARIA
La clave primaria de una tabla la forman las columnas que indican a cada registro de la
misma. La clave primaria hace que los campos que la forman sean NOT NULL (sin
posibilidad de quedar vacíos) y que los valores de los campos sean de tipo UNIQUE
(sin posibilidad de repetición).
Si la clave está formada por un solo campo basta con:
CREATE TABLE cliente(
dni VARCHAR2(9) PRIMARY KEY,
Nombre VARCHAR(50)) ;
O, poniendo un nombre a la restricción:
CREATE TABLE cliente(
dni VARCHAR2(9) CONSTRAINT cliente_pk PRIMARY KEY,
Nombre VARCHAR(50)) ;
Si la clave la forman más de un campo:
CREATE TABLE alquiler(dni VARCHAR2(9),
cod_pelicula NUMBER(5),
CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula) ;
CLAVE SECUNDARIA O FORÁNEA
Una clave secundaria o foránea, es uno o más campos de una tabla que están
relacionados con la clave principal de los campos de otra tabla. La forma de indicar una
clave foránea es:
CREATE TABLE alquiler(dni VARCHAR2(9),
cod_pelicula NUMBER(5),
CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicula),
CONSTRAINT dni_fk FOREIGN KEY (dni)
REFERENCES clientes(dni),
CONSTRAINT pelicula_fk FOREIGN KEY (cod_pelicula)
REFERENCES peliculas(cod)
);
Esta completa forma de crear la tabla alquiler incluye sus claves foráneas, el campo dni
hace referencia al campo dni de la tabla clientes y el campo cod_pelicula que hace
referencia al campo cod de la tabla peliculas. También hubiera bastado con indicar sólo
la tabla a la que hacemos referencia, si no se indican los campos relacionados de esa
tabla, se toma su clave principal (que es lo normal).
Esto forma una relación entre dichas tablas, que además obliga al cumplimiento de la
integridad referencial. Esta integridad obliga a que cualquier dni incluido en la tabla
alquiler tenga que estar obligatoriamente en la tabla de clientes. De no ser así el registro
no será insertado en la tabla (ocurrirá un error).
Otra forma de crear claves foráneas (sólo válida para claves de un solo campo) es:
CREATE TABLE alquiler(
dni VARCHAR2(9) CONSTRAINT dni_fk
REFERENCES clientes(dni),
cod_pelicula NUMBER(5) CONSTRAINT pelicula_fk
REFERENCES peliculas(cod)
CONSTRAINT alquiler_pk PRIMARY KEY(dni,cod_pelicu ));
Esta definición de clave secundario es idéntica a la anterior, sólo que no hace falta
colocar el texto FOREIGN KEY.
Por ello Oracle nos ofrece dos soluciones a añadir tras la cláusula REFERENCES:
• ON DELETE SET NULL. Coloca nulos todas las claves secundarias
relacionadas con la borrada.
• ON DELETE CASCADE. Borra todos los registros cuya clave secundaria es
igual que la clave del registro borrado.
Si no se indica esta cláusula, no se permite el borrado de registros relacionados.
El otro problema ocurre si se desea cambiar el valor de la clave principal en un registro
relacionado con claves secundarias. En muchas bases de datos se implementan
soluciones consistentes en añadir ON UPDATE CASCADE o ON UPDATE SET
NULL. Oracle no implementa directamente estas soluciones. Por lo que hay que hacerlo
de otra forma. Las soluciones son:
• Implementar un TRIGGER para que cuando se actualice el registro se actualicen
las claves secundarias (el mecanismo de funcionamiento es parecido al que se
muestra en el siguiente párrafo).
• Añadir un registro igual que el que se quiere cambiar en la tabla principal, pero
con el nuevo valor de la clave. Mediante una instrucción UPDATE actualizar a
ese valor de clave todos los registros de la tabla secundaria cuyo valor coincida
con la antigua clave. Finalmente borrar el registro en la tabla principal con el
valor antiguo de la clave.
La sintaxis completa para añadir claves foráneas es:
CREATE TABLE tabla(lista_de_campos
CONSTRAINT nombreRestriccion FOREIGN KEY (listaCampos)
REFERENCES tabla(clavePrincipalRelacionada)
[ON UPDATE {SET NULL | CASCADE}]
);
Si es de un solo campo existe esta alternativa:
CREATE TABLE tabla(lista_de_campos tipos propiedades,
nombreCampoClaveSecundaria
CONSTRAINT nombreRestriccion
REFERENCES tabla(clavePrincipalRelacionada)
[ON UPDATE {SET NULL | CASCADE}]
);
PASOS:
SHOW USER
el usuario es "SYSTEM"
SQL> CREATE USER US3
2 IDENTIFIED BY PUS3
3 PASSWORD EXPIRE
4 ACCOUNT LOCK;
Usuario creado.
Usuario modificado.
Usuario modificado.
Tabla creada.
SQL> INSERT INTO US2.EJERUS2 VALUES (3,'JESSICA');
INSERT INTO US2.EJERUS2 VALUES (3,'JESSICA')
TABLAS
SQL> CREATE TABLE CLIENTES(
2 COD_CLI NUMBER (5) CONSTRAINT PK_CLIENTES PRIMARY KEY,
3 NOM_CLI VARCHAR(40) NOT NULL,
4 DIR_CLI VARCHAR(50),
5 TEL_CLI CHAR(9),
6 RUC_CLI CHAR(13));
Tabla creada.
AND
OR
CONSULTAS SELECT
CONDICIONES
Se pueden realizar consultas que restrinjan los datos de salida de las tablas. Para ello se
utiliza la cláusula WHERE. Esta cláusula permite colocar una condición que han de
cumplir todos los registros, los que no la cumplan no aparecen en el resultado.
Ejemplo:
SELECT Tipo, Modelo FROM Pieza WHERE Precio>3;
OPERADORES DE COMPARACIÓN
Se pueden utilizar tanto para comparar números como para comparar textos y fechas. En
el caso de los textos, las comparaciones se hacen en orden alfabético. Sólo que es un
orden alfabético estricto. Es decir el orden de los caracteres en la tabla de códigos.
Así la letra Ñ y las vocales acentuadas nunca quedan bien ordenadas ya que figuran con
códigos más altos. Las mayúsculas figuran antes que las minúsculas (la letra 'Z' es
menor que la 'a').
BETWEEN
El operador BETWEEN nos permite obtener datos que se encuentren en un rango. Uso:
SELECT tipo,modelo,precio FROM piezas
WHERE precio BETWEEN 3 AND 8;
Saca piezas cuyos precios estén entre 3 y 8 (ambos incluidos).
IN
Permite obtener registros cuyos valores estén en una lista:
SELECT tipo,modelo,precio FROM piezas
WHERE precio IN (3,5, 8);
Obtiene piezas cuyos precios sea 3, 5 u 8, sólo uno de esos tres.
LIKE
Se usa sobre todo con textos, permite obtener registros cuyo valor en un campo cumpla
una condición textual. LIKE utiliza una cadena que puede contener estos símbolos:
Símbolo Significado
% Una serie cualquiera de caracteres
_ Un carácter cualquiera
Ejemplos:
/* Selecciona nombres que empiecen por S */
SELECT nombre FROM personas WHERE nombre LIKE 'A%';
/*Selecciona las personas cuyo apellido sea Sanchez, Senchez,
Stnchez,...*/
SELECT apellido1 FROM Personas WHERE apellido1 LIKE 'S_nchez';
IS NULL
Devuelve verdadero si una expresión contiene un nulo:
SELECT nombre,apellidos FROM personas
WHERE telefono IS NULL
Esa instrucción selecciona a la gente que no tiene teléfono
Precedencia de operadores
A veces las expresiones que se producen en los SELECT son muy extensas y es difícil
saber que parte de la expresión se evalúa primero, por ello se indica la siguiente tabla de
precedencia:
ORDENACIÓN
El orden inicial de los registros obtenidos por un SELECT no guarda más que una
relación respecto al orden en el que fueron introducidos. Para ordenar en base a criterios
más interesantes, se utiliza la cláusula ORDER BY.
En esa cláusula se coloca una lista de campos que indica la forma de ordenar. Se ordena
primero por el primer campo de la lista, si hay coincidencias por el segundo, si ahí
también las hay por el tercero, y así sucesivamente.
Se puede colocar las palabras ASC O DESC (por defecto se toma ASC). Esas palabras
significan en ascendente (de la A a la Z, de los números pequeños a los grandes) o en
descendente (de la Z a la a, de los números grandes a los pequeños) respectivamente.
Sintaxis completa de SELECT:
SELECT expresiones
FROM tabla
[WHERE condición]
ORDER BY listaDeCamposOAlias;
FUNCIONES
Oracle incorpora una serie de instrucciones que permiten realizar cálculos avanzados, o
bien facilitar la escritura de ciertas expresiones. Todas las funciones reciben datos para
poder operar (parámetros) y devuelven un resultado (que depende de los parámetros
enviados a la función. Los argumentos se pasan entre paréntesis:
nombreFunción[(parámetro1[, parámetro2,...])]
Si una función no precisa parámetros (como SYSDATE) no hace falta colocar los
paréntesis.
Las hay de dos tipos:
• Funciones que operan con una sola fila
• Funciones que operan con varias filas.
FUNCIONES DE CARACTERES
Conversión del texto a mayúsculas y minúsculas
Son:
FUNCIONES DE TRANSFORMACIÓN
REDONDEOS
MATEMÁTICAS
Funciones De Fecha
Las fechas se utilizan muchísimo en todas las bases de datos. Oracle proporciona dos
tipos de datos para manejar fechas, los tipos DATE y TIMESTAMP. En el primer caso
se almacena una fecha concreta (que incluso puede contener la hora), en el segundo
caso se almacena un instante de tiempo más concreto que puede incluir incluso
fracciones de segundo.
Obtener La Fecha Y Hora Actual
Calcular Fechas
TO_CHAR
Obtiene un texto a partir de un número o una fecha. En especial se utiliza con fechas (ya
que de número a texto se suele utilizar de forma implícita. fechas
En el caso de las fechas se indica el formato de conversión, que es una cadena que
puede incluir estos símbolos (en una cadena de texto):
Ejemplos:
SELECT TO_CHAR(SYSDATE, 'DD/MONTH/YYYY, DAY HH:MI:SS')
FROM DUAL
/* Sale : 16/AGOSTO /2004, LUNES 08:35:15, por ejemplo
TO_NUMBER
Convierte textos en números. Se indica el formato de la conversión (utilizando los
mismos símbolos que los comentados anteriormente).
TO_DATE
Convierte textos en fechas. Como segundo parámetro se utilizan los códigos de formato
de fechas comentados anteriormente.
Funciones Condicionales
CASE
Es una instrucción incorporada a la versión 9 de Oracle que permite establecer
condiciones de salida (al estilo if-then-else de muchos lenguajes). Sintaxis:
CASE expresión WHEN valor1 THEN resultado1
[ WHEN valor2 THEN resultado2 ....
...
ELSE resultadoElse
]
END
El funcionamiento es el siguiente:
1> Se evalúa la expresión indicada
2> Se comprueba si esa expresión es igual al valor del primer WHEN, de ser así se
devuelve el primer resultado (cualquier valor excepto nulo)
3> Si la expresión no es igual al valor 1, entonces se comprueba si es igual que el segundo.
De ser así se escribe el resultado 3. De no ser así se continua con el siguiente WHEN
4> El resultado indicado en la zona ELSE sólo se escribe si la expresión no vale ningún
valor de los indicados.
Ejemplo:
SELECT
CASE cotizacion WHEN 1 THEN salario*0.85
WHEN 2 THEN salario * 0.93
WHEN 3 THEN salario * 0.96
ELSE salario
END
FROM empleados;
FUNCIÓN DECODE
Similar a la anterior pero en forma de función. Se evalúa una expresión y se colocan a
continuación pares valor, resultado de forma que si se la expresión equivale al valor, se obtiene
el resultado indicado. Se puede indicar un último parámetro con el resultado a efectuar en caso
de no encontrar ninguno de los valores indicados.
Sintaxis:
DECODE(expresión, valor1, resultado1
[,valor2, resultado2,...]
[,valorPordefecto])
Ejemplo:
SELECT
DECODE(cotizacion,1, salario*0.85,
2,salario * 0.93,
3,salario * 0.96,
salario)
FROM empleados;
Este ejemplo es idéntico al utilizado para la instrucción CASE
INSERCIÓN DE DATOS
La adición de datos a una tabla se realiza mediante la instrucción INSERT. Su sintaxis
fundamental es:
INSERT INTO tabla [(listaDeCampos)]
VALUES (valor1 [,valor2 ...])
La tabla representa la tabla a la que queremos añadir el registro y los valores que siguen
a VALUES son los valores que damos a los distintos campos del registro. Si no se
especifica la lista de campos, la lista de valores debe seguir el orden de las columnas
según fueron creados (es el orden de columnas según las devuelve el comando
DESCRIBE).
La lista de campos a rellenar se indica si no queremos rellenar todos los campos. Los
campos no rellenados explícitamente con la orden INSERT, se rellenan con su valor por
defecto (DEFAULT) o bien con NULL si no se indicó valor alguno. Si algún campo
tiene restricción de tipo NOT NULL, ocurrirá un error si no rellenamos el campo con
algún valor.
Por ejemplo, supongamos que tenemos una tabla de clientes cuyos campos son: dni,
nombre, apellido1, apellido2, localidad y dirección; supongamos que ese es el orden de
creación de los campos de esa tabla y que la localidad tiene como valor por defecto
Palencia y la dirección no tienen valor por defecto. En ese caso estas dos instrucciones
son equivalentes:
INSERT INTO clientes
VALUES('11111111','Pedro','Gutiérrez', 'Crespo',DEFAULT,NULL);
INSERT INTO clientes(dni,nombre,apellido1,apellido2)
VALUES('11111111','Pedro','Gutiérrez', 'Crespo')
Son equivalentes puesto que en la segunda instrucción los campos no indicados se
rellenan con su valor por defecto y la dirección no tiene valor por defecto. La palabra
DEFAULT fuerza a utilizar ese valor por defecto.
ACTUALIZACIÓN DE REGISTROS
La modificación de los datos de los registros lo implementa la instrucción UPDATE.
Sintaxis:
UPDATE tabla
SET columna1=valor1 [,columna2=valor2...]
[WHERE condición]
Se modifican las columnas indicadas en el apartado SET con los valores indicados. La
cláusula WHERE permite especificar qué registros serán modificados.
Ejemplos:
UPDATE clientes SET provincia='Ourense'
WHERE provincia='Orense';
UPDATE productos SET precio=precio*1.16;
El primer dato actualiza la provincia de los clientes de Orense para que aparezca como
Ourense. El segundo UPDATE incrementa los precios en un 16%. La expresión para el
valor puede ser todo lo compleja que se desee:
UPDATE partidos SET fecha= NEXT_DAY(SYSDATE,'Martes')
WHERE fecha=SYSDATE;
BORRADO DE REGISTROS
Se realiza mediante la instrucción DELETE:
DELETE [FROM] tabla
[WHERE condición]
Es más sencilla que el resto, elimina los registros de la tabla que cumplan la condición
indicada. Ejemplos:
DELETE FROM empleados
WHERE seccion=23;
DELETE FROM empleados
WHERE id_empleado IN (SELECT id_empleado FROM errores_graves);
Hay que tener en cuenta que el borrado de un registro no puede provocar fallos de
integridad y que la opción de integridad ON DELETE CASCADE (véase página 21,
clave secundaria o foránea) hace que no sólo se borren los registros indicados en el
SELECT, sino todos los relacionados.
TRANSACCIONES
Como se ha comentado anteriormente, una transacción está formada por una serie de
instrucciones DML. Una transacción comienza con la primera instrucción DML que se
ejecute y finaliza con alguna de estas circunstancias:
• Una operación COMMIT o ROLLBACK
• Una instrucción DDL (como ALTER TABLE por ejemplo)
• Una instrucción DCL (como GRANT)
• El usuario abandona la sesión
• Caída del sistema
Hay que tener en cuenta que cualquier instrucción DDL o DCL da lugar a un COMMIT
implícito, es decir todas las instrucciones DML ejecutadas hasta ese instante pasan a ser
definitivas.
COMMIT
La instrucción COMMIT hace que los cambios realizados por la transacción sean
definitivos, irrevocables. Sólo se debe utilizar si estamos de acuerdo con los cambios,
conviene asegurarse mucho antes de realizar el COMMIT ya que las instrucciones
ejecutadas pueden afectar a miles de registros.
Además el cierre correcto de la sesión da lugar a un COMMIT, aunque siempre
conviene ejecutar explícitamente esta instrucción a fin de asegurarnos de lo que
hacemos.
ROLLBACK
Esta instrucción regresa a la instrucción anterior al inicio de la transacción,
normalmente el último COMMIT, la última instrucción DDL o DCL o al inicio de
sesión. Anula definitivamente los cambios, por lo que conviene también asegurarse de
esta operación.
Un abandono de sesión incorrecto o un problema de comunicación o de caída del
sistema dan lugar a un ROLLBACK implícito.
SAVEPOINT
Esta instrucción permite establecer un punto de ruptura. El problema de la combinación
ROLLBACK/COMMIT es que un COMMIT acepta todo y un ROLLBACK anula todo.
SAVEPOINT permite señalar un punto intermedio entre el inicio de la transacción y la
situación actual. Su sintaxis es:
...instrucciones DML...
SAVEPOINT nombre
....instrucciones DML...
Para regresar a un punto de ruptura concreto se utiliza ROLLBACK TO SAVEPOINT
seguido del nombre dado al punto de ruptura. Cuando se vuelve a un punto marcado, las
instrucciones que siguieron a esa marca se anulan definitivamente.
Estado De Los Datos Durante La Transacción
Si se inicia una transacción usando comandos DML hay que tener en cuenta que:
• Se puede volver a la instrucción anterior a la transacción cuando se desee
• Las instrucciones de consulta SELECT realizadas por el usuario que inició la
transacción muestran los datos ya modificados por las instrucciones DML
• El resto de usuarios ven los datos tal cual estaban antes de la transacción, de
hecho los registros afectados por la transacción aparecen bloqueados hasta que
la transacción finalice. Esos usuarios no podrán modificar los valores de dichos
registros.
Tras la transacción todos los usuarios ven los datos tal cual quedan tras el fin de
transacción. Los bloqueos son liberados y los puntos de ruptura borrados.
CONSULTAS
SQL> DECLARE
2 A NUMBER;
3 B NUMBER;
4 C NUMBER;
5 BEGIN
6 A:=5;
7 B:=&VALORB;
8 C:=A+B;
9 DBMS_OUTPUT.PUT_LINE('LA SUMA ES:'||C);
10 END;
11 /
Introduzca un valor para valorb: 7
antiguo 7: B:=&VALORB;
nuevo 7: B:=7;
LA SUMA ES:12
Procedimiento PL/SQL terminado con éxito.
SQL> DECLARE
2 CONTADOR NUMBER:=0;
3 BEGIN
4 LOOP
5 DBMS_OUTPUT.PUT(CONTADOR||'');
6 CONTADOR:=CONTADOR+1;
7 EXIT WHEN CONTADOR=10;
8 END LOOP;
9 DBMS_OUTPUT.PUT_LINE('FIN DEL CICLO');
10 END;
11 /
0123456789FIN DEL CICLO
SQL> DECLARE
2 CONTADOR NUMBER:=0;
3 BEGIN
4 WHILE CONTADOR<10 LOOP
5 DBMS_OUTPUT.PUT(CONTADOR||'');
6 CONTADOR:=CONTADOR+1;
7 END LOOP;
8 DBMS_OUTPUT.PUT_LINE('FIN DEL CICLO');
9 END;
10 /
0123456789FIN DEL CICLO
Procedimiento PL/SQL terminado con éxito.
SQL> DECLARE
2 CONTADOR NUMBER:=0;
3 BEGIN
4 FOR CONTADOR IN 1..10 LOOP
5 DBMS_OUTPUT.PUT(CONTADOR||'');
6 END LOOP;
7 DBMS_OUTPUT.PUT_LINE('FIN DEL CICLO');
8 END;
9 /
12345678910FIN DEL CICLO
SQL> DECLARE
2 X NUMBER;
3 BEGIN
4 X:=&VALORX;
5 IF (X MOD 2= 0) THEN DBMS_OUTPUT.PUT('MULTIPLO/2');
6 ELSIF X MOD 3 =0 THEN DBMS_OUTPUT.PUT('MULTIPLO/3');
7 ELSIF X MOD 5 = 0 THEN DBMS_OUTPUT.PUT('MULTIPLO/5');
8 ELSE DBMS_OUTPUT.PUT('MULTIPLO DE OTRO NUMERO');
9 END IF;
10 DBMS_OUTPUT.PUT_LINE('FIN DEL CICLO');
11 END;
12 /
Introduzca un valor para valorx: 5
antiguo 4: X:=&VALORX;
nuevo 4: X:=5;
MULTIPLO/5FIN DEL CICLO
SQL> DECLARE
2 X NUMBER;
3 BEGIN
4 X:=&VALORX;
5 IF (X MOD 2= 0) THEN DBMS_OUTPUT.PUT('MULTIPLO/2');
6 ELSIF X MOD 3 =0 THEN DBMS_OUTPUT.PUT('MULTIPLO/3');
7 ELSIF X MOD 5 = 0 THEN DBMS_OUTPUT.PUT('MULTIPLO/5');
8 ELSE DBMS_OUTPUT.PUT('MULTIPLO DE OTRO NUMERO');
9 END IF;
10 DBMS_OUTPUT.PUT_LINE('FIN DEL CICLO');
11 END;
12 /
Introduzca un valor para valorx: 8
antiguo 4: X:=&VALORX;
nuevo 4: X:=8;
MULTIPLO/2FIN DEL CICLO
Procedimiento PL/SQL terminado con éxito.
SQL> DECLARE
2 X NUMBER;
3 BEGIN
4 X:=&VALORX;
5 IF (X MOD 2= 0) THEN DBMS_OUTPUT.PUT('MULTIPLO/2');
6 ELSIF X MOD 3 =0 THEN DBMS_OUTPUT.PUT('MULTIPLO/3');
7 ELSIF X MOD 5 = 0 THEN DBMS_OUTPUT.PUT('MULTIPLO/5');
8 ELSE DBMS_OUTPUT.PUT('MULTIPLO DE OTRO NUMERO');
9 END IF;
10 DBMS_OUTPUT.PUT_LINE('FIN DEL CICLO');
11 END;
12 /
Introduzca un valor para valorx: 9
antiguo 4: X:=&VALORX;
nuevo 4: X:=9;
MULTIPLO/3FIN DEL CICLO
Tabla creada.
1 fila creada.
SQL> COMMIT
2 ;
Validación terminada.
1 fila creada.
1 fila creada.
SQL> COMMIT;
Validación terminada.
SQL> INSERT INTO SUELDO VALUES(3,'MARIA JOSE','4','50');
1 fila creada.
SQL> COMMIT;
Validación terminada.
10 filas seleccionadas.
SQL> DECLARE
2 MCODIGO CHAR(6);
3 MNOMB VARCHAR(30);
4 MNUMHORAS NUMBER;
5 MVALHORA NUMBER;
6 MSUELDO NUMBER;
7 BEGIN
8 MCODIGO:=&CODIGO;
9 SELECT NOMB INTO MNOMB FROM SUELDO
10 WHERE NUM_EMP=MCODIGO;
11 SELECT NHORAS INTO MNUMHORAS FROM SUELDO
12 WHERE NUM_EMP=MCODIGO;
13 SELECT VHORA INTO MVALHORA FROM SUELDO
14 WHERE NUM_EMP= MCODIGO;
15 MSUELDO:=MNUMHORAS * MVALHORA;
16 DBMS_OUTPUT.PUT_LINE(MNOMB||'SU SUELDO ES:'||MSUELDO);
17 END;
18 /
Introduzca un valor para codigo: 2
antiguo 8: MCODIGO:=&CODIGO;
nuevo 8: MCODIGO:=2;
JUAN JOSE CASTROSU SUELDO ES:250
SQL> DECLARE
2 MCODIGO CHAR(6);
3 MNOMB VARCHAR(30);
4 MNUMHORAS NUMBER;
5 MVALHORA NUMBER;
6 MSUELDO NUMBER;
7 BEGIN
8 MCODIGO:=&CODIGO;
9 SELECT NOMB INTO MNOMB FROM SUELDO
10 WHERE NUM_EMP=MCODIGO;
11 SELECT NHORAS INTO MNUMHORAS FROM SUELDO
12 WHERE NUM_EMP=MCODIGO;
13 SELECT VHORA INTO MVALHORA FROM SUELDO
14 WHERE NUM_EMP= MCODIGO;
15 MSUELDO:=MNUMHORAS * MVALHORA;
16 DBMS_OUTPUT.PUT_LINE(MNOMB||'SU SUELDO ES:'||MSUELDO);
17 END;
18 /
Introduzca un valor para codigo: 3
antiguo 8: MCODIGO:=&CODIGO;
nuevo 8: MCODIGO:=3;
MARIA JOSESU SUELDO ES:200
Tabla modificada.
Tabla modificada.
Tabla modificada.
1 fila creada.
SQL> COMMIT;
Validación terminada.
1 fila creada.
SQL> COMMIT,
2 INSERT INTO SUELDO VALUES(6,'JULIO CESAR','60','50','20','20','30','20');
COMMIT,
*
ERROR en línea 1:
ORA-02185: COMMIT va seguido de un elemento distinto de WORK
SQL> COMMIT;
Validación terminada.
1 fila creada.
SQL> COMMIT;
Validación terminada.
8 filas seleccionadas.
SQL> DECLARE
2 MCODIGO CHAR(6);
3 MNOMB VARCHAR(30);
4 MNUMHORAS NUMBER;
5 MVALHORA NUMBER;
6 MSUELDO NUMBER;
7 MTRANSPORTE NUMBER;
8 MBONO NUMBER;
9 MIESS NUMBER;
10 MMULTAS NUMBER;
11 MTOTAL_RECIBE NUMBER;
12 BEGIN
13 MCODIGO:=&CODIGO;
14 SELECT NOMB INTO MNOMB FROM SUELDO
15 WHERE NUM_EMP=MCODIGO;
16 SELECT NHORAS INTO MNUMHORAS FROM SUELDO
17 WHERE NUM_EMP=MCODIGO;
18 SELECT VHORA INTO MVALHORA FROM SUELDO
19 WHERE NUM_EMP= MCODIGO;
20 SELECT TRANSPORTER INTO MTRANSPORTE FROM SUELDO
21 WHERE NUM_EMP = CODIGO;
22 SELECT BONO INTO MBONO FROM SUELDO
23 WHERE NUM_EMP=MCODIGO;
24 SELECT IESS INTO MIESS FROM SUELDO
25 WHERE NUM_EMP=MCODIGO;
26 SELECT MULTAS INTO MMULTAS FROM SUELDO
27 WHERE NUM_EMP=MCODIGO;
28 MSUELDO:=MNUMHORAS * MVALHORA +MBONO-(MTRASPORTE-
MIESS);
29 DBMS_OUTPUT.PUT_LINE(MNOMB||'SU SUELDO ES:'||MSUELDO);
30 END;
31 /
Introduzca un valor para codigo: 6
antiguo 13: MCODIGO:=&CODIGO;
nuevo 13: MCODIGO:=6;
DECLARE
*
ERROR en línea 1:
ORA-06550: línea 21, columna 17:
PL/SQL: ORA-00904: "CODIGO": identificador no válido
ORA-06550: línea 20, columna 1:
PL/SQL: SQL Statement ignored
ORA-06550: línea 28, columna 39:
PLS-00201: el identificador 'MTRASPORTE' se debe declarar
ORA-06550: línea 28, columna 1:
PL/SQL: Statement ignored
SQL> DECLARE
2 MCODIGO CHAR(6);
3 MNOMB VARCHAR(30);
4 MNUMHORAS NUMBER;
5 MVALHORA NUMBER;
6 MSUELDO NUMBER;
7 MTRANSPORTE NUMBER;
8 MBONO NUMBER;
9 MIESS NUMBER;
10 MMULTAS NUMBER;
11 MTOTAL_RECIBE NUMBER;
12 BEGIN
13 MCODIGO:=&CODIGO;
14 SELECT NOMB INTO MNOMB FROM SUELDO
15 WHERE NUM_EMP=MCODIGO;
16 SELECT NHORAS INTO MNUMHORAS FROM SUELDO
17 WHERE NUM_EMP=MCODIGO;
18 SELECT VHORA INTO MVALHORA FROM SUELDO
19 WHERE NUM_EMP= MCODIGO;
20 SELECT TRANSPORTER INTO MTRANSPORTE FROM SUELDO
21 WHERE NUM_EMP = MCODIGO;
22 SELECT BONO INTO MBONO FROM SUELDO
23 WHERE NUM_EMP=MCODIGO;
24 SELECT IESS INTO MIESS FROM SUELDO
25 WHERE NUM_EMP=MCODIGO;
26 SELECT MULTAS INTO MMULTAS FROM SUELDO
27 WHERE NUM_EMP=MCODIGO;
28 MSUELDO:=MNUMHORAS * MVALHORA +MBONO-(MTRASPORTE-
MIESS);
29 DBMS_OUTPUT.PUT_LINE(MNOMB||'SU SUELDO ES:'||MSUELDO);
30 END;
31 /