Documente Academic
Documente Profesional
Documente Cultură
3DVRV,QLFLDOHV&UHDFLyQGHO(QWRUQR
Lo primero que se llev a cabo fue la creacin del entorno. Esto se llev a cabo
por medio de un usuario con privilegios DBA:
&UHDFLyQGHOD7$%/(63$&(868$5,26
Por medio del comando:
CREATE TABLESPACE "USUARIOS"
LOGGING
DATAFILE /oracle/app/oracle/oradata/USUARIOS.ora SIZE 50M
/
2WRUJDUSULYLOHJLRVDORVXVXDULRV
Por medio de sentencias como las siguientes:
GRANT CONNECT TO alumnoXX
/
TO alumnoXX
Pg. 1 de 8
Prctica 1 PL_SQL.doc
Para generar estos comandos con los 35 usuarios creados anteriormente se utiliz una
sentencia SQL que selecciona los nombres de los 35 usuarios y crea las distintas
sentencias concatenando palabras SQL y nombres de usuarios. El siguiente, es un
ejemplo de este tipo de sentencia SQL:
set pages 0
spool d:\priv.sql
select GRANT CONNECT TO ||username||;
from dba_users
where username like ALU%
/
spool off
start d:\priv.sql
la primera lnea elimina las cabeceras, la orden spool enva la salida al fichero
indicado a continuacin (d:\priv.sql en el ejemplo). La sentencia SELECT concatena
(por medio del operador ||) el comando GRANT completo y el nombre de los 35
usuarios cuyo nombre comienza por ALU. La orden spool off cierra el fichero de
salida y la orden start lo ejecuta.
El fichero de salida contiene lo siguiente:
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
.
.
.
Pg. 2 de 8
CREATE
CREATE
CREATE
CREATE
CREATE
CREATE
PROCEDURE
PROCEDURE
PROCEDURE
PROCEDURE
PROCEDURE
PROCEDURE
TO
TO
TO
TO
TO
TO
ALUMNO1;
ALUMNO10;
ALUMNO11;
ALUMNO12;
ALUMNO13;
ALUMNO14;
Prctica 1 PL_SQL.doc
3UiFWLFD64/\3/64/
Cada uno de los usuarios creados en el apartado anterior se conecta a la base de
datos y lleva a cabo los siguientes pasos:
Para saber con que usuario estoy conectado a la BBDD puedo utilizar el
comando show user.
&UHDFLyQGHOD7$%/$HMHPSOR
Creamos una tabla que nos sirva de ejemplo:
create table
(numero
fecha
cadena
/
tabla
number,
date,
varchar2(10))
/OHQDGRGHOD7$%/$HMHPSOR
Por medio del siguiente bloque PL annimo llenamos la tabla con 100 registros:
begin
for a in 1..100 loop
insert into tabla
(numero,
fecha,
cadena)
values
(a,
sysdate + a,
chr (a));
end loop;
end;
/
Con este ejemplo estamos utilizando un Bucle FOR, las funciones de columna
SYSDATE (que devuelve la fecha del da) y CHR (que devuelve el carcter
ASCII correspondiente al nmero indicado como parmetro).
Tras ejecutar el bloque PL la tabla tendr 100 registros. No hay que olvidar
hacer COMMIT. Se puede comprobar si tiene las 100 filas con una sentencia
SQL como:
Select count(*) from tabla;
Pg. 3 de 8
Prctica 1 PL_SQL.doc
%ORTXH3/64/FRQFXUVRUHV
Por medio del siguiente bloque PL annimo nos recorremos la tabla e
imprimimos un mensaje por cada uno de los 100 registros:
Set serveroutput on
DECLARE
--- Se definen las tres variables que nos permitirn
-- recibir los valores recuperados por el CURSOR
-var1
tabla.numero%TYPE;
var2
tabla.fecha%TYPE;
var3
tabla.cadena%TYPE;
-- Se define el cursor (sentencia SELECT con nombre)
CURSOR tab_cursor IS
SELECT numero, fecha, cadena
FROM tabla;
BEGIN
-- Abre el cursor
OPEN tab_cursor;
LOOP
-- Recupera el siguiente registro en cada iteracin
FETCH tab_cursor INTO var1,var2,var3;
EXIT WHEN tab_cursor%NOTFOUND;
-- Muestra un mensaje en el entorno SQL
-- Es necesario, en dicho entorno, habilitar la salida
-- de mensajes (set serveroutput on)
dbms_output.put_line ('Fila '||to_char(var1));
END LOOP;
CLOSE tab_cursor;
END;
/
Las sentencias SET son para manipular el entorno SQL*Plus, se pierden cada
vez que se sale de dicha herramienta o cada vez que nos conectamos a otro
usuario.
Pg. 4 de 8
Prctica 1 PL_SQL.doc
&UHDFLyQGHXQDQXHYD7$%/$HMHPSOR
Creamos una tabla que nos sirva de ejemplo:
create table
(c_numero
c_fecha
c_cadena
/
copia
number,
date,
varchar2(10))
Tras ejecutar el bloque PL la tabla copia tendr los mismos 100 registros que
la tabla tabla. No hay que olvidar hacer COMMIT. Se puede comprobar si
tiene las 100 filas por medio de sentencias SQL.
Pg. 5 de 8
Prctica 1 PL_SQL.doc
&UHDFLyQGHXQ3/64/QRDQyQLPR
Para demostrar las ventajas de utilizar procedimientos PL/SQL, se crea un
procedimiento que inserta datos, recibidos como parmetros, en la tabla copia:
create or replace procedure insertar_copia
(var1
in copia.c_numero%type,
var2
in copia.c_fecha%type,
var3
in copia.c_cadena%type) is
begin
insert into copia (c_numero, c_fecha, c_cadena)
values (var1, var2, var3);
end;
/
Pg. 6 de 8
Prctica 1 PL_SQL.doc
8WLOL]DFLyQGHOSURFHGLPLHQWR
Para hacer uso del procedimiento recin creado y simplificar nuestro bloque PL
annimo, slo debemos invocar a dicho procedimiento en lugar de realizar la
insercin que realizbamos antes:
DECLARE
--- Se definen las tres variables que nos permitirn
-- recibir los valores recuperados por el CURSOR
-var1
tabla.numero%TYPE;
var2
tabla.fecha%TYPE;
var3
tabla.cadena%TYPE;
-- Se define el cursor (sentencia SELECT con nombre)
CURSOR tab_cursor IS
SELECT numero, fecha, cadena
FROM tabla;
BEGIN
-- Abre el cursor
OPEN tab_cursor;
LOOP
-- Recupera el siguiente registro en cada iteracin
FETCH tab_cursor INTO var1,var2,var3;
EXIT WHEN tab_cursor%NOTFOUND;
-- Inserta el registro en la tabla copia
insertar_copia (var1, var2, var3);
END LOOP;
CLOSE tab_cursor;
END;
/
5HVXPHQ
Hemos visto por medio de esta prctica, el uso de sentencias SQL para:
-
crear TABLESPACES
crear USUARIOS
otorgar PRIVILEGIOS
generar sentencias
bloques PL annimos
bucles FOR sencillos
bucles sobre CURSORES
bloques almacenados no annimos. Procedimientos
utilizacin de Procedimientos en bloques PL
Pg. 7 de 8
Prctica 1 PL_SQL.doc
2EMHWRV\WDEODV
Cuando cada uno de nosotros volvamos a conectarnos a la base de datos, seguiremos
teniendo los objetos que hemos creado:
-
Tablas
Procedimientos
Por otro lado tendremos los scripts que manipulan esos objetos (bloques PL annimos).
Para ver los objetos y tablas que pertenecen a nuestro usuario podemos utilizar
sentencias SELECT como las siguientes:
select object_name, object_type from user_objects;
select * from cat;
select * from tabs;
Pg. 8 de 8
Prctica 1 PL_SQL.doc