Mostrando entradas con la etiqueta Trozos de código. Mostrar todas las entradas
Mostrando entradas con la etiqueta Trozos de código. Mostrar todas las entradas

VALORES ALEATORIOS EN PL/SQL. DBMS_RANDOM.VALUE

       Imaginemos que queremos generar ciertos valores aleatorios. A continuación indico las generaciones aleatorias que más uso.


Obtener un listado aleatorio en PL/SQL de alguna tabla

          
                      	 
 select *
 from tabla  t
 where .....
 ORDER BY dbms_random.value;
                				 
                		


Obtener un único registro aleatorio en PL/SQL de alguna de nuestras tablas.

          
                      	 
-- Un solo valor			
FROM (SELECT valor_campo
          FROM tabla
      ORDER BY DBMS_RANDOM.VALUE)
 WHERE ROWNUM = 1;
 
 
 -- Todo el registro				
 SELECT *
  FROM tabla T
       (SELECT clave
          FROM tabla 
      ORDER BY DBMS_RANDOM.VALUE) subtabla
 WHERE t.clave = subtabla.clave
   AND ROWNUM = 1; 
                				 
                		


Crear fecha aleatoria de los últimos 100 días por ejemplo.

          
                      	 
 select sysdate-round(dbms_random.value(0,100),0)
 from dual;
                				 
                		


Generar número de forma aleatoria.

          
                      	 
-- Números negativos y positivos
SELECT DBMS_RANDOM.random FROM dual;

-- Números positivos
SELECT ABS(DBMS_RANDOM.random) FROM dual;

--Bueno pero queremos especificar el rango en el que estén esos números.
SELECT DBMS_RANDOM.VALUE(1,30) FROM dual;

-- Número no deciales
SELECT ROUND(DBMS_RANDOM.VALUE(1,10)) FROM dual;
                				 
                		


La siguiente función la he experimentado hace bastante poco. No la conocía y me ha sorprendido.
Generar una cadena aleatoriamente.

          
                      	 
SELECT DBMS_RANDOM.string('L', 10) FROM dual;
                				 
                		

El primer parámetros tiene el siguiente significado:

  • '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)
  • USO CORRECTO DEL TIPO CLOB

           Como la mayoría de lenguajes de programación, PL/SQL tiene limitaciones de capacidad en los tipos de variable más típicos. Como ejemplo mencionar el VARCHAR2, que puede almacenar hasta 32K de información. La solución, cuando se va a sobrepasar este límite, es utilizar el tipo de datos CLOB.


           Entonces, ¿Por qué no nos curamos en salud y utilizamos siempre el tipo de datos CLOB?

           Vemos un ejemplo típico

              
                            
      declare
        v_clob clob;
        v_cadena varchar2(200) := 'texto a concatenar';
      begin
        for i in 1..100000 loop
          v_clob := v_clob || v_cadena;
        end loop;
      end;
                         
                      

           Funcionalmente, lo anterior es perfecto, pero el coste es altísimo. La concatenación de CLOB’s es muy costosa en comparación con el resto de operaciones. Así, la utilización de un “buffer” o variable VARCHAR2 en la cual vayamos almacenando los resultados intermedios ahorra más coste.

           Es decir, es mejor acumular la información en un VARCHAR2 y sólo volcarla en CLOBs cuando sea estrictamente necesario:

              
                            
    declare
        v_clob clob;
        v_texto varchar2(32767);
      v_cadena varchar2(200) := 'texto a concatenar';
      begin
        for i in 1..100000 loop
          if length(v_texto) + length(v_cadena) <= 32767 then
            v_texto := v_texto || v_cadena;
          else
            v_clob := v_clob || v_texto;
            v_texto := v_cadena;
          end if;
        end loop;
        v_clob := v_clob || v_texto;
      end;