EDAD EXACTA EN AÑOS, MESES Y DÍAS – ORACLE PLSQL

Hoy tengo en mente volver a retomar el blog, que lleva ya, mucho tiempo abandonado. Así que empezaré con una entrada de algo que puede resultar muy útil.

En oportunidades por requerimientos de negocios en nuestros aplicativos siempre es necesario conocer la edad exacta de una persona a partir de su fecha de nacimiento, en valores de años, meses y días.

Para esto podemos hacer uso de las funciones de fecha que Oracle posee. Basándonos en la función months_between que devuelve los meses entre dos fechas como un número entero y de ser el caso con su parte fraccional.

Considerando esto, los años serían la parte entera del resultado de dividir los meses para 12. La cantidad de meses sería igual al residuo entero de la división anterior. Y los días… bueno considerando que el resultado de la resta de dos fechas (date) en Oracle siempre será dada en días, si sumamos el número entero de meses a la fecha de nacimiento y la restamos a la fecha de cálculo obtendremos un valor numérico que representa los días.

A continuación un ejemplo mucho más claro en código PLSQL:

declare
f_nacimiento date; --fecha de nacimiento de la persona
f_calculo date; --fecha a la cual deseamos saber su edad
--var respuesta:
anios number;
meses number;
dias number;
--
solo_meses number;
begin
--datos iniciales
f_nacimiento := to_date('1989/06/03', 'yyyy/mm/dd');
f_calculo := to_date('2016/07/29', 'yyyy/mm/dd');

--todo a meses
solo_meses := months_between(f_calculo, f_nacimiento);
--
anios := trunc(solo_meses / 12);
meses := trunc(mod(solo_meses, 12));
dias := f_calculo - add_months(f_nacimiento, trunc(solo_meses));
--
dbms_output.put_line('Usted tiene : ' || anios || ' año(s) con ' ||
meses || ' mes(es) y ' || dias || ' dia(s)');
end;</pre>
<pre>

Y su resultado luego de la ejecución en un test:

resultado
Saludos,

Pasar JSON desde PHP(MySql) a JavaScript

El trabajo con estructuras JSON para el intercambio de datos entre cliente y servidor es una tarea relativamente sencilla y potente que permite agilizar el desarrollo. En este caso si necesitamos enviar datos desde un servidor que utiliza PHP y recupera datos de una base MySql bastará con tener un archivo .php similar a este:

$sql = "SELECT ID, POBLACION, NUMVISITAS FROM VISITAS_CENTROS";

$resulset = mysql_query($sql, $_SESSION["idBD"])

$arr = array();
while ($obj = mysql_fetch_object($resulset)) {
	$arr[] = array('ID' => $obj->ID,
				   'P' => utf8_encode($obj->POBLACION),
				   'NV' => $obj->NUMVISITAS,
		);
}
echo '' . json_encode($arr) . '';

El tema de la conexión con MySql puede ser consultado acá.

Haciendo uso de la instrucción  mysql_fetch_object recorreremos cada unos de los resultados de la consulta y los introduciremos en un Array que será transaformado median la instrucción json_encode.

En nuestro cliente podemos llamar a este archivo mediante JQuery de la siguiente forma:

$.ajax({
        type: "POST",
        url:"getData.php",
        async: true,
        success: function(datos){
            var dataJson = eval(datos);
			
            for(var i in dataJson){
				alert(dataJson[i].ID + " _ " + dataJson[i].P + " _ " + dataJson[i].NV);
            }
			
        },
        error: function (obj, error, objError){
            //avisar que ocurrió un error
        }
});

Donde el mostrar la información será tan fácil como utilizar un for para el objeto Json. Utilizando la sintaxis dataJson[i].PROPIEDAD para acceder a la información.

Sencillo pero muy útil.

Saludos.

CONEXIONES PHP – MYSQL & PHP-ACCESS

Siempre es común (indispensable diría yo ;-)) en el desarrollo de aplicaciones bajo php el conectarse a una BD. A continuación algunos ejemplos con dos Bases de Datos distintas:

PHP – MYSQL.

Para la conexión con una base MYSQL lo hacemos de la siguiente manera:

mysql_connect($dbhost, $dbusuario, $dbpassword) or die (“Error al Conectar!”);

Especificamos el nombre de la BD en la que vamos a trabajar:

mysql_select_db($db) or die (“Verifique la Base de Datos”);

Armamos la consulta y extraemos los datos:

$consulta = “SELECT titulo, latitud, longitud, descrip, icono FROM posicion”;

$respuesta = mysql_query ($consulta);

Verificamos si existió algún error o no:

if (!$respuesta) {

$message  = ‘Error en la consulta: ‘ . mysql_error() . “\n”;

$message .= ‘Busqueda: ‘ . $consulta;

die($message);

}

Presentamos la información que acabamos de extraer:

while ($row = mysql_fetch_array($respuesta))

{

$x = $row[1];

$y = $row[2];

$title = $row[0];

$desc = $row[3];

$icon = $row[4];

$info = “$y,$x” . “<br>” . “$title” . “<br>” . “$desc” .” <br>” .”$icon”.”<br>”;

print($info);

}

PHP – ACCESS

La conexión anterior con MySql es muy fácil puesto que php presenta funciones nativas que permiten realizar operaciones con esta, pero en el caso de ACCESS se deberá hacer uso de una librería llamada ADODB que permite conexión con múltiples BD’s:

Creamos el tipo de conexión:

$db_connection = new COM(“ADODB.Connection”);

Cargamos el Drive:

Especificamos aquí la dirección de la Base ACCESS en este caso es el archivo datos.mdb.

$db_connstr = “DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=”. realpath(“d:/datos.mdb”) .” ;UID=;PWD=1234;DefaultDir=”. realpath(“d:/datos.mdb”);

Realizamos la conexión:

$db_connection->open($db_connstr);

Consultamos a la Base:

$rs = $db_connection->execute(“SELECT * FROM posicion”);

Recuperamos la diferentes columnas que posee la consulta que acabamos de ejecutar:

$rs_fld0 = $rs->Fields(“titulo”);

$rs_fld1 = $rs->Fields(“latitud”);

$rs_fld2 = $rs->Fields(“longitud”);

$rs_fld3 = $rs->Fields(“descripcion”);

$rs_fld4 = $rs->Fields(“icono”);

Recorremos las columnas hasta el final y las presentamos:

while (!$rs->EOF) {

$titulo = $rs_fld0->value;

$lat = $rs_fld1->value;

$lon = $rs_fld2->value;

$des = $rs_fld3->value;

$ico = $rs_fld4->value;

$info = “$lon,$lat” . “<br>” . “$titulo” . “<br>” . “$des” .” <br>” .”$ico”.”<br>”;

print($info);

//Avanzamos un registro

$rs->MoveNext();

}

Cerramos tanto el ResulSet como la Conexión:

$rs->Close();

$db_connection->Close();

Como podemos ver los métodos de extracción de datos son diferentes pero útiles, los archivos de ejemplo utilizados puedes encontrarlos en la parte izquierda del blog o aquí.

Saludos.

Consultas Dinámicas SQL – ORACLE

Más de una vez se utilizan dentro de las bases de Datos consultas un poco parecidas o se necesita armar una consulta con determinados datos, algo que puede ser simplificado dentro de Oracle, con la utilización de el paquete DBMS_SQL.

Aquí un ejemplo:

Si poseemos la siguiente estructura de una tabla (muy sencilla solo para ejemplo):

create table registro (cliente  varchar2 (50),
compras  number (10,3),
ventas   number (10,3),
estado   varchar2 (25));

En donde se guardará información de ventas o compras de un cliente, tomando en cuenta que por cada transacción solo puede haber un valor en compras o ventas, pero no los dos, los datos son ingresados de la siguiente manera:

insert into registro ( cliente, compras, estado)
values ( 'Perez Juan', 123.4, 'CANCELADO');
insert into registro ( cliente, ventas, estado)
values ( 'Perez Juan', 452.8, 'PENDIENTE');

Como podemos ver la única diferencia entre estas sentencias de INSERT es la columna a la cual hacen referencia, ahora bien, que tal si creamos un pequeño procedimiento y lo almacenamos en un paquete de utilidad que luego podremos utilizar.

El procedimiento quedaría algo como esto:

PROCEDURE grabar_datos( nm_cliente     varchar2 (50),

columna        varchar2(50),

val_columna    number (10,3),

estado         number (10,3))

is

n_cursor INTEGER;

consulta VARCHAR2(250);

aux      number;

begin

consulta := 'insert into registro (cliente,:v1,estado)

values (:v2 , :v3 , v4)';

n_cursor := DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(n_cursor, consulta , DBMS_SQL.NATIVE );

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v1', columna);

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v2', nm_cliente);

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v3', val_columna);

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v4', estado);

aux := DBMS_SQL.EXECUTE (n_cursor);

DBMS_SQL.CLOSE_CURSOR(n_cursor);

end grabar_datos;

En este caso el parámetro val_columna podrá solo recibir dos valores “compras”  o “ventas” que son las columnas de la tabla. Podemos observar que para crear la consulta dinámica reemplazos los valores a utilizar por un expresión del tipo :nombre (similar a las variables host en oracle) para luego reemplazarlas con los valores originales mediante la instrucción:

DBMS_SQL.BIND_VARIABLE(n_cursor, ':v1',columna);

Se pudiera también formar la consulta dinámica de forma directa concatenando las expresiones que necesitamos, pero por algún motivo esto no es lo más óptimo pues puede presentar errores al concatener expresiones entre ‘ ‘ y números reales (12.3) .

Con esto habremos reemplazado los dos insert por un solo procedimiento.

Saludos ,

El Entorno de la Base de Datos BD

El entorno de una base de datos ha sido estructurado de tal forma que se utiliza un mecanismo conocido como “Arquitectura en tres niveles”, esto hace que se consideren tres niveles diferentes para la representación de datos o su abstracción:

  • Nivel Externo: Un nivel compuesto por las diferentes vistas que cada usuario tendrá de la base de datos.
  • Nivel Conceptual: Es la vista intermedia que contiene toda la estructura lógica de la base de datos, es decir, la relación entre los datos y restricciones entre otras.
  • Nivel Interno: Este se encarga de la representación física de los datos y la  implementación del espacio física, las estructuras de datos y la organización de archivos.

Además, la arquitectura de tres niveles tiene como objetivo la independencia de los datos pudiendo distinguir entre:

ü Lógica: En donde se podrán realizar cambios en el esquema conceptual sin afectar a otros niveles o al usuario.

ü Física: Establece la posibilidad de cambios en el esquema interno (medios físicos, algoritmos) sin que esto afecte a los demás esquemas.

Lenguajes de la Base de Datos

Conocidos como sublenguajes de datos permiten el manejo e interacción con la base datos, y están compuestos por:

Lenguaje de definición de datos (DDL): Utilizado para describir y nombrar las entidades, atributos y relaciones, así como  restricciones de seguridad e integridad requeridas por una aplicación.

Lenguaje de manipulación de datos (DML): Este permite mediante un conjunto de operadores la manipulación básica
de los datos que se encuentran dentro de la base de datos. Pudiendo ser:

Procedimentales: En donde se especifica los datos necesarios a extraer y como
extraerlos.

No Procedimentales: Se especifica los datos a extraer pero no la forma de extraerlos.

Lenguajes de Cuarta generación: Estos se basan en la simplificación de tareas y la mejora de rendimiento.

Además, para la representación de los datos y su compresión por parte del usuario de utilizan Modelos de datos y modelados conceptuales, en donde se establecen las relaciones y restricciones de los mismos.

Funciones de un SGBD: Las funciones que un SGBD debe prestar para su correcto funcionamiento tenemos:

§ Almacenamiento, extracción y actualización de datos.

§ Un catálogo accesible al usuario.

§ Soporte de transacciones.

§ Servicio de control de concurrencias.

§ Servicio de recuperación

§ Servicio de autorización

§ Soporte para la tramitación de datos.

§ Servicios de integridad

§ Servicios para mejorar la independencia de los datos

§ Servicios de utilidad

Componentes de un SGBD: La estructura de SGBD es muy compleja y sofisticada se puede mencionar dentro de él aspectos relevantes como:

  • Procesador de consultas.
  • Gestor de base de datos
  • Gestor de Archivos
  • Preprocesador DML
  • Compilador DDL
  • Gestor de Catálogo
  • Control de Autorización
  • Procesador de comandos
  • Comprobador de Integridad
  • Optimizador de consultas
  • Gestor de transacciones
  • Planificador
  • Gestor de recuperación
  • Gestor de búfer

Todos estos componentes hacen que el SGBD presente en su arquitectura la consistencia necesaria para el manejo de los datos almacenados en una base de datos.

Introducción a las Bases de Datos (BD)

En nuestro medio es posible considerar que las “bases de datos” son utilizadas en multitud de circunstancias y lugares, tanto así que su utilización puede pasar desapercibida.

Muestra de ellos son los supermercados en los cuales basta con deslizar el código de barras del producto para que sus datos sean visibles al cajero, y también cuando visitamos una biblioteca y buscamos un libro o realizamos un préstamo del mismo. Podemos llegar a la conclusión de que toda esa información debe estar almacenada en alguna estructura está es una base de datos.

La aparición de estas bases de datos se remonta a sus antecesores, a los sistemas tradicionales basados en archivos, los cuales permitían a cada usuario final definir y gestionar sus propios datos con lo cual se presentaban muchos inconvenientes o desventajas que hacían de este medio algo muy tedioso y que demandaba muchos costes.

Para superar estas desventajas se establecieron las “Bases de datos” que son una colección de datos lógicamente relacionados que permite separar los datos de los programas de aplicación. Además, estas utilizan lo que se conoce como SGBD o Sistema de Gestión de Base de Datos, que es el software que permite la interacción entre los usuarios y la base de datos. Permitiendo realizar funciones mediante el uso de lenguajes tales como: lenguaje de definición de datos (DDL), lenguaje de manipulación de datos (DML) y así como proporcionar un acceso controlado a la base de datos.

Además se crean programas de aplicación que interactúan con el SGBD, utilizando con esto una función conocida como Vistas que son un subconjunto de la base de datos, las mismas que permiten la implementación de un cierto nivel de seguridad restringiendo la vista de algunos datos dependiendo del usuario que ingrese.

Dentro del entorno de un SGBD se encuentran cinco componentes principales:

  • Hardware
  • Software
  • Datos
  • Procedimientos
  • Personas

Todos estos elementos componen el SGBD que maneja todos los accesos a la base de datos.

Todo este ambiente de las bases de datos engloba dentro de sí algunos roles que son desempeñados cada uno con una función estos pueden ser:

  • Administrador de Datos (planifica la base, estándares, políticas y procedimientos)
  • Administrador de la Base de Datos (materialización física de la base, seguridad, integridad y garantías)
  • Diseñadores de Bases de Datos (establece las reglas del negocio)
  • Desarrolladores de Aplicaciones (programadores que interactúan con el SGBD)
  • Usuarios finales (clientes que utilizarán la información almacenada en la base de datos)

En definitiva la utilización de un SGBD posee varias ventajas en comparación con el sistema de archivos que anteriormente se utilizaba, aunque también es importante ver algunos aspectos como la complejidad y los costes del mismo, que bien podrían ser una desventaja aunque muy mínima gracias a la funcionalidad que prestan los SGBD.