Oracle y Java funcionan bastante bien entre sí, y esta puede ser una nueva idea si te sientes aventurero. Java lo hace con bastante facilidad, pero estoy lejos de una caja de Oracle y no puedo probar. Esto realmente duele, no estoy frente a una máquina de oráculo en este momento. Para asegurarse de que yo no recordaba mal, solía pasos de aquí http://www.dba-oracle.com/tips_oracle_sqlj_loadjava.htm
y luego busqué en Google esto, que es casi palabra por palabra lo que haremos a continuación: http://docstore.mik.ua/orelly/oracle/guide8i/ch09_03.htm
/****
*java and oracle playing together.
*/
import java.util.Date;
public class hex2Date{
//this is if you want to call the java function from a command line outside of oracle
public static void main (String args[]) {
System.out.println (convert (args[0]));
}
public static Date convert(String inHexString){
try{
Date dateResult = new Date(Long.parseLong(inHexString,16));
}catch (NumberFormatException e){
// do something with the exception if you want, recommend at least throwing it.
//throw(e,'some extra message');
}
return dateResult;
}
}
guardar el archivo como Hex2Date.java en el directorio 'yourJava', y desde una línea cmd en ese tipo de directorio:
javac Hex2Date.java
tipo:
java Hex2Date.java 0x4A273F
si obtiene las fechas correctas, y los resultados, vamos a decirle a Oracle sobre nuestra pequeña función. primero necesitará algunos derechos de usuario: GRANT JAVAUSERPRIV A su usuario aquí; tipo siguiente: loadjava -user scott/tigre -resolve Hex2Date.class
ahora envolver esto en PL/SQL, por lo que se le puede llamar en PL/SQL .:
/* java function plsql wrapper: hex2Date.sf */
CREATE OR REPLACE FUNCTION hex2Date ( inHexString IN VARCHAR2) RETURN DATE AS LANGUAGE JAVA NAME 'Hex2Date.convert(java.lang.String) return Date';/
ahora, ejecutarlo desde una línea de SQL: SQL > exec DBMS_OUTPUT.PUT_LINE (hex2Date ('0x4A273F'))
Son estas fechas UNIX? –
¿Tiene alguna otra información sobre la codificación utilizada, o un ejemplo de valor de fecha del cual ya sabe la respuesta? – mtreit
No se puede convertir sin saber lo que representa. Si es YMD, ¿cómo se divide? 4A = 74 (1974?) Como año, pero 27 = 39 que no puede ser mes. Si se trata de un número entero (4A273F = 4859711), es solo el 26 de febrero de 1970 si se trata como un fechador de época de Unix. –