miércoles, 6 de junio de 2012

Obtener columnas pertenecientes a un constraint


select a.*, c.part1, c.part2, c.part3 from syscolumns a, sysconstraints b, sysindexes c
where a.tabid = b.tabid and b.tabid = c.tabid and b.idxname = c.idxname
and b.constrname like 'pk_tblsolicitud_prod_detalle1'

martes, 31 de enero de 2012

Informix - Funciones de fecha


Las funciones de fecha de Informix acpetan argumentos DATE o DATETIME, o
una representacion en caracteres de un valor DATE o DATETIME. Tipicamente
devuelven valores DATE o DATETIME, o convierten los valores DATE o DATETIME
a cadenas de caracteres.

ADD_MONTHS

SELECT ADD_MONTHS(DATE('1986/08/24'), 2) FROM (SELECT LIMIT 1 1 FROM systables)
SELECT ADD_MONTHS(DATE('1986/08/24'), -2) FROM (SELECT LIMIT 1 1 FROM systables)

DATE

La funcion DATE convierte su argumento a un valor DATE. El argumento puede
ser cualquier expresion que pueda ser convertida a DATE, usualmente CHAR,
DATETIME, o INTEGER.

SELECT DATE('1986/08/24') FROM (SELECT LIMIT 1 1 FROM systables)
SELECT DATE(-1) FROM (SELECT LIMIT 1 1 FROM systables)

DAY, MONTH, YEAR

Recibe un argumento DATE o DATETIME y devuelve el dia del mes como un entero en
el rango de 1 al maximo numero de dias del mes en cuestion. Lo mismo aplica para
MONTH y YEAR respectivamente.

SELECT DAY(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
SELECT MONTH(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)
SELECT YEAR(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)

WEEKDAY

Recibe un argumento DATE o DATETIME y devuelve un entero en el rango del 0 al 6
que representan el dia de la semana. Cero representa al Domingo, uno al lunes, etc.

SELECT WEEKDAY(DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)

MONTHS_BETWEEN

SELECT MONTHS_BETWEEN(DATE('1987/08/24'), DATE('1986/08/24')) FROM (SELECT LIMIT 1 1 FROM systables)

LAST_DAY

Requiere una expresion DATE o DATETIME como argumento. Esta devuelve el ultimo
dia del mes que el argumento especifica.

SELECT DAY(LAST_DAY(DATE('1987/08/24'))) FROM (SELECT LIMIT 1 1 FROM systables)

NEXT_DAY

Requiere una expresion DATE o DATETIME como primer argumento, y requiere un segundo
argumento weekday que es una cadena en mayusculas representando la abreviatura de el
nombre en Ingles para un dia de la semana. Devuelve

SELECT NEXT_DAY(DATE('1986/08/24'), 'SAT') FROM (SELECT LIMIT 1 1 FROM systables)

MDY

SELECT MDY(1, 24, 1986) FROM (SELECT LIMIT 1 1 FROM systables)

TO_CHAR

Convierte una expresion que evalua DATE o DATETIME o un valor numerico a una
cadena de caracteres.

SELECT TO_CHAR(DATE('1986/08/24'), '%Y-%m-%d') FROM (SELECT LIMIT 1 1 FROM systables)

TO_DATE

Convierte una cadena de caracteres a un valor DATETIME.

SELECT TO_DATE('1986/08/24', '%Y/%m/%d') FROM (SELECT LIMIT 1 1 FROM systables)

Comparacion entre fechas

SELECT DATE('1986/08/24') > DATE('1984/08/24')  FROM (SELECT LIMIT 1 1 FROM systables)

Ejecutando Store Procedures en aplicaciones JDBC


Para este ejemplo se necesitan dos elementos, un store procedure de prueba y una clase
de java que ejecute el store procedure.

El store procedure recibe dos parametros de entrada y un parametro de salida, los parametros
de salida se declaran como si fueran parametros de entrada pero con la palabra reservada
OUT (un parametro tambien puede ser de entrada y salida INOUT).

La clase de java ejecuta el store procedure, primero obtiene un objeto ResultSet que es
el resultado de la sentencia RETURN de nuestro store procedure. Posteriormente obtiene
el objeto del parametro de salida OUT.


Store Procedure

CREATE PROCEDURE storeProcedurePrueba ( int_uno INT, int_dos VARCHAR, OUT resultado INT)
RETURNING INTEGER;
BEGIN
  LET resultado = int_uno * int_dos;
  RETURN resultado;
END
END PROCEDURE
DROP PROCEDURE storeProcedurePrueba

Clase Java

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

public class InformixStoreProcedure {

public static void main(String[] args) {
Connection conn = null;
String url = "jdbc:informix-sqli://192.168.0.120:1526/bd:informixserver=server";
String driver = "com.informix.jdbc.IfxDriver";
String user = "informix";
String pass = "informix";
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pass);
System.out.println("Conectado a la base de datos !!!");

//Notar que son tres parametros
String sqlCall = "{call storeProcedurePrueba(?, ?, ?)}";
CallableStatement sp = conn.prepareCall(sqlCall);

sp.setInt(1, 5);
sp.setString(2, "4");
sp.registerOutParameter(3, Types.INTEGER);

ResultSet rs = sp.executeQuery();
while (rs.next()) {
System.out.println(rs.getObject(1));
}

Integer resultado = sp.getInt(3);

System.out.println("Resultado de la ejecucion: " + resultado);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

Referencias

http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.jdbc_pg.doc/jdbc031409727.htm
http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic=/com.ibm.jccids.doc/com.ibm.db2.luw.apdv.java.doc/doc/tjvcscsp.htm