Sunteți pe pagina 1din 8

3UiFWLFD3/64/

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
/

Se puede ver como el fichero se refiere a una ruta en la mquina UNIX.


 &UHDFLyQGHXVXDULRV
Por medio de 35 sentencias similares a esta:
create user alumnoXX
identified by alumnoXX
default tablespace USUARIOS
temporary tablespace temp
/

 2WRUJDUSULYLOHJLRVDORVXVXDULRV
Por medio de sentencias como las siguientes:
GRANT CONNECT TO alumnoXX
/

Para permitir a los usuarios conectarse a la BBDD.


GRANT CREATE PROCEDURE
/

TO alumnoXX

Para permitir a los usuarios crear PROCEDURES de Base de Datos.



ALTER USER alumnoXX QUOTA UNLIMITED ON USUARIOS
/

Para permitir a los usuarios almacenar objetos en la tablespace USUARIOS.

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))

En esta tabla vamos a copiar el contenido de la tabla inicial (tabla).


 5HDOL]DFLyQGHODFRSLDGHORVGDWRVGHXQDWDEODHQRWUD
En lugar de mostrar un mensaje, haremos un nuevo bloque PL que inserte los
datos obtenidos de la tabla original en la tabla recin creada:
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
Insert into copia
(c_numero,
c_fecha,
c_cadena)
values
(var1,
var2,
var3);
END LOOP;
CLOSE tab_cursor;
END;
/

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;
/

Es una buena prctica indicar todas las columnas insertadas en la sentencia


INSERT, aunque tambin funcionara insert into copia values (var1, var2,
var3); si en algn momento se reestructurara la tabla, dicha sentencia podra
fallar.
Si al crear el procedimiento, el sistema muestra un mensaje indicando que se han
producido errores se puede utilizar el comando show errors para mostrar los
errores ocurridos.
 3UXHEDGHOSURFHGLPLHQWR3/64/
Para ejecutar el procedimiento recin creado, basta con utilizar la sentencia
EXECUTE:
execute insertar_copia (123, sysdate, cadena 10);

Podemos comprobar que se ha insertado la fila por medio de sentencias


SELECT.

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;
/

No es necesario utilizar la sentencia EXECUTE para invocar al un


procedimiento desde un bloque PL. Slo es necesario referenciar su nombre e
indicar los parmetros necesarios

5HVXPHQ
Hemos visto por medio de esta prctica, el uso de sentencias SQL para:
-

crear TABLESPACES
crear USUARIOS
otorgar PRIVILEGIOS
generar sentencias

Hemos visto el uso de bloques PL/SQL de diferentes tipos:


-

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

S-ar putea să vă placă și