Академический Документы
Профессиональный Документы
Культура Документы
2. OTROS CONCEPTOS:
Las tablas
Ventas
Comisiones
3. OBJETOS 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
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.
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.
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.
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.
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
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
Si todo sale bien le avisa de una tabla creada. Usted puede verificarlo
con una de las instrucciones anteriores.
-- 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
/
-- 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
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.
--
--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
;
-- 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
-- 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.
-- 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.
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
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
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
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)
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:
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
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”
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;
select nombre_persona
24
from personas
where codigo_lugar = (select codigo_lugar
from lugares
where nombre_lugar like 'TUN%'
)
and tipo_persona = 'C';
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.
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.
ACTUALIZACION DE INFORMACION.
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
COMANDO SYNONYM
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.
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
TIPOS DE DATOS.
Ejemplos:
DECLARE
a number;
b number(7):=2;
c number(10,2);
f varchar2(30):=‟‟;
g boolean;
fecha date;
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
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.
CONDICIONALES:
BUCLES:
Estructuras que me permiten repetir una serie de pasos mientras se
cumpla una condición.
CURSORES:
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;
EXCEPTION
WHEN nombre_excepcion1 THEN
Ordenes a tomar;
37
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;
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
FUNCIONES CLIENTE.
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);
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;
sumatoria := 0;
When Others then
sumatoria := 0;
End;
Return(sumatoria);
END;
Los usuarios deben crear un SYNONYM sobre este objeto, para poderlo
usar.
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 :
PROCEDIMIENTOS CLIENTE:
Ejemplo:
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);
--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;
IS
Variables tipo;
BEGIN
Instrucciones;
Comandos SQL;
END;
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 :
PACKAGES (PAQUETES)
Un ejemplo es:
TRIGGERS EN EL CLIENTE
BEGIN
Instrucciones;
END;