You are on page 1of 11

ANEXO D: UTILIDADES SOBRE SQL Y PL/SQL

El comando 'dbms_output.put_line' de PL/SQL escribe una lnea en la ventana de SQL*Plus. Para que 'dbms_output.put_line' funcione, es necesario ejecutar "SET SERVEROUTPUT ON" en SQL*Plus. Para el cuerpo de los procedimientos no se usa SQL, sino PL/SQL. Por ejemplo, la sentencia SELECT es diferente, ya que en PL/SQL se necesita la clusula INTO para decirle dnde almacenar el resultado Para terminar la creacin de un procedimiento (o funcin) en SQL*Plus o en un script, es necesario aadir / despus del end; que cierra la declaracin. Podemos usar una funcin para devolver un valor, o bien parmetros de salida. Las siguientes declaraciones seran funcionalmente equivalentes:

A. Sintaxis
Salida por pantalla (PL/SQL) dbms_output.put_line ('<texto>'); dbms_output.put_line ('<texto>'||<variable>); dbms_output.put_line ('<texto>'||to_char(<variable>)); Creacin de usuario create user <usuario> identified by <contrasea>; grant dba to <usuario>; grant connect to <usuario>; Eliminacin de usuario con todos sus objetos drop user <usuario> cascade; Creacin de vnculo visible slo para el usuario (no pblico) create database link <vnculo> connect to <usuario> identified by <contrasea> using '<instancia>'; Existe la opcin PUBLIC para crear el vnculo visible para todos los usuarios, pero no lo usamos. Eliminacin de vnculo pblico/no pblico drop database link <vnculo>; drop public database link <vnculo>; Podemos realizar las dos llamadas, de forma que se elimine tanto si hemos usado la opcin PUBLIC al crearlo como si no.

Tipos bsicos varchar2 varchar2(<tamao>) number number(<tamao>) number(<tamao>,<decimales>) date Creacin de una tabla create table <tabla> ( <campo> <tipo> { | null | not null }, ... primary key (<campo>,...), foreign key (<campo>,...) references <tabla>, ... ); Modificacin de una tabla aadiendo elementos alter table <tabla> add ( <campo> <tipo> { | null | not null }, ... primary key (<campo>,...), foreign key (<campo>,...) references <tabla>, ... ); Eliminacin de una tabla drop table <tabla>; Eliminacin de una tabla y sus relaciones drop table <tabla> cascade constraints; Insercin de un registro insert into <tabla> ( <campo>, ... ) values ( <valor>, ... ); Modificacin de un registro update <tabla> set <campo>=<valor>, ... where <condicin clave>; Eliminacin de un registro delete from <tabla> where <condicin clave >;

Eliminacin de todos los registros de una tabla truncate table <tabla> ; truncate table <tabla> preserve materialized view log; truncate table <tabla> purge materialized view log; Obtencin de la fecha del sistema select sysdate from dual; Obtencin del usuario conectado select user from dual; Creacin de una secuencia create sequence <secuencia> minvalue <mnimo> maxvalue <mximo> start with <valor inicial>; Eliminacin de una secuencia drop sequence <secuencia>; Obtencin del siguiente valor de una secuencia select <secuencia>.nextval from dual; select <secuencia>.nextval into <variable> from dual; Obtencin de todos los registros de una tabla select * from <tabla>; Id. si la tabla est en otro esquema (no se usa en esta prctica) select * from <usuario>.<tabla>; Id. si la tabla es remota select * from <tabla>@<vnculo>; Fechas en formato YYYYMMDD to_date(<yyyy><mm><dd>,yyyymmdd) -- ej. to_date(20070101,yyyymmdd) = 1-1-2007 Commit commit; Rollback rollback; Creacin de un sinnimo create or replace synonym <sinnimo> for <objeto>;

Creacin de una vista create or replace view <vista> as select ...; Creacin de una vista de unin create or replace view <vista> as select * from <tabla1> union select * from <tabla2>; Declaracin de una variable (SQL*Plus) var <variable> <tipo>; Uso de una variable :<variable> Obtencin de un campo en una variable select <campo> into <variable> from <tabla> where <condicin>; Mostrar errores de compilacin de PL/SQL (SQL*Plus) -- despus de la creacin de un procedimiento, funcin o trigger... / show errors Creacin de un procedimiento almacenado con parmetro de entrada y variable local create or replace procedure <procedure> ( <param> in <tipo>, ... ) authid current_user -- Evita problemas de privilegios en EXECUTE as <variable> <tipo>; begin ... ... end; / show errors

Creacin de una funcin almacenada con parmetro de entrada y variable local create or replace function <function> ( <param> in <tipo>, ... ) return <tipo> authid current_user -- Evita problemas de privilegios en EXECUTE as <variable> <tipo>; begin ... ... return <valor>; end; / show errors Bloque if-then if <condicin> then ... end if; Bloque if-then-else if <condicin> then ... else ... end if; Ejecucin de SQL dinmico execute immediate '<comando>'; Tratamiento de excepciones begin ... ... ... exception when <tipo error> then ... when others then ... end; Llamada a un procedimiento almacenado (SQL*Plus) exec <procedimiento> ( <param>, ...); exec <procedimiento> ( :<variable> ); Llamada a una funcin almacenada (SQL*Plus) exec :<variable> := <funcin> ( <param>, ... );

Creacin de un trigger posterior a la insercin create or replace trigger <trigger> after insert on <tabla> for each row begin dbms_output.put_line ( 'insertando ' || :new.<campo> ); ..... end; / show errors Creacin de un trigger posterior al borrado create or replace trigger <trigger> after delete on <tabla> for each row begin dbms_output.put_line ( 'borrando ' || :old.<campo> ); ..... end; / show errors Creacin de un trigger posterior a la modificacin create or replace trigger <trigger> after update on <tabla> for each row begin dbms_output.put_line ( 'modificando ' || :old.<campo> || ' => ' || :new.<campo> ); ..... end; / show errors Creacin de un trigger previo a la modificacin de un campo, con variable local create or replace trigger <trigger> before update of <campo> on <tabla> for each row declare <variable> <tipo>; begin dbms_output.put_line ( 'modificando ' || :old.<campo> || ' => ' || :new.<campo> ); ..... end; / show errors

Creacin de un log de vista materializada create materialized view log on <tabla> with primary key excluding new values; Creacin de una vista materializada sincronizada, con refresco cada da create materialized view <vista_materializada> build deferred -- o bien immediate using index refresh force -- o bien fast o complete start with sysdate+1 next sysdate+1 for update as select * from <tabla>@<vnculo>; Forzar la sincronizacin de una vista materializada exec dbms_refresh.refresh('<usuario>.<vista_materializada>');

B. Ejemplos
Ejemplo de ejecucin de SQL dinmico (PL/SQL) create or replace procedure obtener_tabla ( tabla in varchar2 ) as command varchar2(100); begin command := 'select * from ' || tabla; execute immediate command; end; / show errors

Ejemplo de creacin de procedimiento almacenado con excepciones create or replace procedure alumno_crear ( v_cod_alumno out number, -- devuelve el cdigo v_dni in varchar2, v_nombre in varchar2, v_apellidos in varchar2, v_direccion in varchar2 ) as v_cod_campus number; -- variable local begin -- obtiene el cdigo de una secuencia select seq_cod_alumno.nextval into v_cod_alumno from dual; -- obtiene el cdigo de campus de una funcin v_cod_campus := get_cod_campus_activo(); -- inserta el registro insert into alumno ( cod_alumno, dni, nombre, apellidos, direccion, cod_campus ) values ( v_cod_alumno, v_dni, v_nombre, v_apellidos, v_direccion, v_cod_campus ); commit; exception when others then dbms_output.put_line('alumno_crear: No se pudo crear registro'); v_cod_alumno := 0; rollback; end; / show errors Ejemplo de creacin de procedimiento almacenado con excepciones var cod_alumno number; exec alumno_crear ( :cod_alumno, 552444242, 'Pedro', 'Prez', 'c/ Pez' );

Ejemplo de creacin de procedimiento almacenado con SQL dinmico y excepciones create or replace procedure seq_create ( v_fieldname in varchar2, v_cod_banco in number ) authid current_user -- Evita problemas de privilegios en EXECUTE as v_sqlcommand varchar2(2000); v_escala number := 100000000; -- si v_cod_banco=1 -> 100000000 a 199999999 -- si v_cod_banco=2 -> 200000000 a 299999999 begin dbms_output.put_line('seq_create: fieldname: ' || v_fieldname); v_sqlcommand := 'create sequence seq_' || v_fieldname || ' minvalue ' || to_char(v_escala*v_cod_banco) || ' maxvalue ' || to_char(v_escala*(v_cod_banco+1)-1) || ' start with ' || to_char(v_escala*v_cod_banco); dbms_output.put_line('seq_create: sqlcommand= ' || v_sqlcommand); execute immediate v_sqlcommand; exception when others then dbms_output.put_line('seq_create: No se pudo crear la secuencia' ); end; / show errors Ejemplo de creacin de procedimiento almacenado con llamada a proc. remoto create or replace procedure crear_cliente ( v_dni in number,v_nombre in varchar2) authid current_user as begin -- slo debe hacer insercin local si est conectado a LEGA if cod_sede_conectada()='L' then insert into cliente (dni,nombre) values(v_dni,v_nombre); commit; else -- llama al procedimiento remoto en LEGA dbms_output.put_line('Llamando al procedimiento en LEGA...'); crear_cliente@lega(v_dni,v_nombre); end if; end; / show errors

Borrar procedimientos, secuencias, tablas, etc. de un usuario (SQL*Plus) connect <usuario>/<contrasea>@<instancia> --exec for obj in (select * from user_objects) loop dbms_output.put_line('name = ' || obj.object_name || ', type = ' || obj.object_type); end loop; exec for seq in (select * from user_sequences) loop execute immediate 'drop sequence '||seq.sequence_name; end loop; exec for proc in (select * from user_procedures) loop execute immediate 'drop procedure '||proc.procedure_name; end loop; exec for trig in (select * from user_triggers) loop execute immediate 'drop trigger '||trig.trigger_name; end loop; exec for constr in (select * from user_constraints) loop execute immediate 'alter table '||constr.table_name || ' drop constraint '||constr.constraint_name; end loop; exec for mvw in (select * from user_mviews) loop execute immediate 'drop materialized view '||mvw.mview_name; end loop; exec for tab in (select * from user_tables) loop execute immediate 'drop table '||tab.table_name; end loop; select * from user_objects; Borrar todos los usuarios creados con posterioridad al 1-1-2007 connect sys/administrador@<instancia> as sysdba exec for usr in (select * from all_users where created>to_date('20070101', 'yyyymmdd')) execute immediate 'drop user '||usr.username||' cascade'; end if; end loop;

B. Bibliografa (Documentacin on-line)


Oracle Database 10g Release 2 (10.2) - Documentation Library http://www.oracle.com/pls/db102/homepage http://www.oracle.com/pls/db102/portal.all_books Oracle Database 10g Release 2 (10.2) SQL*Plus Quick Reference http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14356/toc.htm http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14356.pdf Oracle Database 10g Release 2 (10.2) SQL Reference http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200.pdf

Oracle Database 10g Release 2 (10.2) PL/SQL User's Guide and Reference http://downloaduk.oracle.com/docs/cd/B19306_01/appdev.102/b14261/toc.htm http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14261.pdf Oracle Database 10g Release 2 (10.2) Advanced Replication http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14226/toc.htm http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14226.pdf Oracle Database 10g Release 2 (10.2) Application Developer's Guide - Object-Relational Features http://downloaduk.oracle.com/docs/cd/B19306_01/appdev.102/b14260/toc.htm http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14260.pdf