SlideShare una empresa de Scribd logo
1 de 10
Descargar para leer sin conexión
Gúia Básica PL/SQL
para DBAs
Juan Sánchez – jsancheznav@gmail.com
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=sys
date
@ 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<>sys
date
% 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(lon
g)
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;
/
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
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
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
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
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
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
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
[ ]  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) := 'oracle@mycompany.com';
v_Recipient VARCHAR2(80) := 'test@mycompany.com';
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
[ ]  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

Más contenido relacionado

La actualidad más candente

Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)José Toro
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)José Toro
 
Commit&rollback
Commit&rollbackCommit&rollback
Commit&rollbackArchCHUZ
 
Triggers o disparadores en MySQL
Triggers o disparadores en MySQL Triggers o disparadores en MySQL
Triggers o disparadores en MySQL Jair Ospino Ardila
 
Forms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresForms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresEdwin Romero
 
Estructuras algoritnicas de control
Estructuras algoritnicas de controlEstructuras algoritnicas de control
Estructuras algoritnicas de controlMiguel Martinez
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejerciciostestgrupocomex
 
Sesión11 - Paquetes (Oracle)
Sesión11 - Paquetes (Oracle)Sesión11 - Paquetes (Oracle)
Sesión11 - Paquetes (Oracle)José Toro
 
Triggers
TriggersTriggers
Triggersbdatos
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql ServerCorfapo
 
Triggers o disparadores
Triggers o disparadoresTriggers o disparadores
Triggers o disparadoresPablo Jose
 
LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.SILVA19_PAMELA
 
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM   TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM Kamisutra
 
Práctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScriptPráctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScriptjubacalo
 
Disparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My SqlDisparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My Sqlguest9c891000
 

La actualidad más candente (20)

Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)
 
Commit&rollback
Commit&rollbackCommit&rollback
Commit&rollback
 
Tutorial Sql
Tutorial SqlTutorial Sql
Tutorial Sql
 
Triggers o disparadores en MySQL
Triggers o disparadores en MySQL Triggers o disparadores en MySQL
Triggers o disparadores en MySQL
 
Disparadores
DisparadoresDisparadores
Disparadores
 
Forms 10g procedimientos y cursores
Forms 10g procedimientos y cursoresForms 10g procedimientos y cursores
Forms 10g procedimientos y cursores
 
Estructuras algoritnicas de control
Estructuras algoritnicas de controlEstructuras algoritnicas de control
Estructuras algoritnicas de control
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejercicios
 
Comandos java
Comandos javaComandos java
Comandos java
 
Sesión11 - Paquetes (Oracle)
Sesión11 - Paquetes (Oracle)Sesión11 - Paquetes (Oracle)
Sesión11 - Paquetes (Oracle)
 
Triggers
TriggersTriggers
Triggers
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
P1C5 Lenguaje de Expresiones
P1C5 Lenguaje de ExpresionesP1C5 Lenguaje de Expresiones
P1C5 Lenguaje de Expresiones
 
Triggers o disparadores
Triggers o disparadoresTriggers o disparadores
Triggers o disparadores
 
LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.
 
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM   TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
 
Práctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScriptPráctica Completa en Flash – ActionScript
Práctica Completa en Flash – ActionScript
 
Disparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My SqlDisparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My Sql
 
Ahorcado
AhorcadoAhorcado
Ahorcado
 

Similar a Guia plsql breve

Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScripttovi27
 
Scjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow ControlScjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow ControlJose Selman
 
Curso Básico de Pl Sql Oracle
Curso Básico de Pl Sql OracleCurso Básico de Pl Sql Oracle
Curso Básico de Pl Sql Oracleluisguil
 
Estructuras De Control
Estructuras De ControlEstructuras De Control
Estructuras De ControlUPS
 
Execute immediate
Execute immediateExecute immediate
Execute immediatejcarrey
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggersLuis Jherry
 
Programación con C/AL para Microsoft Business Solutions Navision
Programación con C/AL para Microsoft Business Solutions NavisionProgramación con C/AL para Microsoft Business Solutions Navision
Programación con C/AL para Microsoft Business Solutions Navisionpabloesp
 
Disparadores - base de datos
Disparadores - base de datosDisparadores - base de datos
Disparadores - base de datosAdriana Becerra
 
GUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALGUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALmakac0 makac0
 
Comandos de Raptor,C# y Java
Comandos de Raptor,C# y JavaComandos de Raptor,C# y Java
Comandos de Raptor,C# y JavaAna Ruth G H
 
5 Vb.Net
5 Vb.Net5 Vb.Net
5 Vb.Neterinel
 

Similar a Guia plsql breve (20)

Expo base
Expo baseExpo base
Expo base
 
Fundamentos de SELECT SQL
Fundamentos de SELECT SQLFundamentos de SELECT SQL
Fundamentos de SELECT SQL
 
Tipos basicos de java
Tipos basicos de javaTipos basicos de java
Tipos basicos de java
 
02_Sintaxis_de_Java.ppt
02_Sintaxis_de_Java.ppt02_Sintaxis_de_Java.ppt
02_Sintaxis_de_Java.ppt
 
Programacion Avanzada JavaScript
Programacion Avanzada JavaScriptProgramacion Avanzada JavaScript
Programacion Avanzada JavaScript
 
Scjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow ControlScjp Jug Section 2 Flow Control
Scjp Jug Section 2 Flow Control
 
Curso Básico de Pl Sql Oracle
Curso Básico de Pl Sql OracleCurso Básico de Pl Sql Oracle
Curso Básico de Pl Sql Oracle
 
Estructuras De Control
Estructuras De ControlEstructuras De Control
Estructuras De Control
 
Execute immediate
Execute immediateExecute immediate
Execute immediate
 
Funciones store proc_triggers
Funciones store proc_triggersFunciones store proc_triggers
Funciones store proc_triggers
 
Programación con C/AL para Microsoft Business Solutions Navision
Programación con C/AL para Microsoft Business Solutions NavisionProgramación con C/AL para Microsoft Business Solutions Navision
Programación con C/AL para Microsoft Business Solutions Navision
 
Ejercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sqlEjercicios resueltos de_pl-sql
Ejercicios resueltos de_pl-sql
 
Disparadores - base de datos
Disparadores - base de datosDisparadores - base de datos
Disparadores - base de datos
 
GUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALGUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/AL
 
Charla Mysql
Charla MysqlCharla Mysql
Charla Mysql
 
P1
P1P1
P1
 
Comandos de Raptor,C# y Java
Comandos de Raptor,C# y JavaComandos de Raptor,C# y Java
Comandos de Raptor,C# y Java
 
2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby2 Introducción al lenguaje Ruby
2 Introducción al lenguaje Ruby
 
Disparadores 1213820550525607-9
Disparadores 1213820550525607-9Disparadores 1213820550525607-9
Disparadores 1213820550525607-9
 
5 Vb.Net
5 Vb.Net5 Vb.Net
5 Vb.Net
 

Más de Juan Sánchez

Más de Juan Sánchez (6)

SUSE DHCPv6
SUSE DHCPv6 SUSE DHCPv6
SUSE DHCPv6
 
Compilación del Kernel
Compilación del KernelCompilación del Kernel
Compilación del Kernel
 
Linux Routing
Linux RoutingLinux Routing
Linux Routing
 
Oracle Tuning Opq
Oracle Tuning OpqOracle Tuning Opq
Oracle Tuning Opq
 
File System Management
File System ManagementFile System Management
File System Management
 
Bounding en Linux
Bounding en LinuxBounding en Linux
Bounding en Linux
 

Guia plsql breve

  • 1. Gúia Básica PL/SQL para DBAs Juan Sánchez – jsancheznav@gmail.com
  • 2. 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=sys date @ 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<>sys date % 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(lon g) 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; /
  • 3. 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
  • 4. 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 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. [ ]  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) := 'oracle@mycompany.com'; v_Recipient VARCHAR2(80) := 'test@mycompany.com'; 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
  • 10. [ ]  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