Un tipo para manejo de moneda



Documentos relacionados
Funciones y TriggersIntroducción, Ejemplos

PL/PGSQL. Extensión "procedural" de SQL

SQL. (...la guía básica de supervivencia de dmi) Universidad de los Andes Demián Gutierrez Enero

EDITRAN/TR. Windows/Unix. Manual de referencia

Los bloques DLL (Figura A.1) externos permiten al usuario escribir su propio código y

Motores de Base de Datos Libres: Postgresql y MySql. Ing. Ricardo Naranjo Faccini, M.Sc

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

2- Creación de tablas y manejos de datos.

Base de datos Procedimientos Almacenados y Funciones

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

Programación SQL. Lucio Salgado Diciembre 2008

Álvaro Herrera Modelamiento Avanzado de Datos con PostgreSQL

Examen final de CL 11 de Enero de 2012 Fecha de publicación de notas: Fecha de revisión:

- Bases de Datos - - Diseño Físico - Luis D. García

[ EDICION ESPECIAL] En el siguiente ejemplo se agrega un archivo de datos de 5 MB a la base de datos BD_Ejemplo01.

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Introducción a PostgreSQL con PHP

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

Tema 2: La clase string

PROCEDIMIENTOS ALMACENADOS. CREATE PROCEDURE nombreprocedimiento tipodato [=valordefecto]][,...]

Bases de Datos Relacionales

Trabajos de Ampliación. Bases de datos NoSQL.

Bases de Datos / Elementos de Bases de Datos Que es un Stored Procedure? Stored Procedures: Ventajas

LENGUAJE. Tema 1 - Introducción

BASE DE DATOS TIPOS DE DATOS, VARIABLES, OPERADORES Y CONTROLES EN SQL SERVER

SQL PROCEDURAL Triggers y Stored Procedures. Ing. Gustavo A. Correa Reina UNCPBA 2008

1. Manejo de memoria estática 2. Manejo de memoria dinámica

TIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR: Estructuras CONTENIDOS

Procedimientos almacenados con parametros de salida

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Instrucciones de uso

Diseño de bases de datos

Laboratorio Informix. Stored Procedures Triggers

Tema: Sobrecarga de Operadores.

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

Base de Datos SQL Server

GUIA DE LABORATORIO N 9 B. (000Webhost Php- Para desarrollar en casa)

Haga clic para PostgreS cambiar el estilo

BASES DE DATOS AVANZADAS Transacciones en MYSQL

Los autores del presente documento lo ha publicado bajo las condiciones que especifica la licencia

Restricciones de Integridad

Recuperación del Sistema

Resumen Lenguaje Java

Se guardan en archivos con extencion c y los cabezales con extension h

Elementos léxicos del lenguaje de programación Java

Bases de Datos: Structured Query Language (SQL)

Entrarás a formar parte de nuestra bolsa de empleo a la que acuden las empresas en busca de nuestros alumnos.

Formato para prácticas de laboratorio

Tema 2 Modelos de Base de Datos. Profesor Luis Gmo. Zúñiga Mendoza UMCA

Lenguaje C Bucles, Condicionales, operadores y Algoritmos.

Contenido. Capítulo 1. Introducción a lenguaje C 1

MSSQL 2014 Virtualmente todos los tipos de datos

Lenguaje para descripción de datos

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000

PRÁCTICA III. DISPARADORES EN SQL (II)

LENGUAJE ESTRUCTURADO DE CONSULTAS SQL (2)

TEMA 20: CONCEPTOS BÁSICOS DE SQL

Universidad Central de Bayamón COLEGIO DE DESARROLLO EMPRESARIAL Y TECNOLOGIA. Número Estudiante:

Ejercicios - Persistencia en Android: ficheros y SQLite

STL: Standard Template Library

Formato para prácticas de laboratorio

El lenguaje de Programación C. Fernando J. Pereda

SQL: Vistas, Triggers, y Procedimientos Almacenados

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

FUNDAMENTOS DE PROGRAMACIÓN

PÁGINAS DINÁMICAS WEB CON PHP. Unidad 2 ELEMENTOS DEL LENGUAJE DE PHP

Administración Básica de Oracle9i.

Tipos de Datos en C. Palabras reservadas en C

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

PRÁCTICA DE LABORATORIO 3 Tipo Abstrato de Dato

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

MySQL: Guía de Referencia

El lenguaje C: Elementos básicos del lenguaje

Estructuras de Datos Declaraciones Tipos de Datos

Programando con Pl/Python

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

Estructura de datos tipo vector.

Prof. Dr. Paul Bustamante

Implementación de funciones definidas por el usuario

MySQL y Sesiones en PHP. Área de Ingeniería Telemática

1. Se usará la Base de Datos llamada. 2. Borrar la tabla CtasBanc anterior y crearla: 5.1 Procedimientos y Funciones Almacenados SQL Server

Tema 5: Diseño modular. Índice. Notas. Programación 2. Curso Notas. Ejemplo. La herramienta make. 1 Diseño modular.

HTML, PHP y bases de datos

6. PROGRAMACIÓN CON TRANSACT-SQL

INDICE Parte I. El Entorno Integrado Microsoft Visual C++ 1. Instalación y Funcionamiento de Microsoft Visual C++

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

Algoritmos y estructuras de datos

BANCO DE PREGUNTAS PARA EVALUACIÓN DE CONOCIMIENTOS DEL CONCURSO DE MÉRITOS Y OPOSICIÓN EXPERTO EN DESARROLLO DE SISTEMAS 1

Python dentro de Postgres con PL/Python. PGDAY Ecuador 2011 PUCE Quito Milton Labanda Octubre 2011

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Formato para prácticas de laboratorio

Transcripción:

Un tipo para manejo de moneda Cada objeto moneda guardará tres items de información el nombre de la moneda (euro, dolar, etc) la cantidad de unidades de esa moneda la tasa de cambio en el momento en que el objeto fué creado Implementación en C usa un struct para almacenar una moneda /* File name: fcur.c */ #include "postgres.h" #include "fmgr.h" typedef struct { char fcur_name[4]; /* Currency name */ float4 fcur_units; /* Units of currency */ float4 fcur_xrate; /* Exchange rate */ } fcur; static char * basecurrencyname = "US$"; static char * unknowncurrencyname = "???"; 257

Forma Externa Se desea manejar tres formas units units(exchange-rate) units(exchange-rate/currency-name) Ejemplos 258

Función de Entrada /* Name: fcur_in() Converts an fcur value from external form to internal form. */ PG_FUNCTION_INFO_V1(fcur_in); Datum fcur_in(pg_function_args) { char * src = PG_GETARG_CSTRING(0); char * workstr = pstrdup( src ); char * units = NULL; char * name = NULL; char * xrate = NULL; fcur * result = NULL; char * endptr = NULL; /* strtok() will find all of the components for us */ units = strtok( workstr, "(" ); xrate = strtok( NULL, "/)" ); name = strtok( NULL, ")" ); result = (fcur *)palloc( sizeof( fcur )); memset( result, 0x00, sizeof( fcur )); result->fcur_units = strtod( units, &endptr ); if( xrate ) { result->fcur_xrate = strtod( xrate, &endptr );} else { result->fcur_xrate = 1.0; } if( name ) { strncpy( result->fcur_name, name, sizeof( result->fcur_name ));} else { strncpy( result->fcur_name, unknowncurrencyname, sizeof( result->fcur_name ));} PG_RETURN_POINTER( result ); } 259

Función de Salida /* Name: fcur_out() Converts an fcur value from internal form to external form. */ PG_FUNCTION_INFO_V1(fcur_out); Datum fcur_out(pg_function_args) { fcur * src = (fcur *)PG_GETARG_POINTER( 0 ); char * result; char work[16+sizeof(src->fcur_name)+16+4]; ); } sprintf( work, "%g(%g/%s)", src->fcur_units, src->fcur_xrate, src->fcur_name result = (char *)palloc( strlen( work ) + 1 ); strcpy( result, work ); PG_RETURN_CSTRING( result ); 260

Los toques finales Primero se genera un módulo compartido fcur.so compilando el código C Luego se definen las funciones de entrada y salida en PostgreSQL CREATE OR REPLACE FUNCTION fcur_in( opaque ) RETURNS opaque AS 'fcur.so' LANGUAGE 'C' IMMUTABLE STRICT CREATE OR REPLACE FUNCTION fcur_out( opaque ) RETURNS opaque AS 'fcur.so' LANGUAGE 'C' IMMUTABLE STRICT 261

Utilizando el nuevo tipo CREATE TYPE FCUR ( INPUT=fcur_in, OUTPUT=fcur_out, INTERNALLENGTH=12 ) CREATE TABLE fcur_test( pkey INT, val FCUR ); INSERT INTO fcur_test VALUES( 1, '1' ); INSERT INTO fcur_test VALUES( 2, '1(.5)' ); INSERT INTO fcur_test VALUES( 3, '3(1/US$)' ); INSERT INTO fcur_test VALUES( 4, '5(.687853/GBP)' ); INSERT INTO fcur_test VALUES( 5, '10(7.2566/FRF)' ); INSERT INTO fcur_test VALUES( 6, '1(1.5702/CA$)' ); INSERT INTO fcur_test VALUES( 7, '1.5702(1.5702/CA$)' ); SELECT * FROM fcur_test; pkey val ------+-------------------- 1 1(1/???) 2 1(0.5/???) 3 3(1/US$) 4 5(0.687853/GBP) 5 10(7.2566/FRF) 6 1(1.5702/CA$) 7 1.5702(1.5702/CA$) 262

Mejorando nuestro nuevo tipo Podríamos definir funciones de comparación de monedas SELECT fcur_eq( '1', '1.5702(1.5702/CA$)' ); fcur_eq --------- t (1 row) Podríamos asignar a cada una de estas funciones un operador Es posible asignar operadores de "conmutación" (el inverso) 23 > balance => balance < 23 (permite optimizar consultas) Podríamos definir operadores aritméticos SELECT *, val + '2(1.5702/CA$)' AS result FROM fcur_test; pkey val result ------+--------------------+-------------------- 1 1(1/???) 2.27372(1/US$) 2 1(0.5/???) 3.27372(1/US$) 3 3(1/US$) 4.27372(1/US$) 4 5(0.687853/GBP) 8.54272(1/US$) 5 10(7.2566/FRF) 2.65178(1/US$) 6 1(1.5702/CA$) 3(1.5702/CA$) 7 1.5702(1.5702/CA$) 3.5702(1.5702/CA$) (7 rows) 263

Números Complejos PG_FUNCTION_INFO_V1(complejo_in); Datum complejo_in(pg_function_args) { char *str = PG_GETARG_CSTRING(0); double x, y; Complejo *resultado; typedef struct Complejo { double x; double y; } Complejo; } if (sscanf(str, " ( %lf, %lf )", &x, &y)!= 2) ereport(error, (errcode(errcode_invalid_text_representation), errmsg("syntax invalido para complejo: \"%s\"", str))); resultado = (Complejo *) palloc(sizeof(complejo)); resultado->x = x; resultado->y = y; PG_RETURN_POINTER(resultado); PG_FUNCTION_INFO_V1(complejo_out); Datum complejo_out(pg_function_args) { Complejo *complejo = (Complejo *) PG_GETARG_POINTER(0); char *resultado; } resultado = (char *) palloc(100); snprintf(resultado, 100, "(%g,%g)", complejo->x, complejo->y); PG_RETURN_CSTRING(resultado); 264

Creación del tipo complejo CREATE FUNCTION complejo_in(cstring) RETURNS complejo AS 'filename' LANGUAGE C IMMUTABLE STRICT; CREATE FUNCTION complejo_out(complejo) RETURNS cstring AS 'filename' LANGUAGE C IMMUTABLE STRICT; CREATE TYPE complejo ( internallength = 16, input = complejo_in, output = complejo_out, alignment = double ) ; 265

Operador de suma de complejos CREATE FUNCTION suma_complejo(complejo, complejo) RETURNS complejo AS 'filename', 'suma_complejo' LANGUAGE C IMMUTABLE STRICT; CREATE OPERATOR + ( leftarg = complejo, rightarg = complejo, procedure = suma_complejo, commutator = + ) ; SELECT (a + b) AS c FROM test_complex; 266