230 likes | 397 Views
INF 340 SGBD Postgres. fernando.velasco.p@mail.pucv.cl. En Toma !. PHP + PostgreSQL. Procedimientos Almacenados en PostgreSQL. Permite varios lenguajes de programación, algunos incorporados y otros se pueden agregar como paquetes adicionales
E N D
INF 340 SGBD Postgres fernando.velasco.p@mail.pucv.cl En Toma !
Procedimientos Almacenados en PostgreSQL Permite varios lenguajes de programación, algunos incorporados y otros se pueden agregar como paquetes adicionales El lenguaje más utilizado en postgresql es PLpgSQL, que es un subconjunto de PL/SQL de Oracle.
Funciones CREATE [or replace] FUNCTION nombre[( {[par_mode] [par_nombre] par_tipo [DEFAULT= par_default],}..)][RETURNS=ret_tipo]As $$ …/* Código */ $$ LANGUAGE [lenguaje] [IMMUTABLE | STABLE | VOLATILE]
Funciones par_mode : Si el parámetro es de entrada [IN] {defecto}, salida [OUT], o entrada/salida [IN/OUT] par_nombre : Nombre del praámetro. Si no se especifica, se puede usar por su posición relativa ($1,$2, ..), o bien, definir un alias en “declare” Ej: alias nombre_alias for $1; par_tipo : tipo del parámetro. Cualquier tipo soportado por postgres par_default: Valor por defecto del parámetro (enc aso de ser nulo)
Funciones ret_tipo: Tipo que retornará la función. Puede ser un tipo escalar o estructura (p.e. registro o tabla) Lenguaje: El lenguaje que se utilizará para crear la función. Ej. PLpgSQL IMMUTABLE | STABLE | VOLATILE: IMMUTABLE : La función no trabaja con datos de tabla STABLE : La función ocupa datos de la tabla, pero usa una copia de ésta (no refleja cambios). VOLATILE (defecto): La función ocupa datos directo de la tabla, por ende refleja cualquier cambio en ésta.
Tipos de Datos Postgresql • Numéricos • Enteros • integer • smallinteger • int2 • int4 • int8 • serial • Números aproximados • float • float4 • float8
Tipos de Datos Postgresql • Numéricos • Números exactos • decimal • numeric • money • Caracteres • Char • Varchar • NChar • Nvarchar • Text
Tipos de Datos Postgresql • Fecha y Hora • date • time • timestamp • Cadena de bits • bool • Direcciones • cidr • inet
Tipos de Datos Postgresql • Archivos • blob • clob • Figuras Geométricas • box • circle • line • lseg • point • polygon
PLpgSQL El lenguaje PL/pgSQL es estructurado en bloques, cada bloque tiene el siguiente formato: [DECLARE declaraciones] BEGIN sentencias END;
PLpgSQL Toda variable debe ser declarada. Dicha variable tendrá validez dentro en el bloque donde es declarada, y en los bloques interno, a no ser que se declare otra variable con el mismo nombre: nombre [ CONSTANT ] tipo [ NOT NULL ] [ { DEFAULT | := } valor ];
PLpgSQL En el segmento de declaraciones podemos asignar alias a los parámetros: CREATE FUNCTION es_alumno_ramo(char(8),char(3),int ) RETURNS bool AS $$ DECLARE par_rut ALIAS FOR $1; par_esc ALIAS FOR $2; par_cra ALIAS FOR $3; BEGIN
PLpgSQL NOTA IMPORTANTE: Postgresql permite definir variables del mismo tipo de algún campo o de algún registro de una tabla, permitiendo mantener consistencia si se realiza algún cambio de dichos tipos. Para ello se utiliza: Para un campo: %TYPE Para un registro: %ROWTYPE p.e. DECLARE par_rut alumnos.rut%TYPE;
PLpgSQL Asignaciones: Las asignaciones se realizan mediante el operador “:=“ , ejemplo: rut_nulo := ‘00000000’; Para asignar filas, utiliza la sentencia “Select into”, ejemplo: create function nombre_alumno(char(8)) returns text as $$ DECLARE par_rut ALIAS FOR $1; Datos_Alumno alumnos%ROWTYPE; BEGIN SELECT INTO datos_alumno * FROM alumnos WHERE rut=par_rut; Return(datos_alumno.nombre); ……
PLpgSQL Mensajes: El comando “RAISE” envía mensajes al logs de postgres. RAISE indica errores, por lo tanto, según la severidad, aborta la función: Uso: RAISE nivel ‘formato’ [,identificadores] El formato puede contener el comodín %, el que será remplazo por el valor de [identificadores] Niveles: NOTICE : advertencia, se usa para msg. EXCEPTION : error, aborta la función
Lenguaje de control de flujo Bloque condicional: Bloque IF..THEN …END IF IF (condición) THEN … ELSEIF (condición) …. ELSE … END;
Lenguaje de control de flujo Bloques Iterativos Bloque LOOP....END LOOP; LOOP …. [IF (condición) EXIT End; | EXIT when condición;] END LOOP; Bloque while....LOOP; WHILE expression LOOP statements END LOOP;
Lenguaje de control de flujo Bloque FOR VAR IN V1 .. V2 LOOP FOR variable IN [REVERSE] Vinicial .. Vfinal LOOP; …… END LOOP;
Devolviendo Filas de una función Si se desea retornar varias filas en una función, se debe: Indicar que la función retornará un “set de valores” (SETOF) Crear una variable del tipo tabla%ROWTYPE Usar un for para mostrar cada registro de la tabla: for variable_del_tipo_tabla%rowtype select * from tabla loop return next variable_del_tipo_tabla%rowtype end loop Si se desea retornar filas de un Join, se debe crear un tipo definido por el usuario, con los tipos de los campos a retornar: create type nombre as ({nombre_var1 tipo_var1,})