Está en la página 1de 28

LENGUAJE PL/SQL

Dado que SQL no se puede utilizar para implementar toda la lógica del negocio y la
funcionalidad que los usuarios necesitan para las aplicaciones; esto nos lleva a PL/SQL.
Es un lenguaje de programación usado para accesar bases de datos Oracle.
PL/SQL soportara todas las consultas, ya que la manipulación que usa es la misma que en SQL,
incluyendo nuevas características.
Está incorporado en un entorno de base de datos donde los programadores pueden construir
bloques PL/SQL para utilizarlos como procedimientos o funciones, o bien pueden escribir estos
bloques como partes de scripts SQL*Plus.
Combina el poder de manipular datos, con SQL, y la facilidad de procesar los mismos , como en
los modernos lenguajes de programación.
Es un lenguaje estructurado en bloques. Un bloque tiene 3 partes: Una sección de declaración,
una sección de ejecución y otra de manejo de excepciones.
Contiene ítems de programas como: cursores, subprogramas (procedimientos y funciones) y
paquetes.
VENTAJAS EN LA UTILIZACIÓN DE PL/SQL
Ciertamente, es posible crear aplicaciones sobre SQL y base de datos Oracle sin usar PL/SQL.
La utilización de PL/SQL para realizar operaciones específicas de bases de datos, en particular
la ejecución de sentencias SQL, ofrece varias ventajas, sin embargo, incluyendo una estrecha
integración con SQL, un mejor desempeño debido a la reducción del tráfico de red, y la
portabilidad (los programas PL/SQL se pueden ejecutar en cualquier instancia de una base de
datos de Oracle). Así, el código de la interfaz del usuario de muchas aplicaciones ejecuta tanto
sentencias SQL y bloques PL/SQL, para maximizar el rendimiento al tiempo que mejora la
capacidad de mantenimiento de esas aplicaciones.

CARACTERÍSTICAS:
 LENGUAJE ESTRUCTURADO EN BLOQUES.
Cada bloque tiene 3 partes;
Secciones para declarar variables, cursores, tipos, etc.
Sección para sentencias SQL y estructuras de control
Sección para el manejo de errores y excepciones

 DECLARACIÓN DE VARIABLES
Sintaxis:
Identificador [CONSTANT] Tipo_dato [NOT NULL] [ := | DEFAULT expresión];
Identificador: es el nombre de la variable
CONSTANT: restringe la variable con el propósito de que su valor no pueda cambiar;
las constantes deben ser inicializadas.
Tipo_dato: puede ser un escalar, compuesto, referenciado o LOB.
NOT NULL: restringe a la variable para que tenga un valor.
Expresión: es cualquier expresión PL /SQL que puede ser una expresión literal, otra
variable o una expresión que involucra operadores y funciones.
Reglas para los nombres de variables:
- Dos variables pueden tener el mismo nombre, si están en bloques diferentes.
- El nombre de la variable (identificador) no debería ser el mismo que el de una
columna de una tabla utilizada en el bloque.
 ASIGNACIÓN E INICIALIZACIÓN DE VARIABLES
ASIGNACIÓN:
identificador := expresión;
Identificador: es el nombre de la variable escalar
Expresión: puede ser una variable, literal o llamada a una función, pero no a una
columna de la base de datos.
INICIALIZACIÓN:
identificador tipo_dato := expresión;
identificador tipo_dato DEFAULT valor;
identificador tipo_dato NOT NULL := valor;
Las variables son inicializadas todo el tiempo en un bloque o subprograma. Por defecto
las variables son inicializadas con NULL.
DEFAULT: se puede usar la palabra clave default en lugar del operador de asignación.
NOT NULL: se usa para imponer la restricción NOT NULL, cuando la variable debe
contener un valor.

 TIPOS DE DATOS DE LAS VARIABLES

ESCALARES
COMPUESTOS
LOB
DE ENLACE (BIND)

 TIPOS DE DATOS ESCALARES: number[(precision, escala)],


char[(longitud_maxima)], varchar2(longitud_maxima), date, long, long_raw, boolean,
BINARY_INTEGER, PLS_INTEGER.
ATRIBUTO %TYPE
Permite declarar una variable basada en:
- Otras variables previamente declaradas.
- La definición de una columna de la base de datos.
Preceder de %TYPE por:
- La tabla y la columna de la base de datos.
- El nombre de la variable definida con anterioridad.
Ejemplo:
v_ename ernp.ename%TYPE;

VARIABLES BOOLEANAS
- A una variable Boolean sólo se le pueden asignar los valores: TRUE, FALSE o
NULL.
- Estas variables están conectadas por los operadores lógicos AND, OR y NOT.

 TIPOS DE DATOS COMPUESTOS


Tipos:
- REGISTROS PL/SQL
- TABLAS PL/SQL
Contienen componentes internos.
 REGISTROS PL/SQL
• Deben contener uno o más componentes de cualquier campo de tipo de datos
escalar, REGISTRO o TABLA PL/SQL.
• Son similares en estructura a los registros de un lenguaje de tercera generación.
• No son lo mismo que las filas de una tabla de base de datos.
• Tratan una colección de campos como una unidad lógica.
CREACIÓN DE UN REGISTRO PL/SQL
Sintaxis:
TYPE nombre_tipo_registro IS RECORD (declaración_campo [,
declaración_campo]…);
Donde declaración_campo significa:
nombre_campo {tipo_campo | variable%TYPE | tabla.columna%TYPE |
tabla%ROWTYPE} [[NOT NULL] {:= | DEFAULT} expresión]
Ejemplo:
Declarar un tipo de registro para almacenar el nombre, trabajo y sueldo de un
nuevo empleado.
TYPE tipo_registro_empleado IS RECORD
(ename emp.ename%TYPE,
job emp.job%TYPE,
sal NUMBER(7,2) DEFAULT 1000);
registro_empleado tipo_registro_empleado;
Los componentes individuales del registro se referenciarán de forma calificada; en este
ejemplo:
registro_empleado.ename, registro_empleado.sal, …

EL ATRIBUTO %ROWTYPE
• Declara una variable de registro de acuerdo con una colección de columnas de
una vista o tabla de base de datos.
• Preceder de %ROWTYPE con la tabla de base de datos.
• Los campos del registro toman sus nombres y tipos de datos de las columnas
de la tabla o la vista.
Ejemplo:
registro_empleado emp% ROWTYPE;

VENTAJAS DE LA UTILIZACIÓN DE %ROWTYPE


• El número y los tipos de datos de las columnas de la tabla pueden no ser
conocidos.
• El número y los tipos de datos de la columna de la tabla pueden cambiar en
el momento de la ejecución.
• Simplifica la programación al no tener que definir explícitamente los campos y tipos
del registro.
• Es útil para realizar recuperaciones de filas con la sentencia SELECT.
Ejemplo:
Declare una variable para almacenar la misma información sobre un departamento
que está almacenada en la tabla DEPT.
dept_record dept%ROWTYPE;
 TABLAS PL/SQL
• Cuentan con dos componentes:
– Tipo de datos de clave primaria BINARY_INTEGER.
– Columna de tipos de datos escalares o de registro.
• Aumentan dinámicamente porque no tienen restricciones.
• Se almacenan en memoria.
CREACIÓN DE TABLAS PL/SQL
Sintaxis:
TYPE nombre_tipo IS TABLE OF {tipo_columna | variable%TYPE |
tabla.columna%TYPE} [NOT NULL] INDEX BY BINARY_INTEGER;
Declaración de una variable tipo tabla:
identificador nombre_tipo;
Ejemplo 1:
Declare una variable PL/SQL para almacenar nombres de empleados:
TYPE tipo_tabla_nombre IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
tabla_nombre tipo_tabla_nombre;
Ejemplo 2:
DECLARE
TYPE tipo_tabla_nombre IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE tipo_tabla_fecha IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
tabla_nombre tipo_tabla_nombre;
table_fecha tipo_tabla_fecha;
BEGIN
tabla_nombre(1) := 'CAMERON';
tabla_fecha(8) := SYSDATE + 7;
IF tabla_nombre.EXISTS(1) THEN
INSERT INTO ...

END;
 TABLA PL/SQL DE REGISTROS
• Se define un tipo TABLA con el atributo %ROWTYPE precedido de un nombre de
tabla o vista de base de datos.
• Se declara una variable PL/SQL que contenga información de una tabla o vista de
base de datos.
Ejemplo:
DECLARE
TYPE tipo_tabla_dept IS TABLE OF dept%ROWTYPE
INDEX BY BINARY INTEGER;
tabla_dept tipo_tabla_dept;
-- Cada elemento de tabla_dept es un registro

 TIPO DE DATOS LOB


Permiten almacenar bloques de datos no estructurados, como texto, imagenes, video y
sonido de hasta 4GB de tamaño.
CLOB Character Large Object. Se utiliza para almacenar grandes datos de caracteres.
BLOB Binary Large Object. Se utiliza para almacenar objetos binarios grandes.
BFILE Binary File. Se utiliza para almacenar objetos binarios grandes en archivos del
sistema operativo, fuera de la base de datos.
NCLOB National Language Character Large Object. Se utiliza para almacenar en la
base de datos, bloques grandes de datos NCHAR de un byte único o multi-bytes de
ancho fijo.

 VARIABLES DE ENLACE (BIND)


• Son variables de SQL*Plus.
• Las pueden referenciar bloques de PL/SQL mediante el uso del ampersand (&).
Ejemplo:
CLEAR SCREEN
ACCEPT g_nemp NUMBER(4) PROMPT ‘Número empleado: ’
DECLARE
v_sal emp.sal%TYPE;
BEGIN
SELECT sal INTO v_sal FROM emp
WHERE empno = &g_nemp;
END;
4.4. Bloque anónimo PL/SQL

Un bloque PL/SQL, es un conjunto de instrucciones PL/SQL relacionadas entre ellas.


Un simple bloque PL/SQL se inicia con BEGIN y termina con END;
Ejemplo:
SET SERVEROUTPUT ON;
BEGIN
dbms_output.put_line('Hola');
END;
/
Control de Flujo
4.5.1 If..elseif..else
Se usa IF..ELSIF..ELSE para controlar el flujo en PL/SQL.
IF (expresion) THEN
-- Instrucciones
ELSIF (expresion) THEN
-- Instrucciones
ELSE
-- Instrucciones
END IF;

Ejemplo:
DECLARE
v_cnt_emp number;
v_tot_emp number;
BEGIN
select count(*) into v_tot_emp
from employee;
dbms_output.put_line ('Hay un total de '||v_tot_emp||' empleados.');
select count(*) into v_cnt_emp
from employee
where salary>1000;
dbms_output.put_line ('Hay '||v_cnt_emp||' empleados que ganan mas de 1000 $.');
dbms_output.put_line ('Resultado del análisis. ');
IF (v_tot_emp=v_cnt_emp) then
dbms_output.put_line ('Los empleados ganan todos mas de 1000 $');
ELSIF (v_tot_emp<v_cnt_emp*2) then
dbms_output.put_line ('Mas de la mitad empleados ganan todos mas de 1000 $');
ELSE
dbms_output.put_line ('Menos de la mitad empleados ganan todos mas de 1000 $');
END IF;
END;
/
4.5.2. Case

Es parecido al IF...elsif...else. Se menciona la variable a evaluar y luego los valores posibles con su
código apropiado.

Ejemplo:
DECLARE
v_salary employee.salary%TYPE;
begin
select salary into v_salary from employee where emp_no=65;
dbms_output.put_line('Salario:'|| v_salary);
case
when v_salary=0 THEN
dbms_output.put_line('Gratis!');
when v_salary<10000 then
dbms_output.put_line('Salado!');
when v_salary<90000 then
dbms_output.put_line('Mas o menos');
when v_salary>=90000 then
dbms_output.put_line('Correcto');
end case;
end;
/

DECLARE
v_job_grade employee.job_grade%TYPE;
begin
select job_grade into v_job_grade from employee where emp_no=2;
dbms_output.put_line('job_grade:'|| v_job_grade);
case v_job_grade
when 1 THEN
dbms_output.put_line('Jefe!');
when 2 then
dbms_output.put_line('Jefecito');
when 3 then
dbms_output.put_line('Empleado regular');
ELSE
dbms_output.put_line('Esclavo o dios');
end case;
end;
/
Powered by TCPDF (www.tcpdf.org)
Powered by TCPDF (www.tcpdf.org)

También podría gustarte