Vous êtes sur la page 1sur 4

--Haskell Database Exampple

module Example where

import Database.HDBC.Sqlite3
import Database.HDBC

infoConexionTiendaBD :: IO()
infoConexionTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Mostramos la informacion
putStr ("Nombre del driver hdbc: " ++ (hdbcDriverName conn) ++ "\n")
putStr ("Version de la biblioteca cliente usada: " ++ (hdbcClientVer conn) ++ "\n")
putStr ("Version del SGDB: " ++ (dbServerVer conn) ++ "\n")
putStr ("Soporte para transacciones: " ++ (show(dbTransactionSupport conn)) ++ "\n")

-- Desconectar de la BD
disconnect conn

crearTiendaBD :: IO()
crearTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Crear la tabla Clientes


run conn "CREATE TABLE Clientes (\
\dni VARCHAR(9) PRIMARY KEY, \
\nombre VARCHAR(30), \
\direccion VARCHAR(50), \
\telefono VARCHAR(9))" []
-- Crear la tabla Pedidos
run conn "CREATE TABLE Pedidos (\
\numero VARCHAR(10) PRIMARY KEY, \
\fecha DATE, \
\dni_cliente VARCHAR(9) REFERENCES Clientes(dni))" []
-- Crear la tabla Articulos
run conn "CREATE TABLE Articulos (\
\codigo VARCHAR(13) PRIMARY KEY, \
\nombre VARCHAR(30), \
\precio FLOAT)" []
-- Crear la tabla Pedidos_Articulos
run conn "CREATE TABLE Pedidos_Articulos (\
\numero_pedido VARCHAR(10), \
\codigo_articulo VARCHAR(13), \
\cantidad INTEGER, \
\PRIMARY KEY (numero_pedido, codigo_articulo), \
\FOREIGN KEY (numero_pedido) REFERENCES Pedidos(numero), \
\FOREIGN KEY (codigo_articulo) REFERENCES Articulos(codigo))" []

-- Realizar commit
commit conn

-- Desconectar de la BD
disconnect conn

insertarTiendaBD :: IO()
insertarTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Insercion simple
run conn "INSERT INTO Clientes VALUES (?, ?, ?, ?)"
[toSql "78945612A", toSql "Emma", SqlNull, toSql "123456789"]

-- Sentencias predefinidas
insertaC <- prepare conn "INSERT INTO Clientes VALUES (?, ?, ?, ?)"
insertaA <- prepare conn "INSERT INTO Articulos VALUES (?, ?, ?)"
insertaP <- prepare conn "INSERT INTO Pedidos VALUES (?, ?, ?)"
insertaPA <- prepare conn "INSERT INTO Pedidos_Articulos VALUES (?, ?, ?)"
executeMany insertaC [[toSql "79846851H",
toSql "Francisco Javier",
toSql "C/ Principal",
toSql "456789123"],
[toSql "79952201K",
toSql "Sonia",
SqlNull,
toSql "789123456"]]

executeMany insertaA [[toSql "001", toSql "Boligrafo", toSql (0.80::Double)],


[toSql "002", toSql "Regla", toSql (0.75::Double)],
[toSql "003", toSql "Cuaderno", toSql (1.25::Double)]]

executeMany insertaP [[toSql "91", toSql "01/12/2009", toSql "78945612A"],


[toSql "92", toSql "25/12/2009", toSql "79952201K"]]

executeMany insertaPA [[toSql "91", toSql "001", toSql (2::Int)],


[toSql "91", toSql "003", toSql (3::Int)],
[toSql "92", toSql "002", toSql (2::Int)]]

-- Realizar commit
commit conn

-- Desconectar de la BD
disconnect conn

actualizarTiendaBD :: IO ()
actualizarTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Realizar la actualizacion del nombre del articulo con codigo 001 a Boli verde
run conn "UPDATE Articulos SET nombre = 'Boli verde' WHERE codigo = '001'" []

-- Realizar commit
commit conn

-- Desconectar de la BD
disconnect conn

-- Mostrar los nombres de todos los clientes ordenados alfabeticamente


consulta1 :: String
consulta1 = "SELECT dni, nombre \
\FROM Clientes \
\ORDER BY nombre ASC"

-- Mostrar los productos adquiridos en la compra 91


consulta2 :: String
consulta2 = "SELECT cantidad, nombre \
\FROM Articulos, Pedidos_Articulos \
\WHERE codigo = codigo_articulo AND numero_pedido = '91'"

-- Mostrar el total de cada pedido


consulta3 :: String
consulta3 = "SELECT numero_pedido, SUM(cantidad * precio) \
\FROM Articulos, Pedidos_Articulos \
\WHERE codigo = codigo_articulo \
\GROUP BY numero_pedido"

consultarTiendaBD :: String -> IO [[SqlValue]]


consultarTiendaBD consulta =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Realizar la consulta
tuplas <- quickQuery' conn consulta []

-- Realizar commit
commit conn

-- Desconectar de la BD
disconnect conn
-- Devolver las tuplas
return tuplas

eliminarTiendaBD :: IO ()
eliminarTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Realizar el borrado de los articulos cuyo precio sea menor a 1 euro


run conn "DELETE FROM Articulos WHERE precio < ? " [toSql (1::Double)]

-- Realizar commit
commit conn

-- Desconectar de la BD
disconnect conn

infoTiendaBD :: IO()
infoTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Obtenemos la informacion
tables <- getTables conn

-- Mostramos la informacion
putStr (concat (map (++"\n") tables))

-- Desconectar de la BD
disconnect conn

tablaTiendaBD :: IO [[SqlValue]]
tablaTiendaBD =
do
-- Pedir el nombre de la tabla
putStr "Nombre de la tabla: "

-- Guardar el nombre de la tabla


nombre <- getLine

-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Realizar la consulta
tuplas <- quickQuery' conn ("SELECT * FROM " ++ nombre) []

-- Desconectar de la BD
disconnect conn

-- Devolver las tuplas


return tuplas

tablaTiendaBD' :: IO [[SqlValue]]
tablaTiendaBD' = tablaTiendaBD `catchSql` manejador
where manejador e =
do
putStr ("Error: " ++ show e ++ "\n")
tablaTiendaBD'

borrarTiendaBD :: IO()
borrarTiendaBD =
do
-- Conectar con la BD
conn <- connectSqlite3 "TiendaBD.db"

-- Borrar la tabla Pedidos_Articulos


run conn "DROP TABLE Pedidos_Articulos" []
-- Borrar la tabla Articulos
run conn "DROP TABLE Articulos" []
-- Borrar la tabla Pedidos
run conn "DROP TABLE Pedidos" []
-- Borrar la tabla Clientes
run conn "DROP TABLE Clientes" []

-- Realizar commit
commit conn

-- Desconectar de la BD
disconnect conn

Vous aimerez peut-être aussi