Vous êtes sur la page 1sur 73

Fundamentos de PL/SQL

Este curso introduce y explica al estudiante los beneficios del


lenguaje PL/SQL. Los participantes aprendern a crear bloques
de cdigo de aplicacin de PL/SQL que podrn ser utilizados y
compartidos en multiples formas, reportes y aplicaciones de
gestin de datos. Se explicar como crear bloques de PL/SQL
annimos, procedimientos y funciones almacenados en base de
datos. Los participantes aprendern acerca de cmo declarar
identificadores y atrapar excepciones. Las demostraciones y
ejercicios prcticos permitirn reforzar los conceptos
fundamentales.

1
Fundamentos de PL/SQL Contenido

Introduccin a PL/SQL
PL/SQL: Procedural Language/Structured Queryx Language: Es
un lenguaje portable, de alto desempeo, extensin de SQL
realizado por Oracle.

Disponible en la base de datos Oracle (desde la versin 7),


TimesTen y DB2.

Soporta DML, DDL, orientacin por objetos.

2
Fundamentos de PL/SQL Contenido

Introduccin a PL/SQL
Generalidades de PL/SQL
Beneficios de utilizar subprogramas de PL/SQL

Tipos de bloques PL/SQL

Crear un bloque annimo simple en PL/SQL

Generar texto de salida desde un bloque de PL/SQL

3
Fundamentos de PL/SQL Contenido

Identificadores en PL/SQL
Listar los diferentes tipos de identificadores de un subprograma
PL/SQL
Uso de la seccin de declaracin para definir identificadores

Uso de variables para almacenar datos

El tipo de dato %TYPE

Qu son las variables Bind?

Secuencias en expresiones PL/SQL.

4
Fundamentos de PL/SQL Contenido

Escritura de sentencias ejecutables


Sintaxis de los bloques de PL/SQL bsicos
Comentar segmentos de cdigo

Uso de funciones en PL/SQL

Conversin de tipos de datos.

Bloques anidados

Operadores en PL/SQL

5
Fundamentos de PL/SQL Contenido

Interaccin con el servidor Oracle


Invocar sentencias SELECT en bloques PL/SQL para la
recuperacin de datos.
Manipulacin de datos en el servidor utilizando PL/SQL

Concepto de Cursor SQL

Uso de los atributos del Cursor PL/SQL para obtener

retroalimentacin acerca de DML


Salvar y descartar transacciones.

6
Fundamentos de PL/SQL Contenido

Estructuras de Control
Procesamiento condicional utilizando sentencias IF
Procesamiento condicional utilizando sentencias CASE

Uso de sentencias Loop simples

Uso de sentencias While simples

Uso de la sentencia For

Descripcin de la sentencia Continue

7
Fundamentos de PL/SQL Contenido

Tipos de datos compuestos


Uso de registros PL/SQL
Uso del atributo %ROWTYPE

Insercin y actualizacin con registros PL/SQL

Arreglos asociativos (Tablas INDEX BY)

Examinar los mtodos de tabla INDEX BY

Uso de tablas de registros INDEX BY

8
Fundamentos de PL/SQL Contenido

Cursores explcitos
Qu son los cursores explcitos?
Declarar el Cursor

Abrir el Cursor

Recuperar datos del Cursor

Cerrar el Cursor

Ciclo de Cursor FOR

Atributos de los cursores explcitos

Clusulas FOR UPDATE y WHERE CURRENT

9
Fundamentos de PL/SQL Contenido

Manejo de excepciones
Entendiendo las excepciones
Manejo de excepciones con PL/SQL

Atrapar errores predefinidos por el servidor Oracle

Atrapar errores no predefinidos por el Servidor Oracle

Atrapar excepciones definidas por el usuario

Propagacin de excepciones

Procedimiento RAISE_APPLICATION_ERROR

10
Fundamentos de PL/SQL Contenido

Procedimientos y funciones almacenadas


Entendiendo las funciones y procedimientos almancenados
Diferenciando entre bloques annimos y subprogramas.

Creacin de un Procedimiento Simple

Creacin de un Procedimiento simple con parmetro IN

Creacin de una funcin Simple

Ejecutando un Procedimiento Simple

Ejecutando una Funcin Simple

11
Introduccin a PL/SQL
Generalidades de PL/SQL

Independientemente del front-end se puede utilizar PL/SQL


embebido en el servidor de base de datos para encapsular reglas
lgicas y de negocio relativamente complejas.

Se puede utilizar en triggers para reforzar la integridad


referencial, hacer log de las transacciones, mejorar el nivel de
seguridad de los datos.

Se puede almacenar en funciones y procedimientos en la base


de datos.

Es independiente de la plataforma.
12
Introduccin a PL/SQL

Beneficios de utilizar subprogramas de PL/SQL

Alta integracin con SQL


Permite utilizar todas las sentencias de DML, control de

cursores y transacciones de control.


Soporta completamente los tipos de datos SQL

Permite ejecutar una sentencia SQL y procesar el resultado fila

por fila.
Soporta SQL esttico y dinmico

13
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL
Alto desempeo
Enviar bloques de sentencias SQL al servidor de base de datos.

Reutilizacin de sentencias SQL.

Los subprogramas son almacenados como cdigo ejecutable,

se ejecutan en la base de datos. Pueden ser compartidos por los


usuarios.
Optimizador de PL/SQL.

14
Introduccin a PL/SQL

Beneficios de utilizar subprogramas de PL/SQL

Incrementa la productividad
Cdigo compacto para manipular datos.

Puede consultar, transformar y actualizar datos en la base de

datos.
Presente en multiples herramientas: Forms, Reports, Java.

Portabilidad
Se puede ejecutar en cualquier sistema operativo y plataforma

en que corra Oracle DB

15
Introduccin a PL/SQL

Beneficios de utilizar subprogramas de PL/SQL

Escalabilidad
Los subprogramas permiten centralizar en la base de datos el

procesamiento de la aplicacin.
Las utilidades de memoria compartida permiten soportar miles

de usuarios concurrentes.

Manejabilidad
El codigo se centraliza en BD en vez del cliente.

Se puede cambiar el cdigo sin tener que cambiar la aplicacin

que lo invoca.

16
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL

17
Introduccin a PL/SQL

Beneficios de utilizar subprogramas de PL/SQL

Soporta orientacin por objetos


Tipos de datos abstractos: una estructura de datos y los

subprogramas que los manipulan.


Tipos de datos creados por el usuario que pueden ser

almacenados en tablas y usados como variables PL/SQL

Desarrollo de aplicaciones WEB


Generar pginas WEB directamente desde la BD.

Invocar procedimientos almacenados desde una pgina web.

18
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL

Desarrollo de pginas web dinmicas.


PL/SQL Server Pages (PSP). Incluir scripts de PL/SQL en HTML

que son ejecutados cuando la pgina es invocada.


Un script puede aceptar parmetros, consultar o actualizar la

base de datos.

19
Introduccin a PL/SQL
Beneficios de utilizar subprogramas de PL/SQL

Acceso a paquetes predefinidos


APIs que se pueden invocar desde PL/SQL para varias tareas

utiles:
DBMS_ALERT: Uso de triggers

DBMS_FILE: Escritura y lectura de archivos de texto en el

sistema operativo.
UTL_HTTP: Para llamados HTTP

DBMS_OUTPUT: generar salida desde bloques PL/SQL y

subprogramas.
DBMS_PIPE: Comunicacin de dos hilos de ejecucin.

20
Glosario
Palabra reservada (keyword). Es una palabra que el lenguaje
reconoce como propia. Ej. BEGIN, END, IF, RETURN. Ver
V$RESERVED_WORDS
Identificador. Un nombre para algo tal como una variable, un programa
almacenado. Por ejemplo: salario, libro2, balance_entrante.
Tipo de dato Un nombre para una clase de valor. Por
ejemplo:NUMBER, DATE, VARCHAR2
Variable Un contenedor con identificador y tipo de dato para
almacenar informacin temporalmente.
Declaracin, seccin de declaracin. Declarar una variable significa
nombrarla y definir su tipo, se hace en la seccin de declaracin.

21
Glosario
String (cadena) Una cantidad textual de caracteres, cero o ms
de ellos. Delimitados por comilla sencilla, se almacenan en
variables de tipo caracter, varchar2, por ejemplo.
NULL Un valor especial que representa la ausencia de un valor
real, indefinido o desconocido.
Booleano Una clase de valor para trabajar con los valores falso y
verdadero, disponible en PL/SQL y no en SQL.
Literal Valores explicitos que aparecen en un programa. Pueden
ser numricos o caracteres: 5.56720, 'Valor literal'.
Expresin Una formula que evalua algn valor, se base en otros
valores: a + b, fecha_hoy - fecha_naci

22
Glosario
Operador Una palabra o signo utilizada por el lenguaje para
representar una operacin lgica, matemtica u otra funcin.
Ejemplo: +, -, AND, BETWEEN
Sentencia Una instruccin de programa compuesta de valores
literales, palabras clave, identificadores, operadores y
terminadores.
Terminador Un operador especial que se debe colocar al final de
cada sentencia o expresin. En PL/SQL es punto y coma (;).
Bloque Una secuencia de cdigo que incluye sentencias
ejecutables. Un programa de PL/SQL involucra uno o varios
bloques, cada uno con sus sentencias.

23
Introduccin a PL/SQL

Tipos de Bloques

Un bloque PL/SQL es la unidad bsica de cdigo fuente. Agrupa


sentencias y declaraciones relacionadas.

Un bloque PL/SQL es definido por las palabras clave DECLARE,


BEGIN, EXCEPTION y END.

Las declaraciones son locales al bloque y dejan de existir al


finalizar la ejecucin del bloque.

Los bloques pueden ser anidados, un bloque como tal es una


sentencia ejecutable y puede aparecer dentro de otro bloque.

24
Introduccin a PL/SQL
Tipos de Bloques

<< label >> (opcional)


DECLARE -- Parte declarativa (opcional)
-- Declaracin de tipos, variables y subprogramas locales.

BEGIN -- Parte ejecutable (requerida)


-- Sentencias (puede utilizar items de la parte declarativa)

[EXCEPTION Parte de manejo de excepciones (opcional)


-- Manejadores de excepciones para las excepciones
generadas en la parte ejecutable]
END;

25
Introduccin a PL/SQL

Tipos de Bloques
Annimo
El bloque annimo es ejecutado una sola vez.

No se almacena en la base de datos.

Se llama annimo incluso si tiene label.

Es compilado y cargado en memoria cada vez que se ejecuta, su compilacin

tiene tres etapas:


1.Chequeo de sintxis. Se verifica la sintxis PL/SQL y se genera el rbol de
anlisis (parse tree)
2.Cheque semntico. Se verifican los tipos de datos, procesamiento adicional
en el rbol de anlisis.
3.Generacin de cdigo.
Un bloque annimo es una sentencia SQL.

26
Introduccin a PL/SQL
Tipos de Bloques
Subprogramas

Un subprograma PL/SQL es un bloque de PL/SQL que puede ser invocado


repetidamente . Si el subprograma tiene parmetros sus valores pueden
variar con cada llamado.

PL/SQL tiene dos tipos de subprogramas: procedimientos y funciones. Los


subprogramas, a su vez, son parte importante de un tipo de caracterstica de
mantenibilidad del SW: los paquetes y los tipos de datos abstractos.

Un subprograma creado dentro de un bloque de PL/SQL es un subprograma


anidado.

PL/SQL permite invocar programas externos escritos en Java o lenguaje C.

27
Introduccin a PL/SQL

Tipos de Bloques
Paquetes (packages)

Es un objeto del esquema que agrupa tipos PL/SQL, variables, constantes,


subprogramas, cursores y excepciones.

Es compilado y almacenado en la base de datos.

Se pueden escribir paquetes de aplicacin propios y utilizar los paquetes


suministrados por Oracle.

28
Introduccin a PL/SQL

Tipos de Bloques
Disparadores (Triggers)

Es una unidad de PL/SQL con nombre, que se almacena en la base de datos


y se ejecuta en respuesta a un evento que ocurre en la base de datos.

Se especifica el evento que dispara el trigger, si el trigger se ejecuta antes o


despus del evento y si el trigger se ejecuta una vez para el evento o una vez
para cada fila afectada.

29
Introduccin a PL/SQL
Crear un bloque de PL/SQL Annimo
Un bloque de PL/SQL annimo debe tener una parte ejecutable: un grupo de
sentencias PL/SQL incluidas en un BEGIN END

SQL> set serveroutput on;

SQL> begin
2 dbms_output.put_line('Hello world!');
3 end;
4 /
Hello world!

PL/SQL procedure successfully completed.

** set serveroutput on hace que dbms_output.put_line() funcione.

30
Introduccin a PL/SQL

Crear un bloque de PL/SQL Annimo


Ejemplo de un bloque PL/SQL annimo sin seccin de declaracin ni de
excepcin:

31
Introduccin a PL/SQL

Crear un bloque de PL/SQL Annimo


Ejemplo de un bloque PL/SQL annimo contenido en un procedimiento:

32
Introduccin a PL/SQL

Crear un bloque de PL/SQL Annimo


Ejemplo de un bloque PL/SQL annimo con seccin de declaracin pero sin
manejo de excepciones:

33
Introduccin a PL/SQL
Crear un bloque de PL/SQL Annimo
Ejemplo de un bloque PL/SQL annimo con seccin de declaracin, ejecucin
y manejo de excepciones:

34
Introduccin a PL/SQL

Crear un bloque de PL/SQL Annimo


Ejemplo de un bloque PL/SQL annimo con seccin de declaracin, ejecucin
y manejo de excepciones:

declare
myNumber number := 1;
begin
myNumber := 1 + 1;
dbms_output.put_line( '1 + 1 = ' || to_char( myNumber ) || '!' );
exception
when others then
dbms_output.put_line( 'We encountered an exception! '|| SQLERRM );
end;
/

35
Introduccin a PL/SQL

Generar texto de salida


DBMS_OUTPUT. Permite generar mensajes de salida desde
procedimientos almancenados, triggers, y paquetes. Se utiliza
para depurar informacin de PL/SQL.

Los procedimientos PUT y PUT_LINE permiten poner


informacin que ser leda por otros procedimientos, triggers o
paquetes con GET o GET_LINES. SQL*PLUS llama a
GET_LINES cuando termina la ejecucin del bloque.

El tamao mximo de lnea es 32767 bytes. El tamao por


default del buffer es de 20,000 bytes, su tamao mnimo es 2,000
bytes y el mximo es ilimitado.
36
Introduccin a PL/SQL

Generar texto de salida


UTL_FILE. Permite a los programas PL/SQL leer y escribir
archivos de texto en el sistema operativo.

DECLARE
V1 VARCHAR2(32767);
F1 UTL_FILE.FILE_TYPE;
BEGIN
-- In this example MAX_LINESIZE is less than GET_LINE's length request
-- so the number of bytes returned will be 256 or less if a line terminator is seen.
F1 := UTL_FILE.FOPEN('USER_DIR','u12345.tmp','R',256);
UTL_FILE.GET_LINE(F1,V1,32767);
UTL_FILE.FCLOSE(F1);
END;

37
Introduccin a PL/SQL
Generar texto de salida
UTL_SMTP. Envio de email con el protocolo SMTP

DECLARE
c utl_smtp.connection;
BEGIN
c := utl_smtp.open_connection(
host => 'smtp.example.com',
port => 25,
wallet_path => 'file:/oracle/wallets/smtp_wallet',
wallet_password => 'password',
secure_connection_before_smtp => FALSE);
UTL_SMTP.STARTTLS(c);
UTL_SMTP.AUTH(
c => c,
username => 'scott',
password => 'password'
schemes => utl_smtp.all_schemes);
END; 38
Introduccin a PL/SQL
Generar texto de salida
UTL_HTTP. Permite hacer llamados a HTTP y acceder datos en
internet con llamados a HTTP.

SET SERVEROUTPUT ON SIZE 40000

DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
value VARCHAR2(1024);
BEGIN
UTL_HTTP.SET_PROXY('proxy.my-company.com', 'corp.my-company.com');
req := UTL_HTTP.BEGIN_REQUEST('http://www-hr.corp.my-company.com');
UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
resp := UTL_HTTP.GET_RESPONSE(req);
LOOP
UTL_HTTP.READ_LINE(resp, value, TRUE);
DBMS_OUTPUT.PUT_LINE(value);
END LOOP;
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN 39
UTL_HTTP.END_RESPONSE(resp);
END;
Introduccin a PL/SQL

Ejercicio 1
CREATE TABLE myTable(
e INTEGER,
f INTEGER
);

DELETE FROM myTable;

INSERT INTO myTable VALUES(1, 3);

INSERT INTO myTable VALUES(2, 4);

SELECT * FROM myTable;


40
Introduccin a PL/SQL

Ejercicio 1 (cont.)
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM myTable WHERE e > 1;
INSERT INTO myTable VALUES(b,a);
END;
/

SELECT * FROM myTable;

Drop table myTable;


41
Introduccin a PL/SQL

Ejercicio 2
DECLARE
contador_cientos NUMBER(1,-2);
BEGIN
contador_cientos := 100;
LOOP
DBMS_OUTPUT.PUT_LINE(contador_cientos);
contador_cientos := contador_cientos + 100;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Esto es lo ms alto posible');
END;
/
42
Identificadores PL/SQL

Conjunto de caracteres y unidades lexicas


Los programas en PL/SQL son escritos como lneas de texto
usando los siguientes caracteres:
Letras maysculas y minsculas A..Z y a..z

Nmerales 0..9

Simbolos ( ) + - * / < > = ! ~ ^ ; : . ' @ % , " # $ & _ | { } ? [ ]

Tabuladores, espacios y saltos de carros (CR)

Las palabras clave PL/SQL no son sensibles a Maysculas /


Minsculas, entonces son equivalentes con excepcin de los
strings literales.

43
Identificadores PL/SQL

Conjunto de caracteres y unidades lxicas


Una lnea de programa PL/SQL contiene grupos de caracteres
conocidos como unidades lxicas:
Delimitadores

Identificadores, incluyendo palabras reservadas.

Literales

Comentarios

44
Identificadores PL/SQL
Delimitadores

+ Operador de suma := Operador de asignacin


% Indicador de atributo => Operador de asociacin
' Delimitador de cadena de caract. || Operador de concatenacin
. Selector de componente ** Operador de exponenciacin
/ Operador de divisin << Delimitador de label (comienzo)
( Delimitador de expresin o lista >> Delimitador de label (final)
) Delimitador de expresin o lista /* Delimitador de comentario multilinea (begin)
: Indicador de variable host */ Delimitador de comentario multilinea (fin)
, Separador de item .. Operador de rango
* Operador de multiplicacin <> Operador relacional
" Delimitador de ident. textual != Operador relacional
= Operador relacional ~= Operador relacional
< Operador relacional ^= Operador relacional
> Operador relacional <= Operador relacional
@ Operador de acceso remoto >= Operador relacional
; Terminador de sentencia -- Indicador de comentario linea simple
- Operador de resta/negacin

45
Identificadores PL/SQL
Identificadores

Para nombrar items de programa y unidades como constantes,


variables, excepciones, cursores, variables de cursor, subprogramas
y paquetes.

Longitud mnimo 1 caracter mximo 30 caracteres.

Deben comenzar por letra, los posteriores cualquiera de letra,


nmero, $, underscore, o #.

46
Identificadores PL/SQL
Identificadores

Vlidos:

X
t2
phone#
credit_limit
LastName
oracle$number
money$$$tree
SN##
try_again_

47
Identificadores PL/SQL
Identificadores

NO Vlidos:

mine&yours -- ampersand (&) no es permitido


debit-amount guin no es permitido
on/off -- slash (/) no es permitido
user id -- space no es permitido

48
Identificadores PL/SQL
Identificadores

PL/SQL no diferencia mayscula/minscula. Los siguientes son


equivalentes:

lastname
LastName
LASTNAME

49
Identificadores PL/SQL
Literales

Numricos
Enteros: 030 6 -14 0 +32767
Reales: 6.6667 0.0 -12.0 3.14159 +8300.00 .5 25.
Notacin cientfica: 5E3 = 5 * 10**3 = 5 * 1000 = 5000

5E-3 = 5 * 10**-3 = 5 * 0.001 = 0.005


Caracter: 'Z' '%' '7' ' ' 'z' '('
String:
'Hello, world!'

'XYZ Corporation'

'10-NOV-91'

'He said "Life is like licking honey from a thorn."'

'$1,000,000'

50
Identificadores PL/SQL
Literales

Para representar una comilla dentro de una cadena se escriben


dos comillas sencillas: 'I''m a string, you''re a string.'
Literales booleanos: TRUE, FALSE, NULL.

51
Identificadores PL/SQL
Literales
Fecha y hora
DECLARE
d1 DATE := DATE '1998-12-25';
t1 TIMESTAMP := TIMESTAMP '1997-10-22 13:01:01';

t2 TIMESTAMP WITH TIME ZONE :=


TIMESTAMP '1997-01-31 09:26:56.66 +02:00';

-- Tres aos y dos meses


i1 INTERVAL YEAR TO MONTH := INTERVAL '3-2' YEAR TO MONTH;

-- Cinco das, 4 horas, tres minuos, dos segundos y 1/100 seconds


i2 INTERVAL DAY TO SECOND :=
INTERVAL '5 04:03:02.01' DAY TO SECOND;
BEGIN
NULL;
END;
/
52
Identificadores PL/SQL
Declaraciones

Un programa PL/SQL almacena valores en variables y constantes.


El valor de una variable puede cambiar durante la ejecucin del
programa, no as el valor de la constante.

Las variables y constantes se declaran en la seccin de declaracin


del bloque de PL/SQL.

Una declaracin reserva espacio en memoria para un valor, define el


tipo de dato y nombra la ubicacin en memoria para referencia.

53
Identificadores PL/SQL
Variables
DECLARE
birthday DATE;
emp_count SMALLINT := 0;
pi REAL := 3.14159;
radius REAL := 1;
area REAL := pi * radius**2;
BEGIN
NULL;
END;
/

PL/SQL procedure successfully completed.

Las variables son inicializadas en cada ejecucin del bloque o


subprograma. Su valor por defecto es null. 54
Identificadores PL/SQL
Constantes
DECLARE
credit_limit CONSTANT REAL := 5000.00;
max_days_in_year CONSTANT INTEGER := 366;
urban_legend CONSTANT BOOLEAN := FALSE;
BEGIN
NULL;
END;
/

PL/SQL procedure successfully completed.

Una constante se debe inicializar en su declaracin. Son


inicializadas cada vez que se ejecuta el bloque o subprograma.
55
Identificadores PL/SQL
DEFAULT
DECLARE
blood_type CHAR DEFAULT 'O'; -- Igual a blood_type CHAR := 'O';
hours_worked INTEGER DEFAULT 40; -- Typical value
employee_count INTEGER := 0; -- No typical value
BEGIN
NULL;
END;
/

Se puede utilizar DEFAULT para inicializar variables en lugar del


operador de asignacin.

Tambin se puede usar para inicializar parametros de


subprogramas, de cursor y campos en un tipo de registro de
usuario.
56
Identificadores PL/SQL
NOT NULL
DECLARE
acct_id INTEGER(4) NOT NULL := 9999;
a NATURALN := 9999;
b POSITIVEN := 9999;
c SIMPLE_INTEGER := 9999;
BEGIN
NULL;
END;
/

Evita que se asigne un valor nulo a la variable.

Los subtipos NATURALN, POSITIVEN, SIMPLE_INTEGER estn


predefinidos como NOT NULL.

57
Identificadores PL/SQL
Tipos de datos escalares

Cada constante, variable y parmetro tiene un tipo de dato que


determina su almacenamiento, restricciones, rango vlido de valores
y operaciones vlidas.

PL/SQL provee varios tipos de datos predefinidos y permite que el


usuario definas los suyos.

58
Identificadores PL/SQL
Tipos de datos escalares
Categoras de tipos de datos pre-definidos

Categoria Descripcin
Escalar Valores simples sin componentes internos
Compuesto Items de datos que contienen componentes internos que
pueden ser accedidos individualmente. (Registros y
colecciones)
Referencia Apuntadores a otros items de datos. Cursores por
referencia
Large Object (LOB) Apuntadores a objetos grandes que se almacenan por
separado de otros items de datos, pueden ser textos,
grficos, imgenes, videos, sonidos.

59
Identificadores PL/SQL
Tipos de datos escalares
Tipos de datos escalares pre-definidos

Categoria Descripcin
Numrico Valores numricos sobre los cuales se pueden realizar
operaciones aritmticas.
Caracter Valores alfanumericos que representan caracteres
sencillos o cadenas de caracteres, los cuales pueden ser
manipulados.
BOOLEANO Valores lgicos sobre los cuales se pueden hacer
operaciones lgicas.
Fecha y hora Fechas y horas que pueden ser manipulados.
Intervalos Intervalos de tiempo que pueden ser manipulados

60
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE

Permite declarar una variable, constante, tipo o parmetro para que


sea del mismo tipo de una variable, campo, registro, tabla anidada, o
columna de base datos, declarada con anterioridad.

Si el item referenciado cambia, la variable cambia automticamente.


Por ejemplo, si cambia la longitud de la columna no hay necesidad
de modificar el programa.

61
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
DECLARE
credit PLS_INTEGER RANGE 1000..25000;
debit credit%TYPE; -- inherits data type
name VARCHAR2(20) := 'JoHn SmItH';
upper_name name%TYPE; -- inherits data type
lower_name name%TYPE; -- inherits data type
init_name name%TYPE; -- inherits data type
BEGIN
DBMS_OUTPUT.PUT_LINE ('name: ' || name);
DBMS_OUTPUT.PUT_LINE ('upper_name: ' || UPPER(name));
DBMS_OUTPUT.PUT_LINE ('lower_name: ' || LOWER(name));
DBMS_OUTPUT.PUT_LINE ('init_name: ' || INITCAP(name));
END;
/
name: JoHn SmItH
upper_name: JOHN SMITH
lower_name: john smith
init_name: John Smith
62
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
DECLARE
name VARCHAR2(20) NOT NULL := 'JoHn SmItH';
same_name name%TYPE;
BEGIN
NULL;
END;
/
same_name name%TYPE;
*
ERROR at line 3:
ORA-06550: line 3, column 15:
PLS-00218: a variable declared NOT NULL must have an initialization assignment

63
Identificadores PL/SQL
USO DEL ATRIBUTO %TYPE
DECLARE
name VARCHAR2(20) NOT NULL := 'JoHn SmItH';
upper_name name%TYPE := UPPER(name);
lower_name name%TYPE := LOWER(name);
init_name name%TYPE := INITCAP(name);
BEGIN
DBMS_OUTPUT.PUT_LINE('name: ' || name);
DBMS_OUTPUT.PUT_LINE('upper_name: ' || upper_name);
DBMS_OUTPUT.PUT_LINE('lower_name: ' || lower_name);
DBMS_OUTPUT.PUT_LINE('init_name: ' || init_name);
END;
/
name: JoHn SmItH
upper_name: JOHN SMITH
lower_name: john smith
init_name: John Smith
64
Identificadores PL/SQL
Ejercicio 3. Creacin de un bloque PL/SQL simple

1.Declare variables para almacenar el nombre, apellidos, direccin


y ciudad de residencia.
2.Llene las variables con un SELECT de empleado para los
empleados integrales activos.
3.Los nombre y apellidos deben ir con Initcap. Si la direccin es
nula ponga el texto 'Direccion Desconocida'
4.Muestre los datos utilizando DBMS_OUTPUT en el siguiente
formato:
Nombre
Apellidos
Direccin
Ciudad
=========

65
Identificadores PL/SQL
Variables Bind
CONN sys/password AS SYSDBA

ALTER SYSTEM FLUSH SHARED_POOL;

DECLARE
l_dummy dual.dummy%TYPE;
BEGIN
FOR i IN 1 .. 10 LOOP
BEGIN
EXECUTE IMMEDIATE 'SELECT dummy FROM dual WHERE dummy = '''
|| TO_CHAR(i) || ''''
INTO l_dummy;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
END LOOP;
END;
/ 66
Identificadores PL/SQL
Variables Bind
SELECT sn.name, ms.value
FROM v$mystat ms, v$statname sn
WHERE ms.statistic# = sn.statistic#
AND sn.name = 'parse time cpu';

COLUMN sql_text FORMAT A60


SELECT sql_text,
executions
FROM v$sql
WHERE INSTR(sql_text, 'SELECT dummy FROM dual WHERE dummy') > 0
AND INSTR(sql_text, 'sql_text') = 0
AND INSTR(sql_text, 'DECLARE') = 0
ORDER BY sql_text;

67
Identificadores PL/SQL
Variables Bind
ALTER SYSTEM FLUSH SHARED_POOL;

CONN sys/password AS SYSDBA

DECLARE
l_dummy dual.dummy%TYPE;
BEGIN
FOR i IN 1 .. 10 LOOP
BEGIN
EXECUTE IMMEDIATE 'SELECT dummy FROM dual WHERE
dummy = TO_CHAR(:dummy)'
INTO l_dummy USING i;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
END LOOP;
END; 68
/
Identificadores PL/SQL
Variables Bind
SELECT sn.name, ms.value
FROM v$mystat ms, v$statname sn
WHERE ms.statistic# = sn.statistic#
AND sn.name = 'parse time cpu';

COLUMN sql_text FORMAT A60


SELECT sql_text,
executions
FROM v$sql
WHERE INSTR(sql_text, 'SELECT dummy FROM dual WHERE dummy') > 0
AND INSTR(sql_text, 'sql_text') = 0
AND INSTR(sql_text, 'DECLARE') = 0
ORDER BY sql_text;

69
Identificadores PL/SQL
Variables Bind
alter system flush shared_pool;
set serveroutput on;

declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000
loop
open l_rc for
'select object_name
from all_objects
where object_id = ' || i;
fetch l_rc into l_dummy;
close l_rc;
-- dbms_output.put_line(l_dummy);
end loop;
dbms_output.put_line
(round((dbms_utility.get_time-l_start)/100, 2) ||
' Seconds...' );
end; 70
/
Identificadores PL/SQL
Variables Bind
alter system flush shared_pool;
set serveroutput on;

declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for i in 1 .. 1000
loop
open l_rc for
'select object_name
from all_objects
where object_id = :x'
using i;
fetch l_rc into l_dummy;
close l_rc;
-- dbms_output.put_line(l_dummy);
end loop;
dbms_output.put_line
(round((dbms_utility.get_time-l_start)/100, 2) ||
' Seconds...' ); 71
end;
/
Identificadores PL/SQL
Secuencias
CREATE SEQUENCE s;

DECLARE
n PLS_INTEGER;
BEGIN
n := s.NEXTVAL;
DBMS_OUTPUT.PUT_LINE('Nextval=' || TO_CHAR(n));
END;
/

DECLARE
n PLS_INTEGER := s.NEXTVAL;
BEGIN
DBMS_OUTPUT.PUT_LINE('Nextval=' || TO_CHAR(n));
END;
/

BEGIN
DBMS_OUTPUT.PUT_LINE('Nextval=' || TO_CHAR(s.NEXTVAL));
END;
/

72
Identificadores PL/SQL
Secuencias
BEGIN
IF s.NEXTVAL > 3 THEN
DBMS_OUTPUT.PUT_LINE('Currval=' || TO_CHAR(s.CURRVAL));
END IF;
END;
/

ALTER SESSION SET SQL_TRACE = TRUE;

DECLARE
n PLS_INTEGER;
BEGIN
FOR i IN 1 .. 10000 LOOP
n := s.NEXTVAL;
END LOOP;
FOR i IN 1 .. 10000 LOOP
SELECT s.NEXTVAL AS nval INTO n FROM dual;
END LOOP;
END;
/

ALTER SESSION SET SQL_TRACE = FALSE;


73

Vous aimerez peut-être aussi