1. Crear tablas .-
create tablecontrol(
usernamevarchar(20),
fecha date,
operacion varchar2(30))
create tableproductos(
idproducto number(4) primary keynot null,
nombreProductovarchar2(40),
PrecioProducto number(4),
cantidad number(4))
inserter datos.-
insert into productos values(6,'maiz','50','20');
insert into productos values(7,'papa','70','10');
insert into productos values (8,'arroz','30','15');
insert into productos values(9,'lechuga','40','30');
insert into productos values (5,'quinua','90','40');
update productos set PrecioProducto=
PrecioProducto+100wherecantidad>10;
delete productos whereidproductoin(6,7,8,9)
select*from productos
select*from control
-- crear procedures
create orreplace proceduresp_insertar_productos(
v_idproducto productos.idproducto%type,
v_nombreproductoproductos.nombreproducto%type,
v_precioproductoproductos.precioproducto%type,
v_cantidad productos.cantidad%type)
as
begin
insert intoproductos values
(v_idproducto,v_nombreproducto,v_precioproducto,v_can
tidad);
commit;
end sp_insertar_productos;
----
create orreplace proceduresp_actualiza_productos (
v_idproducto productos.idproducto%type,
v_nombreproductoproductos.nombreproducto%type,
v_precioproductoproductos.precioproducto%type,
v_cantidad productos.cantidad%type)
as
begin
update productos set
nombreproducto=v_nombreproducto,
precioproducto=v_precioproducto,
cantidad=v_cantidad
where idproducto=v_idproducto;
commit;
end sp_actualiza_productos;
create orreplace proceduresp_elimina_producto(
v_idproducto productos.idproducto%type)
as
begin
deletefrom productos whereidproducto=v_idproducto;
commit;
end;
create orreplace proceduresp_elimina_producto(
v_idproducto productos.idproducto%type)
as
begin
deletefrom productos whereidproducto=v_idproducto;
commit;
end;
select*from productos
begin
sp_insertar_productos(6,'pan','50','7');
end;
begin
sp_actualiza_productos('2','papa2','80','20');
end;
begin
sp_elimina_producto(6);
end;
paquetes
cabecera
create orreplace package pkg_productos as
procedure sp_insertar_productos(
v_idproductoproductos.idproducto%type,
v_nombreproducto
productos.nombreproducto%type,
v_precioproducto
productos.precioproducto%type,
v_cantidad productos.cantidad%type);
procedure sp_actualiza_productos (
v_idproductoproductos.idproducto%type,
v_nombreproducto
productos.nombreproducto%type,
v_precioproducto
productos.precioproducto%type,
v_cantidad productos.cantidad%type);
procedure sp_elimina_producto(
v_idproducto productos.idproducto%type);
end pkg_productos;
2. cuerpo o body
create orreplace package body pkg_productos as
procedure sp_insertar_productos(
v_idproducto productos.idproducto%type,
v_nombreproducto
productos.nombreproducto%type,
v_precioproducto
productos.precioproducto%type,
v_cantidadproductos.cantidad%type)
as
begin
insert into productos values
(v_idproducto,v_nombreproducto,v_precioproducto,v_can
tidad);
commit;
end sp_insertar_productos;
------
procedure sp_actualiza_productos (
v_idproducto productos.idproducto%type,
v_nombreproducto
productos.nombreproducto%type,
v_precioproducto
productos.precioproducto%type,
v_cantidadproductos.cantidad%type)
as
begin
update productos set
nombreproducto=v_nombreproducto,
precioproducto=v_precioproducto,
cantidad=v_cantidad
where idproducto=v_idproducto;
commit;
end sp_actualiza_productos;
--------------
procedure sp_elimina_producto(
v_idproducto productos.idproducto%type)
as
begin
delete from productos where
idproducto=v_idproducto;
commit;
end;
end pkg_productos;
-- cursor implicito
declare
v_nombreproductoproductos.nombreproducto%type;
v_precioproductoproductos.precioproducto%type;
v_cantidad productos.cantidad%type;
begin
selectnombreproducto, precioproducto, cantidad
into v_nombreproducto,v_precioproducto,v_cantidad
from productos
where idproducto='5';
dbms_output.put_line(v_nombreproducto||'
'||v_precioproducto||''||v_cantidad);
end;
--cursor exlicito
declare
cursor consultar is
select*from productos;
begin
for listarin consultar loop
dbms_output.put_line( listar.idproducto||'
'||listar.nombreproducto||''||listar.precioproducto||'
'||listar.cantidad );
end loop;
end;
3. Creacióny Usode DBLinks en Oracle
Un DatabaseLink (DBLink) enOracle es untipo deobjeto
que permiterealizar una conexióndesdeuna basede
datos a otra. Su principal objetivo es ocultar el detallede
los parámetros deconexiónnecesarios,facilitándonos un
sencillo accesoa los recursos disponibles enotras bases de
datos, independientementedequeestas se encuentren
instaladas en el mismo servidoro no.
Aunque es unconceptosencillode entender, suelegenerar
bastanteconfusión cuandouno se tropieza con él por
primera vez, sobre todo porquehayvarios elementos
involucrados en su creación y suelenplantearse dudas
acerca de en québasede datos concreta,de entre las dos
que se quierenconectar,tienen que crearsedichos
elementos.
Supongamos que tenemos dos bases dedatos: productos y
usuarios. La base dedatos deproductos almacena el
inventariode una empresa,conlos detalles de los artículos
que oferta y entre los queseincluyeel tipode público al
que se dirigecada artículo en particular. Por supartela
base de datos deusuarios contiene unficha detallada de
cada uno delos usuarios registrados en una weben la que
se incluye la edad,sexoy lugar deresidencia. En un
determinadomomento,la webdeciderealizar un estudio
para comprobar queproductodentro delos ofertados por
la empresa serían delagrado desus usuarios en función de
sus datos personales. Para realizar tal estudiodecide
contrastar la información delas dos bases dedatos,y para
ello deciden utilizar unDBLinkquepermita consultar datos
de los productos desdela basededatos deusuarios.
¿Cuales serían los pasos a seguir?
En primer lugar, en la basede datos de productos, debería
crearseunusuarionuevo,queserá elqueseutilice para
acceder a los datos deproductos.Dichousuarioserá un
usuarionormal deOracle,y debería tener como mínimo
permisopara conectar einiciar sesión enla basededatos
de productos, y por supuesto para acceder a los objetos
(tablas, vistas,...) quecontenganlos datos quesequieren
poder consultar desdela base dedatos deusuarios.En un
caso bastantetípico deeste tipode accesos lo quesehará
será crear un rolepara aglutinaren él los permisos, envez
de asignárselos directamentealusuario, y crear vistas
específicas para los datos quedeben poder consultarse, en
vez de permitirquepueda accedersedirectamentea toda
la basede datos.
CREATE ROLErol;
GRANTCONNECTTO rol;
GRANTSELECTON vista1TO rol;
GRANT SELECTON vista2TO rol;
CREATE USER usuarioIDENTIFIED BY clave;
GRANTrol TO usuario;
Y en segundo lugar, enla base dedatos deusuarios,
deberá crearseeldatabaselink para accedera la basede
datos deproductos utilizando elusuario y clave recién
creados enla otra basede datos.
CREATE PUBLIC DATABASELINK db_productos
CONNECTTO usuario
IDENTIFIED BY clave
USING 'connect_string_productos';
Una vez creado el DBLink puedeempezar a usarsesin más
en la base dedatos de usuarios con la siguiente sintaxis:
SELECT* FROMvista1@db_productos;
Aunque para simplificar las sentencias sepuedecrear un
sinónimo enla basededatos deusuarios:
CREATE PUBLIC SYNONYMvista1_productos FOR
vista1@db_productos;
De forma quepueda escribirse:
SELECT* FROMvista1_productos;