Hace algún tiempo recuerdo haber necesitado generar una contraseña aleatoria en Oracle pero al no encontrar una solución fácil nos fuimos por ponerle de contraseña el mismo nombre de usuario, o sea, si era el usuario “fulanito” le pone la contraseña “fulanito”, esto desde un modulo clásico de “olvide mi contraseña”.
Hoy buscando en Internet la solución para otro problema me tope con el paquete dbms_random de oracle, que entre sus funcionalidades esta la generación de una cadena con caracteres aleatorios, hubiera quedado perfecto para el problema que comento, y no solo sirve para eso, sirve también para generar números aleatorios, pudiendo seleccionar el rango en el que estén esos números.
Pero la opción que considero mas importante es que incluso lo puedo utilizar para seleccionar algún registro aleatorio de una tabla. Me recuerda el “ORDER BY RAND()” de Mysql, aunque no es tan “natural” acá en Oracle como lo es en Mysql, les dejo unos ejemplos de su uso, seguro a mas de uno le ayudara a resolver algo.
Una simple consulta para generar un número aleatorio:
1 2 3 4 5 | SQL> SELECT DBMS_RANDOM.random FROM dual; RANDOM ---------- -267030442 |
Pero resulta que nos puede generar números negativos, fácil, usamos el abs:
1 2 3 4 5 | SQL> SELECT ABS(DBMS_RANDOM.random) FROM dual; ABS(DBMS_RANDOM.RANDOM) ----------------------- 705640851 |
Bueno pero queremos especificar el rango en el que estén esos números:
1 2 3 4 5 | SQL> SELECT DBMS_RANDOM.VALUE(1,10) FROM dual; DBMS_RANDOM.VALUE(1,10) ----------------------- 4.41966315 |
Pero resulta que me regresa números con decimales, fácil, usamos el round:
1 2 3 4 5 | SQL> SELECT ROUND(DBMS_RANDOM.VALUE(1,10)) FROM dual; ROUND(DBMS_RANDOM.VALUE(1,10)) ------------------------------ 4 |
Podemos generar una cadena aleatoria:
1 2 3 4 5 | SQL> SELECT DBMS_RANDOM.string('A', 12) FROM dual; DBMS_RANDOM.STRING('A',12) -------------------------------------------------- mQKXSkedaGpK |
Aquí la explicación del primer parámetro, el segundo solo es la longitud de la cadena:
1 2 3 4 5 | 'a','A' alpha characters only (mixed CASE) 'l','L' LOWER CASE alpha characters only 'p','P' ANY printable characters 'u','U' UPPER CASE alpha characters only 'x','X' ANY alpha-numeric characters (UPPER) |
Y por ultimo la mejor, podemos obtener un registro aleatorio de una tabla, solo es necesario sustituir “id_campo” por el campo llave de su tabla y por supuesto “mitabla” por el nombre real de su tabla:
1 2 3 4 5 | SELECT id_campo FROM (SELECT id_campo FROM mitabla ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM = 1 |
Pero bueno, esa consulta solo me regresa un id, quiero todo el registro, fácil:
1 2 3 4 5 6 7 | SELECT * FROM mitabla mit, (SELECT id_campo FROM mitabla ORDER BY DBMS_RANDOM.VALUE) idv WHERE mit.id_campo = idv.id_campo AND ROWNUM = 1 |
Muchas gracias por la información, me ha venido muy bien 🙂
Saludos.
tengo esta consulta:
String sSql = “SELECT t1 FROM ”
sSql += ” NumFolNC”;
WHERE t1 > 1 AND t1 <= 10 ";
sSql+=" AND NumFolNC = " + folio;
mi pregunta es: como puedo hacer para que el resultado de la busqueda lo compare o lo pueda condicionar en este caso el reultado de sSql!= folio o algo asi
espero de tu atuda muchas gracias
Gracias por la info camarada! de gran utilidad