jueves, 3 de diciembre de 2009

Cómo ejecutar un archivo sql desde SQL Plus

Para ejecutar un archivo sql desde SQL Plus se pasa como comando la ruta del archivo precedida de un símbolo de arroba(@). Ejemplo:

SQL> @C:\scripts\InsertsBD.sql

viernes, 27 de noviembre de 2009

ajaxEngine.sendRequest : Envío dinámico de parámetros

El uso normal de este método es el siguiente:
ajaxEngine.sendRequest('loadData', 'paramName1=' + paramValue1, ..., 'paramNameN=' + paramValueN);
Esto es válido cuando el número de parámetros es fijo. Pero en algunos casos, ese número de parámetros puede variar, por ejemplo si vamos a enviar los valores de un arreglo javascript (como los del post anterior). En tal caso, no resulta tan sencillo el llamado a dicho método. Pero la solución está aquí:
var queryS = "parteNombre="+parteNombre + "&incluir="+incluir;

for (i = 0; i < roles.length; i++){
   queryS += "&roles=" + roles[i];
}

var opt = {
  method: 'post',
  postBody: queryS,

onSuccess: function(t) {
},

on404: function(t) {
},

onFailure: function(t) {
}
};

ajaxEngine.sendRequest('loadData', opt);
Primero se crea el queryString con todos los parámetros que queremos enviar y luego se le pasa dinámicamente esa variable al postBody. La verdad no entiendo muy bien cómo funciona, pero funciona. Visto en http://forum.openrico.org/topic/519

Cómo enviar un arreglo en el request

No debe ser algo muy común, pero necesité enviar un arreglo de javascript en un request.
Digo que no debe ser algo muy común, porque pues para eso está el input checkbox.

Pero en este caso la idea no era que lo enviara el usuario sino que el arreglo se carga con variables de la jsp.

En fin, el caso es que para enviar ese arreglo como un parametro en el request, lo que toca hacer es enviar cada uno de los valores del arreglo con el mismo nombre de parámetro. Entonces el querystring sería:
...ActualizarRoles?roles=1&roles=3&roles=4&roles=8

Ya en el servlet, los valores se reciben de la misma manera que se reciben los valores de los checkboxes:
String [] roles = request.getParameterValues("roles");

lunes, 23 de noviembre de 2009

Rico: Too much recursion


Este error ha aparecido con algunas versiones de Rico. Lo que se debe hacer es usar una versión que no tenga el problema.

Pero me acaba de pasar con una versión de Rico que no tiene ese problema. Después de darle muchas vueltas encontré que estaba incluyendo dos veces cada una de las librerías prototype.js y rico.js.

Al dejar la inclusión de solo una de cada una, se resolvió el problema.

miércoles, 2 de septiembre de 2009

Obtener el referer de un servlet

Para obtener el referer (la url desde la que se hizo la petición) de un servlet basta con utilizar lo siguiente:
public void processRequest(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse) throws ServletException{
...
   String referer = httpservletrequest.getHeader("referer");
...
}

jueves, 27 de agosto de 2009

Conexión a BD Derby: El esquema no existe

Cuando se crea una nueva base de datos en Derby a través de NetBeans éste no crea el esquema. Es necesario crearlo antes de poder usarlo en una aplicación, de lo contrario nos encontraremos con un mensaje de error diciendo que el esquema que intentamos usar no existe.

Para crear el esquema basta con abrir una conexión a la BD y ejecutar:
CREATE SCHEMA nombredelesquema;

martes, 11 de agosto de 2009

Sentencias en Oracle con ampersand

Cuando se va a hacer un insert o update en SQL*Plus que contenga el símbolo ampersand (&), se pueden obtener resultados que no esperamos.
INSERT INTO empresa values('A & B')
SQL*Plus intentará resolver lo que haya después del ampersand como si se tratara de una variable.
Hay dos maneras para poder realizar correctamente el insert:

Opción 1:
SET DEFINE OFF
INSERT INTO empresa values('A & B')
Opción 2:
INSERT INTO empresa values('A &'||' B')
En la segunda opción cada ampersand que vayamos a insertar debe quedar al final de una cadena y luego concatenamos el resto de lo que queremos insertar.

martes, 9 de junio de 2009

Oracle Functions Decode y Sign

Estas funciones son bastante útiles cuando se necesita seleccionar un valor u otro dependiendo de cierta condición.
La función Decode trabaja como un IF-THEN-ELSE o como un IF-THEN-ELSEIF-ELSEIF-...-ELSE. Su sintaxis es:
decode( expression , search , result [, search , result]... [, default] )
En los parámetros, expression es el valor que queremos comparar y cada par search-result, funciona como un if, es decir, IF search THEN result. Mejor escribo un ejemplo:
SELECT decode( codigo_empresa, 100, 'Yahoo!', 200, 'Google', 300, 'Sun') FROM empresa;
Esto es como si hicieramos algo como:
if ( codigo_empresa == 100 ){
  echo 'Yahoo!';
}
else if( codigo_empresa == 200 ) {
  echo 'Google';
}
else if( codigo_empresa == 300 ) {
  echo 'Sun';
}
La función Sign nos devuelve un valor para indicar si un número es positivo, negativo o cero (0). Ejemplos:
SELECT sign(-5) from dual;   -- Devuelve -1
SELECT sign(1000) from dual;   -- Devuelve 1
SELECT sign(0) from dual;   -- Devuelve 0
SELECT sign(0.0001) from dual;   -- Devuelve 1
Ahora, cómo usar juntas estas funciones para obtener un gran provecho? Supongamos que tenemos dos tablas con estructuras similares, donde manejamos unos valores para diario, semanal y mensual. En una de las tablas manejamos los detalles y en la otra manejamos los "topes" máximos que se van a obtener al consultar.
SELECT
decode( sign( det.diario - tope.diario ), -1, det.diario, 0, det.diario, tope.diario ) AS diario
decode( sign( det.semanal - tope.semanal ), -1, det.semanal, 0, det.semanal, tope.semanal ) AS semanal
decode( sign( det.mensual - tope.mensual ), -1, det.mensual, 0, det.mensual, tope.mensual ) AS mensual
FROM detalle det, tope;
Este query nos va a traer el valor más bajo de las columnas diario, semanal y mensual entre la tabla Detalle y la tabla Tope.

viernes, 5 de junio de 2009

Control de cache en conexiones seguras

Hace poco me salía el siguiente error cuando descargaba un archivo por medio de un servlet desde un sitio seguro a través de Internet Explorer.



Extrañamente, en Firefox este error no se presentaba.
Después de buscar un rato (creo que fue más de un rato) a qué se debía el error, encontré que el problema parece ser un bug de IE (que raro!) y se genera por el uso de una etiqueta que había puesto en el encabezado de la respuesta. La etiqueta que yo tenía es:

Pragma: null

Internet Explorer tiene problemas con este encabezado cuando el sitio es seguro. La solución fue demasiado sencilla, eliminar la etiqueta en cuestión y utilizar la siguiente:

Cache-Control: private

En mi caso puse las cabeceras así :
response.setHeader("Cache-Control", "private");
response.setHeader("Pragma", null);
response.setHeader("Expires", null);
Y ahora sí funciona.