guia plsql breve

10
Gúia Básica PL/SQL para DBAs Juan Sánchez [email protected]

Upload: juan-sanchez

Post on 17-Jul-2015

679 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Guia plsql breve

Gúia Básica PL/SQL

para DBAs

Juan Sánchez – [email protected]

Page 2: Guia plsql breve

Indentificadores 1. Longitud Máxima 30 caracteres 2. Siempre empiezan por 1 letra 3. Valores válidos: letras, números, $, _, # 4. No son “case sensitive” por defecto 5. No pueden utilizar palabras reservadas

Comentarios 1. De 1 línea -- <comentario>

2. De más de 1 línea /* <comentario> */

Operadores Ope rador Descripción Ejemplo

. Selector componente

tabla.columna

(,) Expresión o delimitador

nombre varchar2(20);

: Indicador de host

, Separador edad number(3,0)

“ Comillas nombre:=”Steve”

= Igualdad fecha_entrega=sysdate

@ Indicador de acceso remoto

; Terminador de comando

nombre varchar2(20);

:= Asignación nombre:=”Steve”

=> Operador de asociación

cortar(cadena=>”a”)

|| Concatenación nombre:=”Steve” || “Mar”

** Exponenciación cuadrado:=5**2

<<, >> Identificadores de etiqueta

<<bloque_principal>>

/*, */ Comentarios multilínea

/* Comentario */

-- Comentario en 1 línea

-- Comentario

. . Operador de rango

<,>,<=,>= Operadores relacionales

edad > sysdate

<>,’=,~=, ^=

Desigualdad fecha_entrega<>sysdate

% Comodín nombre LIKE ‘A%’

+, -, *, / Suma, Resta, Mult y División

edad := sysdate+10

IS NULL Comparar NULL edad IS NULL

LIKE Como nombre LIKE ‘A%’

BETWEEN Entre edad BETWEEN 1 an 18

IN En edad in (2,4,18)

NOT No NOT edad = 19

AND Y cond1 AND cond2

OR O cond1 OR cond2

Declaración variables <nombre> [constant] <tipo>; <nombre> [constant] <tipo> DEFAULT {<valor> | NULL}; <nombre> [constant] <tipo> := <valor>; <nombre> <variable>%TYPE; <nombre> <tabla>.<columna>%TYPE; <nombre> <tabla>%ROWTYPE;

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Tipos de variables Tipo Descripción Ejemplo

number(dig,dec)

Número Dig=Dígitos, Dec=Decimales

edad number(3,0); importe number(6,2);

varchar2(long)

Carácter nombre varchar2(20);

%TYPE Mismo tipo que variable

edad2 edad%TYPE; edad cliente.edad%TYPE;

%ROWTYPE Colección columnas

registro tab_cliente%ROWTYPE

Ámbito variables 1. Si variable/parámetro mismo nombre que columna

tabla, precede columna tabla 2. Una variable es visible en el bloque que se ha

declarado, así como en sus sub bloques 3. Una variable declarada en un sub bloque precede a la

del bloque 4. Una variable de bloque precedida por una de sub

bloque es visible mediante el identificador

<<ppal>>

declare

mensaje varchar2(20):='Principal';

begin

dbms_output.put_line('mensaje = ' || mensaje );

declare

mensaje varchar2(20) := 'Sub bloque';

begin

dbms_output.put_line('mensaje=' || mensaje );

dbms_output.put_line('mensaje=' ||

ppal.mensaje );

end;

end;

/

Page 3: Guia plsql breve

Procedimientos create or replace procedure <nombre>

(<parámetros>)

is

[<declaración de variables>]

begin

comando1;

….

[exception]

<manejo de excepciones>

end;

Funciones create or replace procedure <nombre>

(<parámetros>) return <tipo>

is

[<declaración de variables>]

begin

comando1;

….

[exception]

<manejo de excepciones>

end;

Bloque anónimo [<<etiqueta>>]

[declare

<declaración de variables>

<declaración funciones|proced>]

begin

comando1;

….

[exception]

<manejo de excepciones>

end;

Bloque anónimo <<ppal>>

declare

mensaje varchar2(20):='Hola Mundo';

begin

dbms_output.put_line(mensaje );

end;

/

Procedimientos create or replace procedure

mostrar_mensaje (mensaje IN varchar2)

is

begin

dbms_output.put_line(mensaje);

end;

Funciones create or replace

function hoy return timestamp

is

begin

return systimestamp;

end;

Tipos de parámetros Tipo Descripción Ejemplo

IN Entrada Por defecto Por referencia

edad IN number edad number

OUT Salida Por valor

edad OUT number

OUT NOCOPY Salida Por referencia

edad OUT NOCOPY number

IN OUT Entrada/Salida Por valor

edad IN OUT number

IN OUT NOCOPY

Entrada/Salida Por Referencia

edad IN OUT NOCOPY number

Tipo Descripción Ejemplo

Obligatorio Con valor edad IN number

Opcional Predefinidos edad IN number := 18

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Page 4: Guia plsql breve

Cuerpo del paquete create or replace package body <paquete>

as

<funciones>;

<procedimientos>;

<variables globales>;

<constantes>;

end;

Paquete create or replace package pkg <paquete>

as

<cabeceras funciones>;

<cabecerar procedimientos>;

<variables globales>;

<constantes>;

end;

Paquete create or replace package prueba

as

function hoy return timestamp;

funciton mañana return timestamp;

procedure mensaje(texto varchar2);

end;

Cuerpo del paquete create or replace package pkg prueba

as

function hoy return timestamp

is

return systimestamp;

end;

end;

Disparadores create or replace trigger <disparador>

{before insert or update or delete |

instead of insert or update or delete}

of <campos>

on <table>

[for each row]

declare

<variables>

begin

end;

Campos especiales disparad. 1. :new.<campo> = Valor Nuevo 2. :old.<campo> = Valor Previo

Abortar DML mdte excepción raise_application_error(-<num>,’texto’);

Paquetes Estándar Nombre Descripción

dbms_output Muestra mensaje en consola

utl_file Gestión de ficheros externos localizados en el sistema

dbms_utility Utilidades del sistema

dbms_job Gestión de tareas y trabajos

Transacciones autónomas create or replace trigger <nombre>

is

pragma autonomous_transaction;

begin

<comandos>;

commit;

end;

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Page 5: Guia plsql breve

Condicional IF if <condición> then

<commandos>

elsif <condición> then

<commandos>

else

<commandos>

end if;

Condicional IF if edad > 18 then

dbms_output.put_line(‘OK’);

elsif edad = 18 then

dbms_output.put_line(‘Casi OK’);

else

dbms_output.put_line(‘KO’);

end if;

Condicional CASE case <selector>

when <valor1> then

<comandos>

when <valor2> then

<comandos>

else

<comandos>

end case;

Condicional CASE case edad

when 18 then

dbms_output.put_line(‘ok’);

else

dbms_output.put_line(‘ko’);

end case;

Condicional CASE case

when <condicion1> then

<comandos>

when <condicion2> then

<comandos>

else

<comandos>

end case;

Condicional CASE case

when edad >18 then

dbms_output.put_line(‘ok’);

else

dbms_output.put_line(‘ko’);

end case;

Iteración LOOP loop

<comandos>;

exit when <condicion>;

<comandos>;

end loop;

Iteración LOOP loop

edad:=edad+1;

exit when edad=40;

end loop;

Iteración WHILE while <condicion>

loop

<comandos>

end loop;

Iteración WHILE while edad <= 40

loop

edad:=edad+1;

end loop;

Iteración FOR for <contador> in [reverse] <min>..<max>

loop

<comandos>

end loop;

Iteración FOR for edad in 10..18

loop

dbms_output.put_line(edad)

end loop;

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Page 6: Guia plsql breve

Excepciones Estándar Excepción Error Oracle ID

ACCESS_INTO_NULL ORA-06530 -6530 CASE_NOT_FOUND ORA-06592 -6592 COLLECTION_IS_NULL ORA-06531 -6531 CURSOR_ALREADY_OPEN ORA-06511 -6511 DUP_VAL_ON_INDEX ORA-00001 -1 INVALID_CURSOR ORA-01001 -1001 INVALID_NUMBER ORA-01722 -1722 LOGIN_DENIED ORA-01017 -1017 NO_DATA_FOUND ORA-01403 +100 NOT_LOGGED_ON ORA-01012 -1012 PROGRAM_ERROR ORA-06501 -6501 ROWTYPE_MISMATCH ORA-06504 -6504 SELF_IS_NULL ORA-30625 -30625 STORAGE_ERROR ORA-06500 -6500 SUBSCRIPT_BEYOND_CO

UNT ORA-06533 -6533

SUBSCRIPT_OUTSIDE_L

IMIT ORA-06532 -6532

SYS_INVALID_ROWID ORA-01410 -1410 TIMEOUT_ON_RESOURCE ORA-00051 -51 TOO_MANY_ROWS ORA-01422 -1422 VALUE_ERROR ORA-06502 -6502 ZERO_DIVIDE ORA-01476 -1476

Gestión excepción create or replace procedure <nombre>

is

begin

<comandos>;

exception

when <codigo> then

<comandos>;

when others then

<comandos>;

end;

Gestión excepcion create or replace procedure <nombre>

is

begin

<comandos>;

exception

when ZERO_DIVIDED then

<comandos>;

when others then

<comandos>;

end;

Tipos de Excepciones Nombre Descripción

ORA Errores Oracle

PLS Errores PL/SQL

FRM Oracle Forms

REP Oracle Reports

Partes de una excepción Nombre Descripción

Nombre Abreviatura error

Tipo Tipo de Error

ID Código Identificador

Mensaje Mensaje descriptivo

Renombrar excepción create or replace procedure <nombre>

is

<excepción> exception;

pragma exception_init(<excepcion>,<id>);

begin

<comandos>;

exception

when <excepcion> then

<comandos>;

end;

Crear excepción create or replace procedure <nombre>

is

<excepción> exception;

pragma exception_init(<excepcion>,<id>);

begin

<comandos>;

raise <excepcion>;

<comandos>

exception

when <excepcion> then

<comandos>;

end;

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Page 7: Guia plsql breve

Cursor implicito select <campo> into <variable> from ...;

insert into ...

update ...

delete ...

Cursor implicito select sysdate into ahora from dual;

<registro> <tabla>%ROWTYPE;

select * into <registro> from <tabla>

Cursor Explicito declare

cursor <cursor> is <consulta>;

begin

open <cursor>;

fetch <cursor>.<campo> into <var>;

close <cursor>;

end;

/

Cursor Explicito declare

cursor <cursor> is <consulta>;

<registro> <cursor>%ROWTYPE;

begin

open <cursor>;

loop

fetch <cursor> into <registro>;

exit when <cursor>%NOTFOUND;

end;

/

Variables predefinidas Implicito Nombre Descripción

SQL%NOTFOUND No Existen registros afectados

SQL%FOUND Existen registros afectados

SQL%ISOPEN Siempre devuelve falso

SQL%ROWCOUNT Nº registros recuperados

Cursor Explicito declare

cursor <cursor>

(<parámetro> <tipo>) is

<consulta>;

<registro> <cursor>%ROWTYPE;

begin

open <cursor>(<valor>);

loop

fetch <cursor> into <registro>;

exit when <cursor>%NOTFOUND;

end loop;

close <cursor>

end;

Variables predefinidas Explicito Nombre Descripción

<cursor>%NOTFOUND No Existen registros afectados

<cursor>%FOUND Existen registros afectados

<cursor>%ISOPEN Esta el cursor abierto

<cursor>%ROWCOUNT Nº registros recuperados

Cursor Explicito declare

cursor <cursor>

(<parámetro> <tipo> is

<consulta>;

begin

for <reg> in <cursor>(<valor>) loop

<comandos>

end loop;

end;

/

Cursor Explicito begin

for <reg> in <consulta> loop

<comandos>

end loop;

end;

/

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Page 8: Guia plsql breve

Leer datos actuales después inicio transacción begin

set transaction isolation level read

commited;

<comandos>;

end;

Obviar datos actuales después inicio transacción begin

set transaction isolation level

serializable;

<comandos>;

end;

SQL Dinámico DML declare

<consulta> varchar2 :=<query>;

begin

execute immediate <consulta>;

end;

SQL Dinámico SELECT declare

<consulta> varchar2 :=<query>;

<variable> <tipo>;

begin

execute immediate <consulta> into

<variable>;

end;

SQL Dinámico SELECT con BIND declare

<consulta> varchar2 :=<query>;

<variable> <tipo>;

<parametro> <tipo>;

begin

execute immediate <consulta> into

<variable> using <parametro>;

end;

query = ‘select * from tabla where campo

= :parametro’

PL/SQL Dinámico con BIND declare

<plsql> varchar2 :=<codigo>;

<variable> <tipo>;

<parametro> <tipo>;

begin

execute immediate <consulta> into

<variable> using in out <parametros>;

end;

query = ‘begin :1:=:2+:3; end;’

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Page 9: Guia plsql breve

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo

Tamaño tabla select avg_row_len*num_rows from dba_tables;

select segment_name, sum(bytes)/(1024*1024)from user_extents where

segment_type='TABLE' and segment_name = <tabla>;

SQL Ejecutado o Ejecuntándose select sql_fulltext, executions, disk_reads, elapsed_time, from v_$sql;

Enviar correo electrónico DECLARE

v_From VARCHAR2(80) := '[email protected]';

v_Recipient VARCHAR2(80) := '[email protected]';

v_Subject VARCHAR2(80) := 'test subject';

v_Mail_Host VARCHAR2(30) := 'mail.mycompany.com';

v_Mail_Conn utl_smtp.Connection;

crlf VARCHAR2(2) := chr(13)||chr(10);

BEGIN

v_Mail_Conn := utl_smtp.Open_Connection(v_Mail_Host, 25);

utl_smtp.Helo(v_Mail_Conn, v_Mail_Host);

utl_smtp.Mail(v_Mail_Conn, v_From);

utl_smtp.Rcpt(v_Mail_Conn, v_Recipient);

utl_smtp.Data(v_Mail_Conn,

'Date: ' || to_char(sysdate, 'Dy, DD Mon YYYY hh24:mi:ss') || crlf ||

'From: ' || v_From || crlf ||

'Subject: '|| v_Subject || crlf ||

'To: ' || v_Recipient || crlf ||

crlf ||

'some message text'|| crlf || -- Message body

'more message text'|| crlf

);

utl_smtp.Quit(v_mail_conn);

EXCEPTION

WHEN utl_smtp.Transient_Error OR utl_smtp.Permanent_Error then

raise_application_error(-20000, 'Unable to send mail: '||sqlerrm);

END;

/

Tamaño libre tablespace SELECT a.tablespace_name,

b.size_kb/1024 SIZE_MB,

a.free_kb/1024 FREE_MB,

Trunc((a.free_kb/b.size_kb) * 100) "FREE_%"

FROM (SELECT tablespace_name,

Trunc(Sum(bytes)/1024) free_kb

FROM dba_free_space

GROUP BY tablespace_name) a,

(SELECT tablespace_name,

Trunc(Sum(bytes)/1024) size_kb

FROM dba_data_files

GROUP BY tablespace_name) b

WHERE a.tablespace_name = b.tablespace_name

ORDER BY 4 desc

Page 10: Guia plsql breve

[ ] Valor Opcional, { } Valor obligatorio, < > Valor o Tipo, | Separador Opciones

Quién está conectado SELECT s.inst_id,

s.sid,

s.serial#,

p.spid,

s.username,

s.program

FROM gv$session s

JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id

WHERE s.type != 'BACKGROUND';

ALTER SYSTEM KILL SESSION 'sid,serial#' [{IMMEDIATE|POST_TRANSACTION}];

Parametrización y utilidades SQL/PLUS

Nombre Descripción

&parámetro Parámetro que se pregunta cada vez que se necesita

&&parámetro Parámetro que se pregunta solo la primera vez que se necesita

!, host Ejecuta comando del host

set sqlprompt ‘prompt’ Prompt de SQL/Plus

Set pagesize <línea> Número de Líneas por página

Set linesize <caracteres> Número de caracteres por línea

Define _editor=<editor> Editor del sistema (vi,notepad)

edit Entra en modo de edición

Show all Muestra todos los parametros

Set timing ON|OFF Muestra el tiempo de ejecución

Set serveroutput ON Muestra los resultados por consola