Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Conferencia 8. Lenguaje PL/pgSQL.
Bases de Datos Conferencia 8. Lenguaje PL/pgSQL.
2
Contenido Surgimiento del lenguaje PL/pgSQL.
Principales Características. Temas de Implementación. Estructuras de Control. Procedimientos Almacenados y Funciones. Cursores y Disparadores. Bibliografía Materiales disponibles en la red.
3
SQL Estándar. Lenguaje poderoso. Permite implementar consultas.
Utilizado por SGBD que implementan el modelo relacional. No incluye estructuras de control No incluye estructuras iterativas.
4
Surgimiento del lenguaje PL/pgSQL.
Creado para gestionar metodos flexiblemente. Incorpora estructuras de control al SQL estándar. Permite realizar operaciones complejas. Permite la herencia de tipos, funciones y operaciones definidas por el usuario. Puede ser definido para validarse por el servidor.
5
Ventajas del lenguaje PL/pgSQL.
Alto Rendimiento. Lenguaje procedural. Agrupa más de una consulta SQL. Disminuye el número del consultas sobre el Servidor. Soporte de SQL. Portable.
6
Estructura del PL/pgSQL.
Lenguaje estructurado en bloques. Los bloques puede usarse para agrupamientos lógicos o funcionales. Cada bloque puede contener a otros bloques.
7
Estructura de un bloque PL/pgSQL.
[ <<etiqueta>> ] [ DECLARE declaraciones ] BEGIN cuerpo del bloque (puede contener otros bloques) END;
8
Detalles de codificación.
Cada declaración o sentencia dentro del cuerpo de bloque estará delimitada por un punto y coma. Las palabras clave e identificadores pueden ser escritos en caracteres mayúsculas/minúsculas.
9
Comentarios PL/pgSQL. -- comentarios de una línea. /* comentarios
multilínea */
10
Variables en PL/pgSQL. Se pueden declarar para bloques individuales.
Los valores de las variables serán locales a cada bloque.
11
Variables en PL/pgSQL. Sintaxis de declaración de una variable:
nombre [ CONSTANT ] tipo [ NOT NULL ] [ { DEFAULT | := } expresión ]; DEFAULT: Indica el valor inicial asignado a la variable. Si no se indica la variable es inicializada al valor SQL NULL. CONSTANT: Previene la asignación de otros valores a la variable, así que su valor permanece durante la duración del bloque. NOT NULL: No permite asignaciones de valor NULL. Todas las variables declaradas como NOT NULL deben tener un valor por defecto no nulo especificado.
12
Ejemplos de Variables. cantidad INTEGER DEFAULT 32;
url varchar := '' user_id CONSTANT INTEGER := 10;
13
Variables en PL/pgSQL. CREATE FUNCTION funcionEjemplo() RETURNS INTEGER AS ' DECLARE cantidad INTEGER := 30; BEGIN RAISE NOTICE ''La cantidad aquí es %'',cantidad; -- La cantidad aquí es 30 cantidad := 50; -- Crea un subbloque cantidad INTEGER := 80; RAISE NOTICE ''La cantidad aquí es %'',cantidad; -- La cantidad aquí es 80 END; RAISE NOTICE ''La cantidad aquí es %'',cantidad; -- La cantidad aquí es 50 RETURN cantidad; ' LANGUAGE 'plpgsql';
14
Declaraciones en PL/pgSQL.
Todas las variables, filas y registros usados en un bloque se declaran en la sección de declaraciones del bloque. Unica excepción: Variables de bucle para una iteración de bloque FOR sobre un rango de valores enteros (automáticamente declarada como entera). Las variables pueden ser de cualquier tipo SQL (INTEGER, VARCHAR, CHAR, etc...)
15
Ejemplo de Declaraciones de Variables.
user_id INTEGER; cantidad NUMERIC(5); url VARCHAR; myrow nombretabla%ROWTYPE; -- tipo fila myfield nombretabla.nombrecampo%TYPE; unafila RECORD; -- tipo registro
16
Variables de tipo RECORD.
Toman de la actual estructura de la fila que tienen asignada durante un comando SELECT o FOR. La estructura de una variable tipo registro puede variar cada vez que se le asigne un valor. Hasta que a una variable tipo registro se le asigne valor por vez primera no tendrá estructura, por lo que cualquier intento de acceder a un campo en ella provocará un error en tiempo de ejecución. RECORD no es un verdadero tipo de datos, sólo un almacenador.
17
Estructuras de Control.
Condicionales IF ... THEN IF ... THEN ... ELSE IF ... THEN ... ELSIF ... THEN ... ELSE
18
Estructuras de Control.
IF ... THEN ... ELSIF ... THEN ... ELSE es equivalente a comandos IF- THEN-ELSE-IF-THEN anidados, pero sólo se necesita un END IF. IF number = 0 THEN result := ''zero''; ELSIF number > 0 THEN result := ''positive''; ELSIF number < 0 THEN result := ''negative''; ELSE -- la única posibilidad restante es que el valor del número sea nulo. result := ''NULL''; END IF;
19
Estructuras de Control.
Bucles Simples. LOOP: Bucle incondicional que es repetido indefinidamente hasta que sea termiando por un estamento EXIT o RETURN. [<<etiquetal>>] LOOP bloque de sentencias END LOOP; La etiqueta opcional puede ser usada por sentencias EXIT en bucles anidados para especificar qué nivel de anidación debería ser terminado.
20
Estructuras de Control.
Bucles Simples. EXIT: EXIT [ etiqueta ] [ WHEN expresión ]; Si no se proporciona etiqueta, el bucle más al interior es terminado y la sentencia más cercana a END LOOP es ejecutada a continuación. Si se proporciona etiqueta, esta debe ser la etiqueta del bucle o bloque más actual o de nivel externo. Entonces el bucle o bloque nombrado es terminado, y el control continúa con la sentencia que sigue al correspondiente END del bucle/bloque. Si WHEN está presente, sólo ocurrirá la salida del bucle si la condición especificada es cierta, de lo contrario pasa al estamento tras EXIT. WHILE FOR (entero for-loop)
21
Estructuras de Control.
Bucles Simples. Ejemplos del bucle EXIT: LOOP -- sentencias a ejecutar IF count > 0 THEN EXIT; -- exit loop END IF; END LOOP; EXIT WHEN count > 0; BEGIN IF stocks > THEN EXIT; -- ilegal. No puede usar EXIT fuera de un LOOP END;
22
Estructuras de Control.
Bucles Simples. WHILE: repite una secuencia de estamentos mientras que la condición se evalúe a verdadero. La condición es chequeada justo antes de cada entrada al cuerpo del bucle. [<<etiquetal>>] WHILE expresion LOOP bloque de sentencias END LOOP;
23
Estructuras de Control.
Bucles Simples. Ejemplos del bucle WHILE: WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP -- sentencias a ejecutar END LOOP; WHILE NOT boolean_expression LOOP
24
Estructuras de Control.
Bucles Simples. FOR: Bucle que itera sobre un rango de valores enteros. [<<etiqueta>>] FOR nombre IN [ REVERSE ] expresión .. expresión LOOP sentencias END LOOP; La variable nombre es automáticamente definida como de tipo integer y existe sólo dentro del bucle. Las dos expresiones dando el menor y mayor valores del rango son evaluadas una vez se entra en el bucle. El intervalo de iteración es de 1 normalmente, pero es -1 cuando se especifica REVERSE.
25
Estructuras de Control.
Bucles Simples. Ejemplos del bucle FOR: FOR i IN LOOP -- sentencias a ejecutar RAISE NOTICE ''i is %'',i; END LOOP; FOR i IN REVERSE LOOP
26
Estructuras de Control.
Bucles basados en resultados de búsquedas. Utilizando un tipo diferente de bucle FOR puede iterarse a través de los resultados de una consulta y manipular sus datos. [<<etiqueta>>] FOR registro | fila IN select_query LOOP sentencias END LOOP; La estructura FOR-IN-EXECUTE es otra forma de iterar sobre registros: FOR registro | fila IN EXECUTE expresión_texto LOOP
27
Procedimientos y Funciones.
Sintaxis de Declaracion. CREATE [OR REPLACE ] FUNCTION nombre ( [ [ modo_arg ] [ nombre_arg ] tipo_arg [, ...] ] ) [ RETURNS rettype ] AS --DECLARACION DE BLOQUES LANGUAGE nombre_lenguaje
28
Ejecución de Sentencias SQL.
SELECT INTO <<destino>>: Almacena el resultado de la consulta en el destino indicado. EXECUTE <<texto>>: Ejecuta la consulta o expresión indicada en forma de texto. FOUND: Variable especial que informa si se obtuvo o no un resultado. IS NULL: Indica la obtención de un resultado nulo.
29
SQL Estándar Recuperar la información de la empresa número 4. SELECT *
FROM Empresa WHERE CodEmpresa = 4 ¿ Si se desea recuperar la información de una empresa X ?
30
Procedimientos y Funciones
Filosofía estructural. – Métodos. Operación sobre la BD en la BD. Ejecución más rápida. Reducción del tráfico en la red. Reutilizar código. Flexibilidad.
31
Métodos. Implementación.
Implementar una función que devuelva los datos de una empresa dada.
32
Utilización de parámetros
Resolución. CREATE FUNCTION “Inform_de_Empresa_X" (IN CodEmp “varchar") RETURNS “record” AS DECLARE InfoEmpr RECORD; BEGIN SELECT INTO InfoEmpr “Empresa”.* FROM “Empresa” WHERE (“Empresa”.“CodEmpresa” = CodEmp); RETURN InfoEmpr; END; Utilización de parámetros ó $1
33
Procedimientos Almacenados (PA)
Declaración de parámetros [ [ modo] [ nombre] tipo [, ...] ] Ejemplos: IN cod_trab "varchar" OUT indice "numeric", INOUT cod_emp "numeric"
34
Ejecución de Funciones y Procedimientos.
EXECUTE "NombreProcedimiento" (parámetros); SELECT variable= "NombreFunción"(parámetros);
35
Disparadores o Triggers.
Función sin parámetros. Reporta un tipo trigger. Debe retornar o NULL o un valor registro/fila teniendo exactamente la misma estructura de la tabla que lo disparó. Trabaja con variables especiales.
36
Variables especiales de Triggers.
NEW: Tipo de datos RECORD. Almacena la nueva fila de base de datos para operaciones INSERT/UPDATE. OLD: Tipo de datos RECORD. Almacena la antigua fila de base de datos para operaciones UPDATE/DELETE. TG_NAME: Tipo de datos name. Contiene el nombre del trigger actualmente disparado. TG_WHEN: Tipo de datos text. Una cadena de BEFORE o AFTER dependiendo de la definición del trigger. TG_LEVEL: Tipo de datos text. Uua cadena de ROW o STATEMENT dependiendo de la definición del trigger. TG_OP: Tipo de datos text. Una cadena de INSERT, UPDATE o DELETE indicando por cuál operación se disparó el trigger.
37
Variables especiales de Triggers.
TG_RELID: Tipo de datos oid. ID de objeto de la tabla que causó la invocación del trigger. TG_RELNAME: Tipo de datos name. Nombre de la tabla que causó la invocación del trigger. TG_NARGS: Tipo de datos integer. Número de argumentos proporcionado al procedimiento trigger en el estamento CREATE TRIGGER. TG_ARGV[]: Tipo de datos array de text. Argumentos del estamento CREATE TRIGGER. El índice cuenta desde 0 y puede ser dado como expresión. Índices inválidos (< 0 or >= tg_nargs) resultan en un valor nulo.
38
Disparadores o Triggers.
Sintaxis de Declaración. CREATE FUNCTION <<nomb_método>> () RETURNS TRIGGER AS BEGIN -- Declaración de Condicionales END; LANGUAGE 'plpgsql'; CREATE TRIGGER <<nomb_trigger>> { BEFORE, AFTER } { INSERT [ OR UPDATE [ OR DELETE ] ]} ON <<tabla>> FOR EACH {ROW, STATEMENT } EXECUTE PROCEDURE <<nomb_método>>(); Método Trigger
39
Disparadores o Triggers.
Ejemplo. CREATE FUNCTION "cheq_obrer"() RETURNS TRIGGER AS BEGIN IF NEW.salario ISNULL THEN RAISE EXCEPTION ''% no puede tener un salario NULO'', NEW.nombre_empleado; END IF; IF NEW.salario < 0 THEN RAISE EXCEPTION ''% no puede tener un salario negativo'', NEW.nombre_empleado; END; LANGUAGE 'plpgsql'; CREATE TRIGGER "chequ_obrer" BEFORE INSERT OR UPDATE ON "Obrero_Agricola" FOR EACH ROW EXECUTE PROCEDURE "cheq_obrer"();
40
Cursores Ejecutan consultas completas en un mismo intervalo de tiempo.
Pueden encapsular varias consultas. Pueden leer varias filas en un mismo intervalo de tiempo. Evitan sobrecargar la memoria . Los bucles FOR utilizan internamente un cursor.
41
Declaración de Variables de Cursor
Los cursores se acceden únicamente mediante variables de cursor. Existen dos formas de declaración: Declarando variables de tipo refcursor. Ejemplo: DECLARE curs1 refcursor; Utilizando la sintaxis de declaración de un cursor. nombre CURSOR [ ( argumentos ) ] FOR select_query ; Ejemplo: DECLARE curs2 CURSOR FOR SELECT * from tenk1; curs3 CURSOR (key int) IS SELECT * from tenk1 where unique1 = key; pares de tipos de datos name definen nombres a remplazar por valores de parámetros Puede ser usado con cualquier consulta Sera sustituido por un parámetro entero al abrirse el cursor Están comprometidos con su consulta
42
Apertura de Cursores Un cursor debe ser abierto para poder utilizarse.
Se le pasa la consulta a ejecutar. El cursor no puede estar abierto aun. Debe haber sido declarado como no asignado. Un cursor debe ser abierto para poder utilizarse. Existen cuatro formas de abrir un cursor. OPEN FOR SELECT: Especificando una consulta como tal. (ej. OPEN curs1 FOR SELECT * FROM < -- >WHERE < -- >; ) OPEN FOR EXECUTE: La consulta se especifica como una expresion de texto, al igual que se usa con el comando EXECUTE. (ej. OPEN curs1 FOR EXECUTE ''SELECT * FROM '' || quote_ident($1);) Abrir cursores asignados: OPEN cursor [ ( valores de parámetros) ]; (ej. OPEN curs2; OPEN curs3(42);) Consulta ya asignada en la declaración. El cursor no puede estar abierto aun. Los parámetros se aceptan si se indicaron en la declaración. No existe equivalente con EXECUTE.
43
Uso de Cursores FETCH: Retorna la siguiente fila del cursor.
El valor se puede almacenar en una vriable tipo fila, registro o a una lista de variables simples separadas por comas (idem a SELECT INTO). Puede usarse la variable especial FOUND para chequear la recuperación. (ej. FETCH curs1 INTO rowvar; FETCH curs2 INTO foo, bar, baz; ) CLOSE: Cierra un cursor abierto y libera sus recursos. (ej. CLOSE curs1;)
44
Uso de Cursores Retorno de cursores.
Las funciones pueden retornar cursores (Abrir el cursor y devolver su nombre). El cursor podrá ser cerrado por el programador o cuando termine la transacción. El nombre del cursor retornado por la función puede ser especificado por el peticionario o generado automáticamente.
45
Uso de Cursores Nombre de cursor indicado a la llamada:
CREATE TABLE test (col text); INSERT INTO test VALUES ('123'); CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS BEGIN OPEN $1 FOR SELECT col FROM test; RETURN $1; END; LANGUAGE 'plpgsql'; BEGIN; SELECT reffunc('funccursor'); FETCH ALL IN funccursor; COMMIT;
46
Uso de Cursores Nombre de cursor generado de manera automática:
CREATE FUNCTION reffunc2() RETURNS refcursor AS DECLARE ref refcursor; BEGIN OPEN ref FOR SELECT col FROM test; RETURN ref; END; LANGUAGE 'plpgsql'; BEGIN; SELECT reffunc2(); reffunc2 <unnamed cursor 1> (1 row) FETCH ALL IN "<unnamed cursor 1>"; COMMIT
47
Conclusiones PL/pgSQL: Lenguaje simple y poderoso.
Procedimientos almacenados y funciones Eficiencia Alcance Centralización Disparadores (Triggers) Protección Seguridad Cursores
48
Estudio Independiente
Implementar un procedimiento que permita obtener los nombres de las empresas que tienen una cantidad de obreros mayor que un valor dado. Implementar un procedimiento que permita eliminar los datos de un obrero dado su número de identidad.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.