You are on page 1of 49

1

2. OTROS CONCEPTOS:

PRIVILEGIOS: Son los permisos que le puede dar un usuario propietario


de un objeto a otros usuarios que quieren acceder a nuestro objeto con
algún fin, ya sea entre otros: para seleccionar (SELECT), actualizar
(UPDATE), insertar (INSERT), borrar (DELETE), ejecutar (EXECUTE) en el
caso de funciones y procedimientos. No se conceden privilegios sobre
índices o Triggers, ya que ORACLE los usa durante la actividad de la
tabla.

Privilegios de sistema, se refiere al tipo de objeto que el usuario puede


crear en una base de datos: Tablas, vistas, índices, Tablespaces,
Triggers, procedimientos, sinónimos, otros.

Privilegios sobre Objetos, se refiere al tipo de operaciones que se


pueden realizar sobre los objetos de la base de datos:
Alter: Derechos para cambiar la definición de un objeto.
Delete: Derechos para borrar filas a una tabla.
Index: Derechos para crear índices.
Insert: Derechos para insertar nuevas filas.
Reference: Derechos para crear constraint de referencia.
Select: Derechos para consultar filas.
Update: Derechos parta actualizar o cambiar datos.

ROLL: Este recurso está enmarcado a lo que es privilegio, y consiste en


agrupar privilegios para asignárselos de una forma general a un grupo
de usuarios que tienen trabajos y alcances similares.

Si tenemos los usuarios:


Martha secretaria.
Luisa secretaria
Juana secretaria
Teresa Jefe

Las tablas
Ventas
Comisiones

Si queremos que todas las secretarias tengan acceso de consulta sobre


la tabla ventas, lo podemos hacer definiéndole el privilegio a cada una
de ellas:
2

Dar DERECHO de CONSULTA a la TABLA ventas al USUARIO martha


Dar DERECHO de CONSULTA a la TABLA ventas al USUARIO luisa
Dar DERECHO de CONSULTA a la TABLA ventas al USUARIO juana

En el caso que sean más secretarias, la tarea se torna dispendiosa, al


igual que si nos dicen: agregarle otros derechos como borrado e
inserción sobre la misma tabla a cada una de ellas.

De otra forma es preferible definir el ROLL SECRETARIA, ya que es un


trabajo común para ellas y consultan los mismos objetos. Y luego se
define sobre ese ROLL el permiso a la tabla de ventas.

Al ROLL secretaria van a pertenecer los USUARIOS martha, luisa, juana

Dar DERECHO de CONSULTA a la TABLA ventas al ROLL secretaria

3. OBJETOS ORACLE

Entre los objetos más importantes de ORACLE tenemos:

TABLE: Tabla de datos.


VIEW: Vista, representación lógica de columnas de una o varias
tablas. Están sincronizadas tanto la tabla como la vista y se actualizan
simultáneamente.
SYNONYM: Tabla virtual que se le permite crear a un usuario a partir
de una tabla real del propietario, el cual, le concede el permiso de
usarla.
INDEX: Indice que se le crea a una tabla para agilizar operaciones
sobre la tabla. Una llave primaria es por defecto un índice.
SNAPSHOTS: Es como una “vista” pero real o sea física. Se
desactualiza respecto a la tabla que la crearon. Es como una copia
que se le saca a una tabla en un momento dado.
SEQUENCE: Secuencia o mecanismo que usa ORACLE para generar
una numeración consecutiva. Este objeto no es tabla.
EXTERNAL PROCEDURE LIBRARIES: Librerías externas de
procedimientos.
USER: Usuario.
ROLES: Función que me permite agrupar privilegios.
ROLLBACK SEGMENTS: Segmentos de Roll Back.
TABLESPACES: División lógica de la base de datos en donde se
definen los objetos.
3

DATABASE: Base de datos


TRIGGERS: Disparadores o subprogramas en PL/SQL que actual de
acuerdo a un evento asociado.
PROCEDURE: Procedimiento de programación, bloque de PL/SQL.
FUNCTION: Función de programación, bloque de PL/SQL.
PACKAGE: Paquetes que agrupan módulos de funciones y
procedimientos relacionados, bloque de PL/SQL.

4. PRODUCTOS ORACLE AQMÁS COMUNES.

Oracle Server. Es el DBMS que se instala en el servidor.


Developer/2000 Forms. Herramienta que se instala en el cliente y
me permite diseñar formularios o pantallas de captura como
interfaces de usuario.
Developer/2000 Reports. Herramienta que se instala en el cliente y
me permite diseñar Reportes finales para imprimir o ver por pantalla
los informes que requiere el usuario final.
Developer/2000 Graphics: Herramienta que se instala en el cliente y
me permite diseñar figuras gráficas estilo PIES que representan en
forma poblacional o estadística la información.
Oracle Web/ ORACLE 8i. Modelo de Oracle para hacer desarrollos de
aplicación que se interactúa por el navegador o visualizador de
Internet.
Dessigner 2000. (Case ORACLE). Herramienta que me permite
trabajar las etapas de análisis y diseño de una aplicación en un
producto CASE. En este caso se requiere fuera del paquete cliente,
crear un repositorio en el Servidor.
Oracle Personal. Modelo ORACLE apropiado para PC‟s. En este caso
la parte Cliente y servidor van en el mismo equipo.

5. EXTENSIONES DE ARCHIVOS MAS UTILIZADAS POR ORACLE.

En el Servidor:
DBF. De datos físicos donde se define los Tablespaces.
CTL. Archivos físicos de Control.
RDF. Archivos de Redolog (Copias).
INI. Archivo de inicialización o configuración del sistema
(INSTANCIA).

En el Cliente:
SQL. Archivo de scripts de SQL
4

FMB. Archivo fuente de Forms.


FMX. Archivo compilado de Forms.
PLL. Archivo fuente de librería.
PLX. Archivo compilado de librería.
RPT. Archivo fuente de Reports.
REP. Archivo compilado de Reports.
MMB. Archivo fuente de menú.
MMX. Archivo compilado de Menú.

6. DEFINICIONES Y CONCEPTOS DE SQL

TIPO DE DATOS

TIPO DESCRIPCION
DATO
NUMBER datos de tipo numérico (máxima precisión 38 dígitos)
CHAR datos de tipo carácter fijos (máximo 255 caracteres)
VARCHAR2 datos de tipo carácter variables (máximo 2000 caracteres)
DATE Para datos de tipo fecha
LONG Para caracteres de longitud variable hasta 2 Gigabytes
RAW Para almacenar datos binarios hasta 255

LENGUAJE SQL.

El lenguaje SQL es un lenguaje de cuarta generación que está orientado


al manejo de conjuntos, es decir, que puede dar más de una respuesta a
la vez encargándose de la búsqueda de los datos.

Este lenguaje se basa en comandos, que los podemos clasificar en:

COMANDOS DDL
Estos comandos de Lenguaje de Definición de Datos, permiten definir
nuevas tablas, crear usuarios, dar derechos y revocar derechos de acceso
a las tablas.

Algunos de estos comandos son:


COMANDO ACCIÓN
CREATE Crear
DROP Borrar
ALTER Modificar
GRANT Permitir derechos o privilegios
REVOKE Negar o revocar derechos o privilegios
5

COMANDOS DML
Estos comandos del Lenguaje de Manipulación de Datos, permiten
consultar y actualizar la información de los datos. Algunos de estos
comandos son:

COMANDO ACCIÓN
SELECT Seleccionar filas
INSERT Insertar filas
DELETE Borrar filas
UPDATE Actualizar filas
COMMIT Confirmar cambios
ROLLBACK Reversar últimos cambios

COMANDOS PL/SQL
Estos comandos del Lenguaje Procedimental, permiten crear programas
para la actualización de registros y tablas.

Algunos de los comandos utilizados en este lenguaje son:

COMANDO ACCION
LOOP Ciclo o repetición de acuerdo a condición.
FOR Ciclo o repetición de acuerdo a condición.
WHILE Ciclo o repetición de acuerdo a condición.
IF Bifurcador Condicional
DECLARE Para definir Variables
BEGIN y END Estructura de Bloque de instrucciones.

7. INICIEMOS CON SQL*PLUS


Cada usuario tiene su propia sesión, a la cual se accede con un
USERNAME y PASSWORD. Después de esto usted está en un área, en la
cual puede iniciar a crear sus objetos.
IMPLEMENTACION DEL MODELO RELACIONAL
Este material va a trabajar sobre un modelo Entidad - Relación ya
definido, el cual se pasa a modelo relacional y de ahí pasar a definir los
scripts de creación.

El ejercicio es el siguiente:
“Una empresa fabricante de carnes frías que tiene una única sede en
Bogotá. Tiene varios vendedores los cuales recorren todo Colombia
vendiendo los productos. Los clientes que están en diferentes ciudades,
pueden comprar a crédito o a contado, dependiendo como se haya
6

definido su liquidez. Pueden tener varias sucursales en la misma o


diferente ciudad. Los vendedores se les paga de acuerdo a sus ventas
(comisión). En cada factura debe ir una venta que consta de uno o varios
productos.
Es del interés del gerente poder controlar las existencias de los
productos, fechas de vencimiento, mejores clientes, mejores
vendedores, ventas por periodos de tiempo, clasificar ventas por ciudad
y por cliente.”

Para implementar este modelo se usarán comandos esenciales como:


CREATE, ALTER, DROP, EDIT, START
Objetos utilizados: TABLE

Para conocer qué objetos hay hasta ahora, lo podemos hacer con la
instrucción:
SELECT * FROM TAB;
Para conocer qué usuarios actualmente están creados se logra con la
Instrucción:
SHOW USER;
7

Estado en el prompt SQL> digite el siguiente comando que crea la


tabla PERSONAS

create table personas(


codigo_persona number(3) not null
constraint per_pk_cope primary key,
tipo_codigo varchar2(1) not null
constraint per_ck_tico check (tipo_codigo in ('C' /*Cedula*/,
'N' /*Nit*/)),
tipo_persona varchar2(1) not null

constraint per_ck_tipe check (tipo_persona in('V' /*Vendedor*/,


'C' /*Cliente*/)),
nombre_persona varchar2(25) not null,
apellido_persona varchar2(25),
sexo varchar2(1) default 'F' not null
constraint per_ck_sex check (sexo in ('M','F')),
fecha_vinculacion date,
porcentaje_comision number(6)
constraint per_ck_poco check (porcentaje_comision between 0 and 50),
codigo_lugar number(3),
monto_credito number(11,2)
constraint per_ck_mocr check (monto_credito<=10000000),
estado_cliente varchar2(1)
constraint per_ck_escl check(estado_cliente in ('A' /*Activi*/,
'D' /*Deudor*/,
'I' /*Inactivo*/)),
fecha_intiguedad date,
constraint per_fk_colu foreign key (codigo_lugar)
references lugares(codigo_lugar)
)
tablespace user_data storage (initial 40k next 10k pctincrease 0);

Si todo sale bien le avisa de una tabla creada. Usted puede verificarlo
con una de las instrucciones anteriores.

Para borrar la anterior tabla se hace:


DROP TABLE personas;

No existe ningún problema con los CONSTRAINTS o datos, ya que la


tabla está vacía y además no existe ninguna relación de integridad o de
llave foránea sobre otras tablas. En caso que así fuera se modifica esta
instrucción con:
DROP TABLE personas CASCADE CONSTRAINTS;

Lo anterior se hizo directamente en el prompt de SQL, que difícilmente


permite corregir equivocaciones frecuentes de digitación. Por tal razón
es aconsejable de una vez acostumbrarse a manejar el editor de SQL, el
8

cual crea un archivo llamado SCRIPT con extensión (*.sql), el cual me


permite invocar nuevamente lo digitado, corregirlo y borrarlo.

Para llamar el editor se puede hacer directamente escribiendo:


ed nombre_archivo
Para correr este script se hace así:
@nombre_archivo ó start nombre_archivo.

Cree un archivo llamado ctpersonas.sql, el cual va a contener el


siguiente comando:

-- Archivo: ctpersonas.sql
-- Script Creacion del objeto TABLA PERSONAS
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 4 de 2000
-- Modifico:
-- Fecha :
create table personas (
/* CAMPOS COMUNES */
codigo_persona number(3) not null,
tipo_codigo varchar2(1) not null,
tipo_persona varchar2(1) not null,
nombre_persona varchar2(25) not null,
apellido_persona varchar2(25),
/* CAMPOS DEL SUBTIPO VENDEDOR */
sexo varchar2(1),
fecha_vinculacion date,
porcentaje_comision number(6),
/* CAMPOS DEL SUBTIPO CLIENTE */
codigo_lugar number(3),
monto_credito number(11,2),
estado_cliente varchar2(1),
fecha_antiguedad date
)
tablespace user_data
/

Guárdelo y ejecútelo. Si todo sale bien SQL le presentará el mensaje:


“Table created”.
El anterior script solo crea la parte de campos de la tabla ahora
creamos un archivo llamado ccpersonas.sql, el cual va a contener el
siguiente comando:

-- Archivo: ccpersonas.sql
-- Script para crear o adicionar CONSTRAINT del objeto TABLA PERSONAS
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 4 de 2000
-- Modifico:
-- Fecha:
9

alter table personas add (


/* CONSTRAINT COMUNES */
constraint per_pk_cope primary key (codigo_persona),
constraint per_ck_tico check (tipo_codigo in ('C' /*cedula*/,
'N' /*nit*/)),
constraint per_ck_tipe check (tipo_persona in ('V' /*vendedor*/,
'C' /*cliente*/)),
/* CONSTRAINT DEL SUBTIPO VENDEDOR */
constraint per_ck_sex check (sexo in ('M','F')),
constraint per_ck_poco check (porcentaje_comision between 0 and 50),
/* CONSTRAINT DEL SUBTIPO CLIENTE */
constraint per_fk_colu foreign key (codigo_lugar)
references lugares (codigo_lugar),
constraint per_ck_mocr check (monto_credito <= 10000000),
constraint per_ck_escl check (estado_cliente in ('A' /*Activo*/,
'D' /*Deudor*/,
'I' /*Inactivo*/))
)
/

Finalmente se tiene creada la Tabla y sus Constraints en forma


ordenada.

Verifique que exista la tabla.


Verifique que los campos definidos hayan quedado creados con el
comando:
desc personas

METODOLOGIA SUGERIDA:
Existen muchas formas de crear la estructura de TABLAS y sus
RELACIONES, pero el mejor plan de creación es por scripts separados por
cada tabla, lo cual facilita la modificación de cada uno. Luego se hace un
gran script que llama a todos los anteriores. Este último se debe
estructurar para que cree las tablas de arriba hacia abajo, o sea, de las
tablas independientes, hasta las tablas que agrupen llaves foráneas.

Para borrar debe ser lo contrario o sea de las tablas terminales a las
primarias o independientes.

El script que crea el modelo se llama creasistema.sql y contiene los


siguientes comandos:

--
--Este script Crea todo el modelo
--Autor: JORGE E. QUEVEDO REYES.
--Fecha de Creación:
--Modificó:
10

--Fecha de modificación:
--
--CREACION DE TABLAS
@ctproductos
@ctlugares
@ctpersonas
start ctventas
@ctitems

--ADICION DE CONSTRAINTS
@ccproductos
start cclugares
@ccpersonas
@ccventas
@ccitems

--CREACION DE SEQUENCES
create sequence nro_venta
start with 1
increment by 1
;

Los demás scripts son:

-- Archivo ctlugares.sql
-- Script Creacion del objeto TABLA LUGARES
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 2 de 2000
-- Modifico:
-- Fecha :
create table lugares(
codigo_lugar number(3) not null,
nombre_lugar varchar2(50) not null,
codigo_ubica number(3),
tipo_lugar varchar2(1) default 'M' not null
)
tablespace user_data
/

-- Archivo cclugares.sql
-- Script para crear o adicionar CONSTRAINT del objeto TABLA LUGARES
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 2 de 2000
-- Modifico:
-- Fecha:
alter table lugares add (
constraint lug_pk_colu primary key (codigo_lugar),
constraint lug_ck_tilu check (tipo_lugar in ('P' /*Pais*/,
'D' /*Departamento*/,
11

'M' /*Municipio*/)),
constraint lug_fk_colu2 foreign key (codigo_ubica)
references lugares(codigo_lugar)
)
/

-- Archivo: ctventas.sql
-- Script Creacion de un objeto TABLA VENTAS
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 2 de 2000
-- Modifico:
-- Fecha :
create table ventas(
codigo_vendedor number(3) not null,
codigo_cliente number(3) not null,
codigo_recibo number(3) not null,
fecha_venta date default sysdate not null,
forma_pago varchar2(1) default 'P' not null,
observaciones varchar2(50)
)
tablespace user_data
/

-- Archivo: ccventas.sql
-- Script para crear o adicionar CONSTRAINT del objeto TABLA VENTAS
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 2 de 2000
-- Modifico:
-- Fecha:
alter table ventas add (
constraint vent_pk_core primary key (codigo_recibo),
constraint vent_ck_core1 unique (codigo_recibo),
constraint vent_fk_cove foreign key (codigo_vendedor)
references personas (codigo_persona),
constraint vent_fk_cocl foreign key (codigo_cliente)
references personas (codigo_persona),
constraint vent_ck_fopg check (forma_pago in ('P' /*contado*/,
'C' /*credito*/))
)
/

-- Archivo: ctproductos.sql
12

-- Script Creacion del objeto TABLA PRODUCTOS


-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 17 de 2000
-- Modifico:
-- Fecha :
create table productos(
codigo_producto number(6) not null,
nombre_producto varchar2(20) not null,
descripcion varchar2(30),
valor_unitario number(6) not null,
existencia number(6) not null,
fecha_vencimiento date not null
)
tablespace user_data
/

-- Archivo: ccproductos.sql
-- Script Creacion de los constraint del objeto TABLA PRODUCTOS
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 17 de 2000
-- Modifico:
-- Fecha :
alter table productos add(
constraint pro_pk_copro primary key (codigo_producto),
constraint pro_ck_exis check (existencia >= 0)
)
/
 La creación de la tabla ITEMS y sus constraints queda de ejercicio.

Si quisiera borrar todo el modelo recursivamente se usa el script:


--
-- Este Script para BORRADO recursivo
-- de todas las TABLAS y CONSTRAINTS
-- Autor: JORGE E. QUEVEDO REYES.
-- Fecha de Creación:
-- Modificó:
-- Fecha de modificación:
--
drop table items cascade constraint
/
drop table ventas cascade constraint
/
13

drop table personas cascade constraint


/
drop table lugares cascade constraint
/
drop table productos cascade constraint
/
drop sequence nro_venta
/

Si quisiera borrar parte del modelo levantando los constraints


referidos en forma selectiva sería:
alter table personas drop constraint per_pk_cope;

8. ALIMENTANDO EL MODELO RELACIONAL

Comandos esenciales usados: INSERT, COMMIT, DROP


Objetos utilizados: SEQUENCE, TABLE, TABLE DUAL

En este instante el modelo está listo pero desocupado, para insertar


filas es con el siguiente comando:
insert into lugares values (0,'COLOMBIA',NULL,'P')
/
por medio de un script usted puede seguir insertando los siguientes
valores:

insert into lugares values(1,'SANTANDER',0,'D')


/
insert into lugares values(2,'BOYACA',0,'D')
/
insert into lugares values(30,'CHARALA',1,'M')
/
insert into lugares values(31,'TUNJA',2,'M')
/
insert into lugares values(32,'SANGIL',1,'M')
/
insert into lugares values(33,‟DUITAMA‟,2,‟M‟)
/
Finalmente hay que darle el comando COMMIT, para confirmar los
últimos cambios hechos a las tablas, en este caso las inserciones.
14

Llene de valores las demás tablas teniendo en cuenta la integridad


referencial existente entre ellas, por que de lo contrario ORACLE no le
acepta las INSERCIONES.

-- VENDEDORES
insert into personas values (200,'C','V','LUIS ENRIQUE','PEREZ REYES',
'M','01/02/1990',15,NULL,NULL,NULL,NULL)
/
insert into personas values (201,'C','V','PEDRO','RUIZ',
'M','23/12/1992',10,NULL,NULL,NULL,NULL)
/
insert into personas values (202,'C','V','JUAN','QUINTERO',
'M','01/01/1994',5,NULL,NULL,NULL,NULL)
/
-- CLIENTES
insert into personas values (800,'N','C','CARULLA',NULL,NULL,NULL,NULL,
31,2000000,'A','20/03/1997')
/
insert into personas values (801,'C','C','CARLOS','PINEDA',NULL,NULL,NULL,
31,500000,'A','19/06/1998')
/
insert into personas values (802,'N','C','LA ESQUINA',NULL,NULL,NULL,NULL,
32,0,'A','22/03/1997')
/
insert into personas values (803,'C','C','MARTHA','CASTRO',NULL,NULL,NULL,
32,0,'A','15/06/1998')
/
insert into personas values (804,'N','C','LA TIENDA',NULL,NULL,NULL,NULL,
30,100000,'A','20/05/1996')
/
insert into personas values (805,'N','C','TRES ELEFANTES',NULL,NULL,NULL,NULL,
33,8000000,'A','20/05/1995')
/

Creación de secuencias:
Objetos que nos permiten generar números o consecutivos para uso
general.

Como llave en la tabla ventas se requiere un campo o consecutivo


que no se repita, equivalente al número de la FACTURA DE VENTA.
Para que el mismo sistema maneje este aspecto se define la secuencia
que llamaremos nro_venta.

create sequence nro_venta


start with 1
increment by 1;

La instrucción para verificar que la secuencia fue creada es con:


15

select * from user_sequences;

Para solicitarle a la secuencia el próximo número a utilizar se hace


con el comando:
select nro_venta.nextval from dual;

En nuestro caso, cada que se inserte un nuevo valor de una factura en


la tabla de ventas, se solicita un consecutivo directamente en el
comando de Insert:
insert into ventas values (200, 800, nro_venta.nextval,
'19/01/1998', 'P',NULL)
/
Si lo que se quiere es borrar la secuencia se hace con el comando:
drop sequence nro_venta;

Ya conocido el anterior tema, podemos ejecutar el SCRIPT para crear


algunas ventas:

insert into ventas values(200,800,nro_venta.nextval,'19/01/1998','P',NULL)


/
insert into ventas values(200,801,nro_venta.nextval,'13/02/1999','P',NULL)
/
insert into ventas values(201,800,nro_venta.nextval,'22/03/1999','P',NULL)
/
insert into ventas values(200,800,nro_venta.nextval,'28/03/1999','P',NULL)
/
insert into ventas values(202,804,nro_venta.nextval,'30/06/1999','C',NULL)
/
insert into ventas values(200,803,nro_venta.nextval,'15/03/1999','P',NULL)
/

Finalicemos con COMMIT.

9. CONSULTANDO MODELO RELACIONAL


Comandos esenciales usados: SELECT, COLUMN FORMAT
Objetos utilizados: SEQUENCE, TABLE, TABLE DUAL

SENTENCIA DE SELECION (SELECT):

Para la selección de filas de una o más tablas con el propósito se


consultar información, se hace con el comando SELECT.
Este comando es uno de los más poderosos y utilizados como base
importante para PL/SQL, REPORTES, FORMULARIOS, INFORMES SQL y
más.
16

Tiene la capacidad de manejar Operadores lógicos, Operadores


relacionales, Funciones de cadena, Funciones de fecha, Funciones
matemáticas, Funciones de grupo.

OPERADORES ARITMETICOS

OPERADOR SIGNIFICADO
+ Suma
* Multiplicación
** Exponenciación
- Resta
/ División

OPERADORES RELACIONALES
OPERADOR SIGNIFICADO
= Igual
<> ¡= Distinto de
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
BETWEEN Entre dos valores a between (3 and 10)
IN Verifica que exista el valor en un grupo
IS NULL Es nulo
LIKE. Coincide con LIKE „CAR%‟

OPERADORES LOGICOS.

OPERADOR SIGNIFICADO
AND Debe cumplir ambas condiciones para ser verdadero
OR Puede cumplir alguna condición para ser verdadero
NOT Niega la sentencia

FUNCIONES DE GRUPO

FUNCION SIGNIFICADO
SUM( ) Calcula total de una suma
AVG( ) Calcula el valor Promedio de un grupo
MIN( ) Busca el valor mínimo de una columna
MAX( ) Busca el valor máximo de una columna
COUNT( ) Cuenta el número de filas
17

ALGUNAS FUNCIONES MATEMATICAS

FUNCION SIGNIFICADO
TRUNC( ) Trunca partir de una cifra en un número real. Trunc(12.45,2)
ROUND( ) Redondea a partir de una cifra en un número real Round(12.56,2)
SIN( ) Calcula el seno de un valor
ABS( ). Calcula el valor absoluto de un número

ALGUNAS FUNCIONES DE CADENA.

FUNCION SIGNIFICADO
TO_CHAR( ) Convierte a carácter un número o Fecha
UPPER( ) Permuta un grupo de caracteres de minúscula a mayúscula
LOWER( ) Permuta un grupo de caracteres de mayúscula a minúscula
INITCAP( ) Permuta de un grupo de caracteres el primero a mayúscula
SUBSTR( ) Extrae una parte o substring de un String
|| CONCATENA dos cadenas de caracteres en una sola

ALGUNAS FUNCIONES DE FECHA

FUNCION SIGNIFICADO
TO_DATE( ) Pasa una cadena a tipo DATE
MONTH, YEAR Máscara para referirnos solamente al mes, año
SYSDATE Calcula la fecha y hora de hoy (Actual)

ALGUNAS OTRAS FUNCIONES

FUNCION SIGNIFICADO
NVL Reemplaza NULL por algún valor definido nvl(saldo,0)
DECODE Visualiza una palabra a cambio de un CARÁCTER

PRACTICA.
Describa que hace cada uno de los comandos siguuientes:

1. Un select simple para que muestre toda la información de una tabla:


select * from ventas;

2. Select para mostrar algunos campos:


18

select nombre_persona, tipo_persona from personas;

3. Select con condición WHERE:


select nombre_persona,apellido_persona,tipo_persona
from personas where tipo_persona = „C‟;

4. Select con operadores lógicos y concepto de orden:


select
nombre_persona,apellido_persona,estado_cliente,codigo_lugar
from personas
where tipo_persona = „C‟
and estado_cliente = „A‟
and codigo_lugar in (30,31)
order by nombre_persona;

5. Select equivalente pero en cambio de IN con OR.


Select
nombre_persona,apellido_persona,estado_cliente,codigo_lugar
from personas
where and tipo_persona = „C‟
and estado_cliente = „A‟
and codigo_lugar = 30 or codigo_lugar =31
order by nombre_persona;

6. Select con rango de valores:


select
nombre_persona,apellido_persona,codigo_lugar,monto_credito
from personas
where tipo_persona = „C‟
and monto_credito > 0 and monto_credito <= 8000000
order by codigo_lugar;

7. Otro estilo del Select anterior.


Select
nombre_persona,apellido_persona,codigo_lugar,monto_credito
from personas
where tipo_persona = „C‟
and monto_credito between 0 and 8000000
order by codigo_lugar;

8. Un select puede el concepto de orden ir en forma descendente DESC.


Select
nombre_persona,apellido_persona,codigo_lugar,monto_credito
from personas
19

where tipo_persona = „C‟


and monto_credito between 0 and 8000000
order by codigo_lugar desc;

9. Select con operador relacional LIKE, muestra la fila que coincida la


cadena del campo con la muestra buscada.
Select nombre_persona,apellido_persona
from personas
where nombre_persona like „%CA%‟;

10. Select con valores de variable de entrada.


Select * from ventas
where codigo_cliente = &cliente;

11. Select con manejo de la tabla DUAL, la cual me permite mostrar


valores no necesariamente de una tabla sino del sistema o de cálculos
directos. Sysdate saca la fecha actual.
Select sysdate from dual;

select (10+5) * 2 / (200-150) from dual;

12. Select con alias de columna.


Select (10+5) * 2 / (200-150) total from dual;

13. Select con funciones matemáticas.


Select round(12.843,1) from dual;

14. Se puede hacer cálculos sobre una columna de una tabla y


mostrarla como otra columna.
Select
nombre_persona,tipo_persona,porcentaje_comision,
porcentaje_comision*1.10
from personas
where tipo_persona = „V‟;

15. Igual que el anterior pero con ALIAS la columna.


Select
nombre_persona,tipo_persona,porcentaje_comision,porcentaje_co
mision*1.10 total
from personas
where tipo_persona = „V‟;

16. Select con manejo de Funciones de cadena.


Select substr(nombre_persona,1,5) nombre from personas
20

where tipo_persona = „C‟;

select nombre_persona,length(nombre_persona) longitud


from personas
where tipo_persona = „V‟
order by length(nombre_persona);

select nombre_persona, upper(nombre_persona),


lower(nombre_persona),
initcap(nombre_persona)
from personas
where tipo_persona = „C‟;

17. COLUMN FORMAT se usa cuando queremos variar el ancho de una


columna solo para mostrar datos.
Column nombre_persona format a15

18. La función DECODE me permite cambiar valores de un solo


carácter como una palabra completa, que sería su equivalente. Este
efecto solo es en la pantalla.
Select nombre_persona,
decode(tipo_persona,‟C‟,‟Cliente‟,‟V‟,‟Vendedor‟),
decode(tipo_codigo,‟C‟,‟Cedula‟,‟N‟,‟Nit‟),
codigo_persona
from personas;

19. La función NVL me permite redefinir el valor NULO de un campo,


por uno deseado.
Select nombre_persona,
estado_cliente,
nvl(estado_cliente,‟I‟),
porcentaje_comision,nvl(porcentaje_comision,0)
from personas
where tipo_persona = „C‟;

20. Select con funciones de FECHA.


Select to_date(„03/01/2000‟,‟MM/DD/YYYY‟) FROM DUAL;

select to_date(„03/01/2000‟,‟MM/DD/RRRR‟) FROM DUAL;

SELECT TO_CHAR(SYSDATE,‟DD/MM/YYYY‟) FROM DUAL;

SELECT TO_CHAR(SYSDATE,‟DD/MM/RRRR‟) FROM DUAL;


21

select to_char(sysdate,‟month‟) from dual;

select to_char(sysdate,‟day/month/year‟) from dual;

select to_char(sysdate,‟HH:MM:SS‟) from dual;

21. Select con función de conversión de formato fecha a carácter:


Select
nombre_persona,fecha_vinculacion,to_char(fecha_vinculacio
n,‟YYYY‟) from personas where tipo_persona=‟V‟;

22. Select donde se usa un campo fecha como parte de un condicional.


Select nombre_persona,fecha_vinculacion
from personas
where where tipo_persona=‟V‟ and
to_char(fecha_vinculacion,‟YYYY‟) = „1994‟;

SELECCIÓN DE COLUMNAS DE MAS DE UNA TABLA (JOINS).

Al existir todo un modelo Relacionado, una de las herramientas más


poderosas es poder obtener información de varias tablas, navegando por
las relaciones. A esto se le llama JOINS.

23. A este tipo de select se le debe colocar ALIAS a las tablas para
poderlas relacionar más fácilmente.
Select l.codigo_lugar,nombre_lugar,nombre_persona
from personas p, lugares l
where tipo_persona = „C‟
and l.codigo_lugar = p.codigo_lugar;

24. En un select JOIN se debe prefijar con alias los campos con
nombres iguales de las tablas relacionas, para que el select pueda
diferenciarlos.
select
nombre_persona,monto_credito,l.codigo_lugar,nombre_lugar
from personas p, lugares l
where tipo_persona = 'C'
and p.codigo_lugar = l.codigo_lugar;
22

25. Si no es claro el despliegue se debe ajustar la visualización de las


columnas con el comando:
column nombre_persona format a15

26. Seleccione cada una de las ventas indicando nombre del cliente,
nombre del vendedor y monto de la venta. Ordenado por cliente.

27. Seleccione cada una de las ventas indicando nombre del cliente,
nombre del lugar de ubicación del cliente, nombre del vendedor,
monto de la venta, número del recibo y forma de pago (use el
decode). Se debe ordenar por ciudad y cliente.
“Otra forma de referirme al Order by es por números, los cuales
deben corresponder a la ubicación del campo en mención dentro
del select.
Ejemplo: Select cedula, apellido, nombre from estudiantes
Where cedula>100
order by apellido, nombre;
Este order by equivale a: order by 2,3”

SELECCIÓN DE COLUMNAS FANTASMAS (OUTER JOINS).

Cuando en un JOIN, una fila no tiene su correspondiente igualdad en la


tabla en la que se busca, normalmente se omite la traída de dicha fila.
Con esta opción colocándole el signo (+) a la derecha de la columna que
se presume no se va a encontrar correspondencia, se logra que salga en
la búsqueda mostrando un valor NULO para visualizar que no tiene valor
o tupla respectiva.

select codigo_persona,
c.nombre_persona cliente,
ve.valor_venta
from personas c, ventas ve
where ve.codigo_cliente(+) = c.codigo_persona
and tipo_persona = 'C'
order by codigo_persona;

SELECCIÓN DE COLUMNAS CON FUNCIONES DE GRUPO.

Estas funciones permiten agrupar en contenido de una o más filas a


partir de una condición dada a una columna o campo.
23

1. Select que me permite buscar valores extremos en una tabla, no se


está agrupando filas sino seleccionado valores únicos.
select max(porcentaje_comision),
min(porcentaje_comision),
avg(porcentaje_comision)
from personas;

2. Este select AGRUPA filas por la condición del campo y totaliza la


sumatoria del campo en mención.
select forma_pago,sum(valor_venta)
from ventas
group by forma_pago;

3. Compare el anterior ejercicio con este, el cual tiene doble nivel de


agrupación.
select to_char(fecha_venta,'yyyy'),
forma_pago,sum(valor_venta)
from ventas
group by to_char(fecha_venta,'yyyy'),forma_pago;

4. Select con COUNT.


select nombre_lugar,count(*)
from lugares l, personas p
where l.codigo_lugar = p.codigo_lugar
and p.tipo_persona = 'C'
group by nombre_lugar;

5. La cláusula HAVING, permite condicionar el campo que esté en la


función de grupo, o incluso a la misma función, facilitando que tome
parte en el filtrado.
select nombre_lugar,count(*)
from lugares l, personas p
where l.codigo_lugar = p.codigo_lugar
and p.tipo_persona = 'C'
group by nombre_lugar
having count(*) < 2;

SELECCIONANDO A PARTIR DE UNA SELECCIÓN (SUBQUERY)

Se defina también como “SELECT ANIDADOS”, pero el potencial de un


SUBQUERY también llega a los comandos de UPDATE y DELETE.

select nombre_persona
24

from personas
where codigo_lugar = (select codigo_lugar
from lugares
where nombre_lugar like 'TUN%'
)
and tipo_persona = 'C';

 Ejercicio: Qué vendedor tiene la máxima comisión?


 Cual es el costo del inventario actual de productos
 Cual producto se ha vendido más en Tunja
 Relacione que vendedores han vendido el producto estrella, o sea el
más vendido.
 Qué clientes tienen copado el monto de crédito actualmente.
 Cual es el producto de menor existencia y cual fue la última vez que
se vendió de este producto.

10. MANTENIMIENTO AL MODELO RELACIONAL.

Comandos esenciales usados: UPDATE, DELETE, ALTER, DROP,


SET,SPOOL, INSERT.
Objetos utilizados: TABLE, VIEW, SYNONYM

CREAR UNA TABLA DE COPIA Y GESTIONAR CON UNA ORIGINAL.

Normalmente se usa una operación de copiar o duplicar solo una tabla,


para poder hacer una operación peligrosa. En caso que se falle poder
recuperarla o ver la desigualdad en filas.

1. Crear una tabla copia de ventas


create table cventas
as select * from ventas;

2. Borre de la copia cventas todas las ventas hechas por el vendedor


(200).
Delete from cventas where codigo_vendedor=200;

3. Veamos la diferencia entre las dos tablas.


select * from ventas
where codigo_recibo in (select codigo_recibo
from cventas);
25

CREACION DE VISTAS.
Este procedimiento facilita en muchos casos la gestión de datos, como
también poder clasificar los datos para mejorar las consultas.

create view vclientes as


select
codigo_persona,tipo_codigo,nombre_persona,apellido_persona,
codigo_lugar,monto_credito,estado_cliente,fecha_antiguedad
from personas
where tipo_persona = 'C';

Examinemos la existencia de la vista, su estructura y sus datos.


select * from tab;
desc vclientes;
select * from vclientes;

BORRADO DE INFORMACION.
Normalmente se desea borrar información por cualquier causa, es
aconsejable verificar primero la información a borrar por medio de un
select.

Para borrar en forma puntual una fila o grupo de filas es con el


condicional WHERE
Delete from cventas where codigo_vendedor=201;
Para borrar todo es:
Delete from cventas;

Es importante destacar que el potencial del comando borrado depende


de la destreza para manejar el WHERE, ya que permite hasta SUBQUERY.

Recuerde que si borra datos de una VISTA los esta BORRANDO de la


TABLA a la que esta ligada.

ACTUALIZACION DE INFORMACION.

Actualizar un campo o varios campos es una operación normal y


cotidiana que se hace mediante el comando UPDATE.

Para actualizar el monto de crédito a un cliente moroso de código


804 y pasarlo a 0.
update personas set monto_credito=0
where tipo_persona='C' and codigo_persona=804;
26

Para actualizar más de un campo al tiempo, se escriben uno a uno


con su nuevo valor, separándolos por comas.
update personas set monto_credito=0,estado_cliente = „D‟
where tipo_persona='C' and codigo_persona=804;

Es importante destacar que el potencial del comando UPDATE depende
de la destreza para manejar el WHERE, ya que permite hasta SUBQUERY.

Recuerde que si ACTUALIZA datos de una VISTA los esta ACTUALIZANDO


de la TABLA a la que esta ligada.

OTROS TIPOS DE INSERCION (SELECTIVA)

Muchas veces se quiere insertar en forma SELECTIVA respecto a los


campos o columnas, sobretodo dentro de programas PL/SQL, para evitar
el mantenimiento de programas en caso que modifiquen las estructuras
de las TABLAS.
insert into lugares
(codigo_lugar,nombre_lugar,codigo_ubica,tipo_lugar)
values (34,'TUTA',2,'M');

Otras veces se requiere insertar en forma SELECTIVA de una tabla a otra


respecto a las filas.
Borre los registros de la tabla cventas y ejecute el siguiente comando:
insert into cventas select * from ventas where codigo_recibo <100;

OTROS ASPECTOS DEL COMANDO ALTER.

Permite borrar selectivamente un Constraint.


Alter table ventas drop constraint vent_ck_fopg;

Permite adicionar una COLUMNA a una TABLA.


Alter table cventas add (total number(6));

Permite cambiar el tipo de una COLUMNA, siempre y cuando no


exista información en ninguna fila de dicha columna. También se
puede modificar el tamaño de una COLUMNA; ampliar si tiene datos y
reducir si esta todas las filas de la columna vacías.
alter table cventas modify (total number(10));

El comando ALTER no permite suprimir columnas EXISTENTES.


27

COMANDO DROP
Este comando Borra Objetos.

Borrar USUARIO
Drop user usu09;
Borra TABLA
Drop table cventas;
Borra INDICE
Drop index tabla_nx;
Borra VISTA
Drop view vclientes;

COMANDO INDEX

Este comando me permite definir índices a tablas.


Por defecto las llaves primarias son índices, pero frecuentemente se
requiere definir índices para agilizar consultas y otras operaciones sobre
tablas.

Para identificar índices Alternos, que son diferentes a las llaves


primarias, existe una regla que dice: Toda columna que es llave foránea
se le debe crear un índice para agilizar consultas.

En otros casos también se debe evaluar y dimensionar si una columna


por la cantidad de consultas justifica definirle un índice.

Para crearle un índice sobre las llaves foráneas de la tabla ventas, la


sintaxis es:
create index ven_idx1 on ventas
(codigo_vendedor,codigo_cliente);

Si quiere verificar que exista ese índice es


select * from user_indexes;

COMANDO SYNONYM

Como se explicó un sinónimo es una tabla virtual (APUNTADOR), que se


define cuando el dueño de una tabla real la quiere compartir a otro
usuario y él le da ciertos privilegios para ello.
28

Lo anterior me evita tener objetos duplicados (tablas) en usuarios


diferentes, en cuyo caso, no solo ocuparía más espacio, sino que se
desactualizaría una tabla respecto a la otra.

Pensemos que el usuario LUIS le quiere compartir una de sus tablas


VENTAS al usuario JULIA.

Estando en el usuario dueño del objeto que quiere compartir (LUIS le


quiere compartir a JULIA).
grant select, insert,update,delete,
references on ventas to julia;

Ahora me ubico en el usuario JULIA y creo el synonym recordando


que el dueño es LUIS.
create synonym ventas for luis.ventas;

Verifique que se creó el synonym.

COMANDO ROLLBACK Y COMMIT

COMMIT permite confirmar definitivamente las operaciones realizadas


hace un tiempo. Es importante aclarar que ORACLE al ser Cliente/
Servidor, cualquier otro usuario que este transaccionando los mismos
datos puede simultáneamente haber dado COMMIT.

ROLLBACK, reversa las anteriores operaciones hasta antes de un


COMMIT.

Con select mire los datos y su cantidad de alguna tabla.


Borre uno de ellos
Vuelva a verificar los datos asegurándose que falta el borrado
Inmediatamente darle ROLLBACK;
Vuelva a verificar los datos asegurándose que recobró el valor
perdido.
Repita lo anterior con COMMIT;

PARAMETROS DE AMBIENTE SET.


Permite personalizar o cambiar el aspecto al ambiente ORACLE en
algunos aspectos.
29

SET FEEDBACK OFF/ON Permite desactivar el mensaje de número de


registros mostrados en una consulta.
SET PAUSE OFF/ON Permite desactivar o activar la pausa entre cada
pantalla al hacer una consulta.
SET LINESIZE n Permite redefinir la longitud en número de columnas
mostradas en una pantalla.
SET PAGESIZE n Lo mismo anterior pero con líneas o filas. Se usa
mucho en reportes inmediatos de SQL.

COMANDO SPOOL
Se usa cuando se quiere guardar en un archivo tipo plano con extensión
SQL todo lo trabajado en una sesión de SQL.

Para habilitar el servicio es:


SPOOL nombre_archivo
Para finalizar el proceso es:
SPOOL OFF.
Luego se busca en el directorio de trabajo el archivo referenciado, para
utilizarlo en lo que se quiera.
30

11. QUE ES PL/SQL.

El un Lenguaje Procedimental, que contiene instrucciones del Lenguaje


de Bases de Datos SQL, Estructuras de Programación y recursos propios
de ORACLE, que hacen de éste una herramienta poderosa para el
desarrollo de aplicaciones.

La potencialidad que este lenguaje le aporta a las herramientas


Developer 2000, lo hacen indispensable para el desarrollo de
aplicaciones profesionales.

ESTRUCTURA BASICA DE UN PROGRAMA DE PL/SQL.

DECLARE
-- Este bloque es permite declarar varialbes.
a number(6):=1;
may_valor_venta ventas.valor_venta%TYPE;

BEGIN
-- Este bloque es el cuerpo del programa
BEGIN
--Este sub-Bloque es para instrucción SQL
Select max(valor_venta) into may_valor_venta from ventas;
Exception
WHEN no_data_found THEN
Message(„fallo del programa‟);
Raise form_trigger_failure;
WHEN others THEN
Null;
END;
--Este Sub-Bloque es de instrucciones PL
While a<10 loop
may_valor_venta:= may_valor_venta*1.25;
a:=a+1;
end loop;
END;
31

LINEAS DE COMENTARIO PARA DOCUMENTAR.

Estas líneas de comentario son importantes cuando por norma se debe


documentar los programas. Se puede de dos formas:

/* Esta es una línea de comentario */


-- Esta es otra línea de comentario

TIPOS DE DATOS.

Los tipos de datos son los que normalmente se usan en la definición de


TABLAS, más algunos adicionales.

TIPO DATO DESCRIPCION


NUMBER datos de tipo numérico (máxima precisión 38 dígitos) NUMBER(n) o
NUMBER (n,m)
CHAR datos de tipo carácter fijos (máximo 255 caracteres) Char(n)
VARCHAR2 datos de tipo carácter variables (máximo 2000 caracteres) varchar2(n)
DATE Para datos de tipo fecha y hora
BOOLEAN Puede contener valores booleanos: TRUE, FALSE
BINARY_INTEGER Integer

Los dos últimos tipos de datos no se usan en la definición de tablas.

Ejemplos:

DECLARE
a number;
b number(7):=2;
c number(10,2);
f varchar2(30):=‟‟;
g boolean;
fecha date;

Existen otros tipos de variables, no necesariamente escalares, que se


definen sobre campos, sobre registros, sobre matrices.

Sobre REGISTROS:
Similar a cualquier lenguaje de programación.
TYPE nombre_tipo IS RECORD (var1 tipo1;
var2 tipo2);
variable nombre_tipo;
32

SOBRE TABLAS:
Normalmente se llaman matrices en otros lenguajes.
TYPE nombre_tabla IS TABLE OF
tipo_dato INDEX BY BINARY_INTEGER;

CONSTANTES:
Se definen parecido que las variables, adicionando la palabra reservada
CONSTANT, que caracteriza a este elemento en que no puede volver a
tener asignaciones o cambios en el transcurso del programa:
Incremento CONSTANT number(4):=230000;

ATRIBUTOS

En PL/SQL las variables tienen atributos que permiten referenciar el tipo


de dato y la estructura de un objeto sin repetir su definición.

Por ejemplo si en la tabla PERSONAS tenemos el campo tipo_persona que


es varchar2(1), y sobre este campo quiero definir una variable que se
llame tipo_documento, se puede hacer de dos formas:
declare
tipo_documento varchar2(1);

Otra forma y la más correcta es:


Declare
Tipo_documento personas. tipo_persona%TYPE;

El Atributo %TYPE me permite heredarle a la variable el tipo de dato


definido en la tabla para ese campo. Esto me permite mejor
mantenimiento de la aplicación en caso de modificaciones de las tablas y
más consistencia de los datos finalmente.

Otro Atributo es %ROWTYPE, cuando quiero definir una variable tipo


registro con las mismas columnas y los mismos tipos de datos de la fila
de una tabla.

En este caso dentro de la programación para referirme a dicha variable


se debe hacer equivalente a cualquier lenguaje de programación:
Nombre_registro.nombre_campo:=valor;

MODOS DE INICIALIZAR O ASIGNAR VALORES A UNA VARIABLE.

Las variables dentro de un programa PL, se pueden asignar de varias


formas:
33

Asignación en la definición:
A number(3):=3;
Asignación directa dentro del programa:
a:=3;
Asignación por un INTO dentro de un Select:
Select nro_hijos into a
from empleados where nro_empleado=3344;
Asignación dentro de un FETCH de CURSOR:
Fetch cursor_x into a;
Asignación desde un dato de un CAMPO DE UN BLOQUE FORMS:
a:= :empleados.nro_hijos;

ESTRUCTURAS DE PROGRAMACION.

Son todas las estructuras utilizadas por PL que enriquecen o


potencializan el SQL.

No solo se utilizan para manipulación de datos, sino que se usan


también para procesar datos de manera condicional e interactiva.

Estas estructuras son las que normalmente tienen los diferentes


lenguajes que se conocen en el mercado.

CONDICIONALES:

Estas estructuras que se utilizan para tomar ciertas acciones


dependiendo de una circunstancia o valor de una variable.

La sintaxis más utilizada por esta estructura es:

IF condición THEN IF condición THEN


Instrucciones; Instrucciones;
Comandos SQL; Comandos SQL;
END IF; ELSE
Instrucciones;
Comandos SQL;
END IF;

La condición es como normalmente se conoce, del tipo


IF A>B THEN IF A*3 = 4 THEN IF A >= 3 THEN
Y todas las demás conocidas por cualquier programador.
34

BUCLES:
Estructuras que me permiten repetir una serie de pasos mientras se
cumpla una condición.

Los Bucles normales de programación se conocen también en PL:

WHILE condición LOOP


Instrucciones;
Comandos SQL;
END LOOP;

FOR contador IN 1..10 LOOP


Instrucciones;
Comandos SQL;
END LOOP;

FOR variable_cursor IN cursor LOOP


Instrucciones;
Comandos SQL;
END LOOP;

CURSORES:

Es un mecanismo para definir un apuntador a una tabla a partir de una


consulta, para luego ser utilizada en el programa. El control del
recorrido, o del secuenciamiento dentro de la tabla es controlado por
programación.

Se debe destacar que existen cursores explícitos e implícitos. Los


implícitos, son los que usa SQL en todos sus procedimientos de
manipulación de datos, incluyendo hasta consultas que devuelvan una
sola fila. Los otros son los que manejamos con cursores, para poder
tener el control de ellos en un área de memoria.

Un ejemplo completo de cursores es:

DECLARE
CURSOR c1 IS
SELECT codigo_persona, nombre_persona, porcentaje_comision
FROM personas
WHERE tipo_persona=‟V‟;
35

vendedor c1%ROWTYPE;
Incremento number(6);

BEGIN
Instrucción0;
OPEN c1;
FETCH c1 INTO vendedor;
WHILE (c1%found) LOOP
Instrucción1;
Instrucción2;
Incremento:=vendedor.porcentaje_comision + 100;
FETCH c1 INTO vendedor;
END LOOP;
CLOSE c1;
Instrucción2;
END;

OTRO ejemplo:

DECLARE
CURSOR c1 IS
SELECT nombre_persona
FROM personas
WHERE tipo_persona=‟V‟;

Nombre_vendedor personas.nombre_persona%TYPE;

BEGIN
Instrucción0;
OPEN c1;
FETCH c1 INTO Nombre_vendedor;
WHILE (c1%found) LOOP
Instrucción1;
Instrucción2;
FETCH c1 INTO Nombre_vendedor;
END LOOP;
CLOSE c1;
Instrucción3;
36

END;

OTRO ejemplo, en algunos casos se requiere que uno de los campos del
cursor se actualice. Para este caso hay que agregarle la sentencia FOR
UPDATE OF y WHERE CURRENT OF:

DECLARE
CURSOR c1 IS
SELECT codigo_persona, nombre_persona, porcentaje_comision
FROM personas
WHERE tipo_persona=‟V‟
FOR UPDATE OF porcentaje_comision;

vendedor c1%ROWTYPE;
Incremento number(6);

BEGIN
Instrucción0;
FOR vendedor IN c1 LOOP
Instrucción1;
Instrucción2;
Incremento:=vendedor.porcentaje_comision + 100;
UPDATE personas set porcentaje_comision = Incremento
WHERE CURRENT OF c1;
END LOOP;
Instrucción3;
END;

EXCEPCIONES PARA CONTROL DE ERRORES:

Es un mecanismo que usa PL/SQL, para controlar los errores de usuario.


Cuando un error ocurre, una excepción se dispara, entonces la ejecución
normal se detiene y el control se transfiere a la parte de manejo de
excepciones del bloque o subprograma.

Existen excepciones predefinidas, por ejemplo una división por cero


dispara la excepción ZERO_DIVIDE, las excepciones definidas por el
usuario se disparan con la sentencia RAISE.

EXCEPTION
WHEN nombre_excepcion1 THEN
Ordenes a tomar;
37

WHEN nombre_excepcion2 THEN


Ordenes a tomar;
WHEN OTHERS THEN
Ordenes a tomar;

Un ejemplo completo sería:

Declare
a personas.monto_credito%TYPE;

BEGIN
a:=0;
begin
Select monto_crédito into a from personas
Where codigo_persona = 200 and tipo_persona =‟V‟;
EXCEPTION
WHEN no_data_found THEN
Message(„No encontre datos‟);
Raise form_trigger_failure;
WHEN too_many_rows THEN
Message(„Existe más de un registro con este valor‟);
Raise form_trigger_failure;
WHEN others THEN
Message(„Razón no conocida‟);
Null;
End;
END;

ESTRUCTURE PROGRAMAS CON FUNCIONES, PROCEDIMIENTOS


Y PAQUETES.
Convertir una aplicación a módulos de programación, facilita su
desarrollo y mantenimiento.

Por lo general los bloques lógicos son reutilizados por otra aplicación o
por otros módulos de la misma aplicación.

Hay que aclarar que toda estructura en ORACLE, como las Funciones y
procedimientos pueden tener diferentes aspectos como:
Ser de cliente, pero que puede compartir a otros de cliente a cliente.
Desarrollarla para que se almacene en la misma Base de Datos
(Servidor), en casos que sea usado por muchos. En cuyo caso se debe
dar los permisos GRANT
38

Convertirlo en librerías de Cliente.


Convertirlo en Paquetes, para dejarlos en el Servidor.

FUNCIONES CLIENTE.

Una función es un programa que computa un valor, tiene un retorno, o


sea un valor único.

Se define y se usa como librería en el EQUIPO CLIENTE, en


DEVELOPER/2000
.
Ejemplo:

FUNCTION valor_pago(codigo_estudiante_wk
IN estudiantes.codigo_estudiante%TYPE)
RETURN number
IS
Valor_wk number:=0;
BEGIN
BEGIN
Select valor into valor_wk from estudiantes
where nro_estudiante= codigo_estudiante_wk;
EXCEPTION
WHEN no_data_found THEN
Null;
WHEN others THEN
Null;
END;
RETURN(Valor_wk);
END;

La llamada es:
Cantidad:=valor_pago(codigo);

Aunque esta función la explicaremos en este material, solo se


desarrollará y probará en el Material de “Developer 2000 FORMS”, en el
momento y tema que el profesor les indique como adecuado. (Llamadas
a funciones desde un segmento de código PL/SQL, de un TRIGGER de
BOTON y que tenga efecto en un campo del BLOQUE).
39

Un ejercicio típico puede ser cuando estando en un Formulario tipo


TABULAR de PRODUCTOS, nos gustaría que haciendo Click en un botón
llamado incremento, nos incremente automáticamente la cantidad de un
producto señalado, respecto a sus existencias. La condición se define
como: “Si el producto se ha vendido en más de 5 unidades y quedan
menos de 50, hay que aumentar las existencias en 10 para que exista un
Stock adecuado”.

Recuerde que este botón hay que crearlo en el Bloque DUAL, ya que el
otro bloque es TABULAR y no nos sirve.
Al anterior Botón darle el nombre de Incremento y luego definirle el
Trigger: WHEN-BUTTON-PRESSED, el cual lleva el siguiente código:
Begin
If :productos.existencia < 50 and
Cantidad_Vendida(:productos.codigo_producto) > 5 then
:productos.existencia := :productos.existencia + 10;
End IF;
commit;
End;

Antes de compilar, cerramos este Trigger para pasar a definir la


función.
Estando en el navegador por Program Units cree la siguiente fución:
--Función: Cantidad_Vendida
--Calcula la cantidad vendida de un producto
--Diseño: JORGE E. QUEVEDO R.
--Fecha: Abril 2 de 2000
--Modifico:
--Fecha :
FUNCTION Cantidad_Vendida(
codigo_producto_wk IN productos.codigo_producto%TYPE)
RETURN Number
IS
sumatoria number:=0;
BEGIN
Begin
select sum(cantidad_producto)
into sumatoria
from items
where codigo_producto = codigo_producto_wk
group by codigo_producto;
exception
When No_data_found then
40

sumatoria := 0;
When Others then
sumatoria := 0;
End;
Return(sumatoria);
END;

Para probarla, usted debe estar en modo QUERY, sobre un producto.


Luego se la da Click al botón llamado Incremento. El cambio del
valor debe ser inmediato.
Usted le debe definir posteriormente al campo de existencias la
propiedad de NO NAVEGABLE, evitando así que le hagan cambios
manualmente.

FUNCIONES ALMACENADAS DE USUARIO

Cuando una función es muy usada dentro de la aplicación, y tiene mucha


transacción, en cambio que esté en cada uno de los usuarios y cuando
se use congestionen los procesos, es preferible dejarla como un objeto
más en la base de datos.

En este caso la sintaxis es:


CREATE OR REPLACE FUNCTION raiz (num IN number)
RETURN number
IS
Res number:=0;
BEGIN
IF num < 0 then
Res:=0;
ELSE
Res:=SQRT(num);
END IF;
RETURN(Res);
END;

Luego de creada la función, se puede probar con el siguiente comando


SQL:
Select raiz (4) from dual;

El dueño de la función debe darle permiso de ejecución a cada uno de


los usuarios que se quiere, o a todos si es necesario.
41

Los usuarios deben crear un SYNONYM sobre este objeto, para poderlo
usar.

Como dueño usted puede mirar que funciones o procedimientos


almacenados tiene con la instrucción:
select distinct name,type from user_source;

Como dueño del objeto usted lo puede borrar así:


DROP fuction raiz;

Otro ejemplo relativo al Proyecto:

Supongamos que es muy usual para nuestra empresa estar consultando


la sumatoria de ventas de cualquier empresa cliente, según el tipo de
venta. Por ejemplo suma de las ventas de la empresa con código 800
que se han realizado de contado “P”.

Pensando que esta función la usan todos los programadores, la vamos a


definir como función almacenada, o sea que se deja en la base de datos.
Además se adecua a función por que retorna solo un valor.

Para tal fin hay que crear un script llamado tot_ven.sql con la siguiente
creación de la Función almacenada.

-- Archivo: tot_ven.sql
-- Script de Creación de Función alamcenada
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 2 de 2000
-- Modifico:
-- Fecha :

CREATE OR REPLACE FUNCTION Tipo_Venta_Cliente(


cliente IN ventas.codigo_cliente%TYPE,
tipo_venta IN Varchar2(1))
RETURN Number
IS
Acumulador Number := 0;
Begin
Begin
select sum(valor_venta)
into Acumulador
42

from ventas v, items i


where v.codigo_cliente = cliente
and v.forma_pago = tipo_venta;
EXCEPTION
WHEN No_Data_Found THEN
Acumulador := 0;
NULL;
WHEN Others THEN
NULL;
End;
RETURN (Acumulador);
End;
/

Para correr el script de creación de la función es:


@ tot_ven
Aparece la creación de la función con errores!!. Para aprender a
manejar errores, se hace con la siguiente sentencia de SQL:
select * from all_errors;
Descartado todos los errores y cuando el SQL nos diga que se creo la
función satisfactoriamente, la vamos a usar y de esta forma probarla.
select tipo_venta_cliente(800,'P') from dual;

PROCEDIMIENTOS CLIENTE:

Este subprograma también desempeña una acción específica, con la


diferencia que este puede retornar más de un parámetro o ninguno.

Se define y se usa como librería en el EQUIPO CLIENTE, en


DEVELOPER/2000

Ejemplo:

PROCEDURE consolidar (codigo_wk IN alumnos.codigo_alumno%TYPE,


Semestre IN OUT alumnos.semestre%TYPE,
Fallas IN OUT number,
Bien OUT varchar2)
IS
Nuevo_semestre alumnos.semestre%TYPE;
43

j number:=3;

BEGIN
Instrucciones1;
Comandos SQL;
Semestre=nuevo_semestre;
Fallas:=Fallas+2;
Instrucciones2;
Bien:=‟S‟;
END;

La llamada es:
consolidar(cod,semestre,fallas_actuales,bien);

Aunque este Procedimiento lo explicaremos en este material, solo se


desarrollará y probará en el Material de “Developer 2000 FORMS”, en el
momento y tema que el profesor les indique como adecuado. (Llamadas
a Procedimientos desde un segmento de código PL/SQL, de un
TRIGGER de BOTON y que tenga efecto con CURSORES sobre toda
una TABLA).

Un ejercicio típico consiste en crear un formulario de Botones, para


ejecutar una tarea en BackGround que tiene efecto sobre toda una Tabla.

El ejemplo adecuado es cuando nos exigen en la empresa mensualmente


que se procese lo anterior, o sea, incrementar los inventarios o
existencias dependiendo de lo que quede y de lo que se ha vendido.

Si se procede con el proceso anterior, el problema es que se torna muy


tedioso, al tener que repetirlo con cada uno de los productos de uno en
uno, en algún caso sería interminable. Para evitar esto, se crea un
formulario tipo DUAL, que debe contener un botón llamado Incrementos
de Inventario. Al anterior botón se le define el Trigger: WHEN-BUTTON-
PRESSED, el cual lleva el siguiente código:
incremento;
commit;
Ahora definamos el procedimiento incremento, que como se puede
dar cuenta no tiene parámetros de ida ni de llegada.
Antes de compilar, cerramos este Trigger para pasar a definir
Procedimiento.
Estando en el navegador por Program Units cree el siguiente
procedimiento:
44

--Procedimiento: Incremento
--Incrementa en toda la tabla PRODUCTOS, existencias dependiendo
-- de Ventas y Existencias
--Diseño: JORGE E. QUEVEDO R.
--Fecha: Abril 2 de 2000
--Modifico:
--Fecha :
PROCEDURE Incremento
IS
Cursor c_productos IS
select codigo_producto,existencia
from productos
FOR UPDATE OF existencia;
i c_productos%ROWTYPE;

BEGIN
For i IN C_productos LOOP
If i.existencia < 50 and
Cantidad_Vendida(i.codigo_producto) > 5 then
update productos set existencia = existencia + 10
where CURRENT OF c_productos;
End IF;
End LOOP;
END;

Al correrlo no se ve nada, pero si usted entra a un formulario en


donde muestre todos los productos con sus existencias, se va a dar
cuenta que se incrementaron todas las existencias automáticamente,
según la condición del ejercicio.

PROCEDIMIENTOS ALMACENADOS DE USUARIO

Cuando un procedimiento es muy usado dentro de la aplicación, y tiene


mucha transacción, en cambio que esté en cada uno de los usuarios y
cuando se use congestionen los procesos, es preferible dejarlo como un
objeto más en la base de datos.

En este caso la sintaxis es:

CREATE OR REPLACE PROCEDURE nombre_procedimiento(


parametro modo tipo,...)
45

IS
Variables tipo;
BEGIN
Instrucciones;
Comandos SQL;
END;

La administración de compartir y borrar el objeto es igual que el de las


funciones.

Otro ejemplo relativo al Proyecto:

Supongamos que para la empresa es fundamental tener presente que


empresa ha realizado la máxima cantidad de ventas. Un ejemplo es
calcular qué empresa tiene la mayor cantidad de ventas históricamente y
cual es esa cantidad de ventas?

Para este fin nos damos cuenta que no es adecuado usar funciones, ya
que requerimos de dos parámetros de retorno (nombre empresa y suma
de ventas) y la función solo nos permite retornar uno. En cambio los
procedimientos nos permiten retornar varios o ningún parámetro.

Para tal fin hay que crear un script llamado may_cli.sql con la siguiente
creación del Procedimiento almacenado.

-- Archivo: may_cli.sql
-- Procedimiento Cliente_Max_Venta que nos permite conocer
-- el nombre de la empresa que más vende y la cantidad.
-- Diseño: JORGE E. QUEVEDO R.
-- Fecha: Abril 2 de 2000
-- Modifico:
-- Fecha :

CREATE OR REPLACE PROCEDURE Cliente_Max_Venta


(Codigo OUT personas.codigo_persona%TYPE,
Nombre OUT Personas.nombre_persona%TYPE,
Total OUT Number
)
IS
Begin
select codigo_cliente,nombre_persona,sum(valor_venta) suma
into Codigo,Nombre,Total
46

from ventas v, items i, personas p


where v.codigo_recibo = i.codigo_recibo
and p.codigo_persona = v.codigo_cliente
group by codigo_cliente,nombre_persona
having sum(valor_venta) = (select max(sum(valor_venta))
from ventas v, items i
where v.codigo_recibo = i.codigo_recibo
group by codigo_cliente);
End;
/

Corra el script may_cli.sql para crear el procedimiento almacenado.


Para probar este procedimiento almacenado, requerimos crear una
tabla y un script adicional, ya que DUAL es una tabla que no permite
retornos múltiples de procedimientos, para esto entonces llamamos
el procedimiento desde otro script como una sentencia PL/SQL y que
los resultados nos los deje en la tabla llamada salida.

Cree una taba llamada salida, con la siguiente estructura:


Codigo number
Nombre varchar2(20)
Cantidad number

Cree el siguiente script llamado correr.sql, que contiene las


siguientes instrucciones:
Declare
cod number;
nom varchar2(20);
cant number;
begin
CLIENTE_MAX_VENTA(cod, nom, cant);
insert into salida values (cod, nom, cant);
end;
/

Corra el script correr:


@correr

Confirme los cambios con COMMIT; y luego revise la tabla llamada


SALIDA a ver si el procedimiento dejó los resultados.
47

PACKAGES (PAQUETES)

Conjunto o grupo de funciones, procedimientos, cursores, variables y


constantes relacionadas entre sí, excepciones. Estos se agrupan en un
solo módulo.

Es una herramienta útil para desarrollo, ya que es fácil de administrar.

Unicamente la parte declarativa del paquete es visible y accesible para


las aplicaciones, el cuerpo del paquete no.

Los paquetes pueden ser compilados y almacenados en la base de datos.


En caso que se utilice mucho el ORACLE lo deja en memoria para que se
optimice el uso de los recursos.

Un ejemplo es:

CREATE OR REPLACE PACKAGE uptc IS


FUNCTION factorial(num NUMBER) RETURN NUMBER;
FUNCTION cedula (ced VARCHAR2)RETURN VARCHAR2;
END;

CREATE OR REPLACE PACKAGE BODY uptc IS


FUCTION FACOTIAL (num NUMBER) RETURN NUMBER
BEGIN
Instruciones;
END;
FUCTION CEDULA (ced VARCHAR2) RETURN VARCHAR2
BEGIN
Instruciones;
END;
END;

Para hacer uso de este package es:


SELECT UPTC.FACTORIAL(10), UPTC.CEDULA(„244344‟) FROM DUAL;
48

TRIGGERS EN EL CLIENTE

Este tema se desarrollará en le módulo de Developer 2000 FORMS, en


su totalidad, ya que su funcionalidad es para los eventos determinados
en esta herramienta.

TRIGGERS EN LA BASE DE DATOS

No reciben parámetros, no devuelven nada se disparan a partir de un


evento.

Son definidos y almacenados en la Base de datos.

El administrador del Sistema y el DBA, deben evaluar que TRIGGERS


deben ir en la base de datos, para aumentar el rendimiento o por que el
esquema de la tarea lo solicita (auditoría).

Las tareas que pueden controlar son: UPDATE, DELETE e INSERT.

El momento o temporización del disparo puede ser: AFTER o BEFORE.

CREATE OR REPLACE TRIGGER nombre_trigger


BEFORE INSERT OR DELETE OF usuario ON tabla FOR EACH ROW
DECLARE

BEGIN
Instrucciones;
END;

 Crear una función almacenada que diga cual es el vendedor que


vendido más en un mes determinado y que sirva tanto para sacar
ventas de contado como también a crédito.
 Crear un procedimiento almacenado que me actualice una tabla
auxiliar con los totales de ventas por cliente y por mes.
 Los ejercicios de aplicación respecto al proyecto de la empresa
ejemplo, que contengan tanto funciones como procedimientos y
programación PL/SQL y que se apliquen directamente en las
herramientas Developer 2000 como FORMS, se retomarán cundo se
49

haya desarrollado parte del módulo respectivo. Esto nos permitirá


aprovechar todo el potencial de Triggers, botones, librerías para
completar el proyecto.