PostgreSQL
Ejemplos de PL/pgSQL
by MigueliTUX on Apr.05, 2009, under PostgreSQL
Buscar un cliente y retornar si existe o no
| CREATE OR REPLACE FUNCTION buscar_cliente (varchar) RETURNS bool AS ‘ DECLARE rut_buscar alias for $1; registro clientes%ROWTYPE; /* Notese que aqui definimos la variable registro del tipo FILA de clientes indicando la tabla, el simbolo % y luego la palabra reservada ROWTYPE */ BEGIN SELECT INTO registro * FROM clientes WHERE rut_cliente = rut_buscar; IF FOUND THEN RETURN true; END IF; RETURN false; END; ‘ LANGUAGE ‘plpgsql’; LLAMADA SELECT buscar_cliente(’12000111-2′); |
Buscar un producto y actualiza su precio segun porcentaje
| CREATE OR REPLACE FUNCTION actualizar_producto (varchar, real) RETURNS bool AS ‘ DECLARE producto ALIAS FOR $1; porcentaje ALIAS FOR $2; registro productos%ROWTYPE; BEGIN SELECT INTO registro * FROM productos WHERE id_producto = producto; IF FOUND THEN UPDATE productos SET precio_venta = precio_venta + (precio_venta * porcentaje) WHERE id_categoria = categoria; RETURN true; END IF; RETURN false; END; ‘ LANGUAGE ‘plpgsql’; LLAMADA SELECT actualizar_producto(’PRO-0540′,0.03) |
Suma 2 valores
| CREATE OR REPLACE FUNCTION suma (real, real) RETURNS real AS ‘ DECLARE valor_1 ALIAS FOR $1; valor_2 ALIAS FOR $2; total real; BEGIN total := valor_1 + valor_2; RETURN total; RETURN; END; ‘ LANGUAGE ‘plpgsql’; LLAMADA SELECT suma(3,4) |
SENTENCIAS DE CONTROL PARA POSTGRES
by MigueliTUX on Apr.05, 2009, under PostgreSQL
Esta sentencia nos permite efectuar un ciclo, su estructura básica es :
| …resto de la funcion… LOOP …sentencias a ejecutar en el ciclo… END LOOP …resto de la funcion… |
Cuando usamos un ciclo LOOP, es necesario darle una salida para que este mismo termine, la sentencia EXIT nos permite finalizar el LOOP y continuar en la sentencia siguente a la salida de éste, generalmente, EXIT está acompañado con la sentencia IF, por ejemplo
| LOOP …resto de la funcion… contador := contador + 1; IF contador >= 10 THEN EXIT; — salida del loop cuando sea mayor o igual que 10 END IF; END LOOP …resto de la funcion… |
Podemos efectuar operaciones de comparación con las sentencias IF, ELSE, los operadores de comparación son los siguientes :
| < menor que … > mayor que … <> distinto a … <= menor o igual que … >= mayor o igual que … = igual que … OR o … AND y … |
Ejemplo :
| …resto de la funcion… IF >= 10 or THEN RETURN true; ELSE |
Existen dos tipos de ciclos FOR, el primero tiene que ver claramente con los ciclos numéricos comunes, es decir, lo que comunmente se usa para efectuar repeticiones, y por otra parte, tenemos un ciclo FOR que nos permite recorrer tablas y procesar sus datos, esta segunda está ligada a sentencias SQL, veamos entonces como se utiliza la sentencia FOR
CASO 1 : SENTENCIA FOR DE PROCESO CICLICO NUMERICO
| FOR <variable> IN <inicio>..<fin> LOOP … SENTENCIAS A EJECUTAR DENTRO DEL CICLO FOR … END LOOP; o bien puede usar el FOR de forma inversa FOR <variable> REVERSE <fin>..<inicio> LOOP |
Ejemplo :
| …resto de la funcion… FOR inc IN 1..10 LOOP factorial := factorial * inc; END LOOP; RETURN factorial; …resto de la funcion… |
CASO 2: SENTENCIA FOR APLICADA A PROCESOS DE REGISTROS SQL
| FOR <registro o fila> IN <sentencia SELECT SQL> LOOP … SENTENCIAS A EJECUTAR DENTRO DEL CICLO FOR … END LOOP; |
Ejemplo :
| …resto de la funcion… DECLARE registro RECORD; BEGIN FOR registro IN SELECT * FROM productos LOOP stock := registro.sock_actual + 100; … otras sentencias … END LOOP; …resto de la funcion… |
Note que para utilizar esta sentencia FOR debemos declarar una variable de tipo RECORD o registro. RECORD es una palabra reservada para estos casos, y no posee una estructura definida pues no ha sido asignada a ninguna tabla, este tipo de dato nos permite recorrer la tabla de productos y obtener sus valores por medio de esta variable.
La sentencia WHILE se ejecuta de forma muy similar a otros lenguajes de programación, su estructura es la siguiente :
| WHILE <condicion> LOOP … SENTENCIAS A EJECUTAR DENTRO DEL CICLO WHILE … END LOOP; |
Ejemplo :
| …resto de la funcion… WHILE inc <= 10 LOOP factorial := factorial * inc; END LOOP; RETURN factorial; …resto de la funcion… |
Este codigo funciona igual al descrito en el ejemplo del ciclo FOR.
RETORNANDO EL UN VALOR COMO FUNCION
by MigueliTUX on Apr.05, 2009, under PostgreSQL
una vez procesados nuestros valores debemos retornar algún valor (pues ese es la esencia de la función), este retorno de valores también se realiza dentro de la sección BEGIN de la función, pero utilizando la siguiente forma básica :
| …resto de la funcion… RETURN <variable>; …resto de la funcion… |
|
| Ejemplo completo de la función SUMA :FUNCTION suma ( real , real ) RETURNS real AS ‘ DECLARE numero_1 alias for $1; numero_2 alias for $2; valor_total real; BEGIN valor_total := numero_1 + numero_2; RETURN valor_total; END; ‘ LANGUAGE ‘plpgsql’; |
ASIGNACION DE LAS SENTENCIAS DE PL/pgSQL
by MigueliTUX on Apr.05, 2009, under PostgreSQL
Las asignaciones de valores se realizan de la misma forma que en PASCAL, es decir, utilizando := como operador de asignación y punto y coma al final de la línea, ejemplo :
| FUNCTION suma ( real , real ) RETURNS real AS ‘ DECLARE numero_1 alias for $1; numero_2 alias for $2; valor_total real; BEGIN valor_total := numero_1 + numero_2; numero_1 := numero_1 * numero_2; …resto de la funcion… |
Tipos de Parametros usados por PostgreSQL
by MigueliTUX on Apr.05, 2009, under PostgreSQL
Tipos de Parametros usados por PostgreSQL: INTEGER, DATE, TIME, VARCHAR, CHAR, TIMESTAMP, REAL, TEXT y muchos otros, e inclusive tipos definidos por el usuario por medio de la instrucción CREATE TYPE.
| DECLARE contador integer = 0; cadena varchar; hoy date; bandera bool; suma real; |