Quien soy? RSS feed Enviar por email Imprimir Parar este menu Ir arriba
Blogzote.com
Mexico, informatica, internet, musica y algo mas…

Types en Oracle

Desde que empecé a trabajar con Oracle siempre me tope con problemas del tipo, ¿Cómo mandar a un procedimiento un set de registros? ¿Cómo regresar de un paquete un campo multi-registro? La solución al viejo estilo siempre quedaba en mandar el resultado a una tabla temporal y después manejar esa información desde la tabla temporal, una solución bastante sucia y poco confiable, se tenían problemas de concurrencia e integridad.

Desde hace un buen rato Oracle maneja varias soluciones para este problema, desde las “global temporary table” (que en otra ocasión hablare de ellas) hasta los “types” existen varias otra opciones que no he manejado, por lo que solo hablare aquí de los tipos (o “types” según se les quiera llamar).

Su uso es bastante sencillo, pero en lugar de explicarlo dejo un ejemplo, es una simple unidad de programa para ver el resultado desde sql*plus, toad o alguna otra herramienta del estilo, espero les sirva:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DECLARE
 
  TYPE type_record IS RECORD ( campo1   VARCHAR2(20),
                               campo2   VARCHAR2(20),
                               campo3   VARCHAR2(20),
                               campo4   VARCHAR2(20),
                               campo5   VARCHAR2(20) );
 
  TYPE type_table IS TABLE OF type_record INDEX BY BINARY_INTEGER;
 
  v_type_table  type_table;
 
BEGIN
 
  FOR i IN 1..5 LOOP
 
      v_type_table(i).campo1 := i;
      v_type_table(i).campo2 := i+1;
      v_type_table(i).campo3 := i+2;
      v_type_table(i).campo4 := i+3;
      v_type_table(i).campo5 := i+4;
 
  END LOOP;
 
  FOR i IN 1..v_type_table.COUNT LOOP
 
      DBMS_OUTPUT.put_line(v_type_table(i).campo1||'-'||
                           v_type_table(i).campo2||'-'||
                           v_type_table(i).campo3||'-'||
                           v_type_table(i).campo4||'-'||
                           v_type_table(i).campo5);
 
  END LOOP;
 
END;
Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Cargando ... Cargando ...

No al Metro bus

Generalmente de lunes a viernes cuando regreso del trabajo lo hago tomando un tramo del Eje 4 Sur, ha sido la mejor ruta que he encontrado para evitar un poco de tráfico en nuestra caótica ciudad, lo tomo desde su cruce con Churubusco hasta su término en periférico.

Hace unos días me tope con una pancarta colgada a un microbús que hablaba, entre otras cosas, de la afectación a no se cuantas familias, de la perdida del trabajo de no se cuantos conductores de microbús, que los apoyáramos, etc. por la construcción del metro bus sobre el mencionado eje.

no al metrobus

Al leerlo no pude mas que soltar una risa burlona, mira nada mas quien viene ahora a pedir apoyo, nada mas y nada menos que los microbuseros, esos parásitos de la ciudad, esos que atropellan a no se cuanta gente al año, y matan en accidentes automovilísticos a no se cuanta gente mas, esos que son capaces de quedarse cinco minutos esperando pasaje en una esquina, esos que son capaces de subir pasaje hasta en tercera fila sin importarles la demás gente que circula atrás de ellos, esos que son capaces de conducir a exceso de velocidad sin importarles la gente que llevan como pasajeros, esos que conducen con la patas, esos que pueden hacer bases en cualquier lado sin importarles el trafico que provoquen, esos que se atreven a circular por adentro de periférico y para acabarla hasta bajar pasaje ahí, esos que cambian los asientos del vehículo haciéndolos mas chiquitos para meter mas gente quedando súper incómodos, esos que si los topas estando de malas ten cuidado por que pudieras salir con varias mentadas de mama (en el mejor de los casos) y que si te los topas de buenas tendrás que aguantar “la z” todo el camino.

Esos ahora vienen a pedir apoyo, por supuesto que de mi parte no lo tienen y creo que de cualquier automovilista del DF no lo tendrían, igual los únicos que los apoyan son sus familias, y no es algo inventado, llevan años haciendo lo que quieren, ellos son los únicos responsables de que se este pensando en un transporte alternativo y no se les este considerando, en fin, ahora será ver cuanto nos dura el metro bus, con eso de que tienen un mantenimiento de caricatura, apenas me tope con un camión que ya suelta humo como si fuera de volteo, ¿les estará pasando como a los viejos ruta 100? que les aventaban petróleo en lugar de gasolina, al rato que se descompongan van a empezar a quitarle piezas a otro, o al rato ya van a tener mil golpes, van a estar todos mugrosos, o se van a descomponer a cada rato.

Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Cargando ... Cargando ...

¡Faltaron dos!

Hoy leyendo las noticias me topo con una un poco fuera de lo normal, resulta que publicaron en Internet la lista de pasajeros del Titanic, si, nada mas y nada menos de aquel majestuoso trans-atlántico que se hundió hace 95 años, aquí la noticia:

Los nombres, edades y profesiones de los pasajeros del Titanic fueron publicados en internet por primera vez, 95 años después de que el crucero se hundiera en aguas del Atlántico durante su viaje inaugural.

De acuerdo con la página electrónica de El País docenas de hojas con la lista original de pasajeros, escritas a mano, están disponibles en la red, incluida la clasificación de quienes viajaban en el barco.

La lista recoge los planes de muchas personas que partieron de Southampton buscando una nueva vida en Estados Unidos en 1912. Sin embargo, el crucero de la White Star, considerado “insumergible”, zarpó el 10 de abril y se hundió cinco días después, tras chocar con un iceberg; en el naufragio murieron mil 523 personas.

El documento de 34 páginas se encontraba hasta el momento en los Archivos Nacionales de Kew, al suroeste de Londres, en el Reino Unido, y solo podía ser consultado bajo supervisión.

En la lista se encuentran los detalles de personas que compraron un boleto para viajar a Nueva York en el Titanic pero que nunca llegaron a subir.

Nota completa

Tengo poco que comentar al respecto, solo que les faltaron dos personas, en la lista nunca encontré a Leonardo DiCaprio ni a Kate Winslet, ¿Cómo? Si yo los vi en el cine y como 400 veces (mas las que se acumulen) en la tele arriba del barco, yo vi como volaba en la punta del barco agarrada del Dicaprio, yo vi como se aventaban un rapidin en un coche, yo vi como resultaba que ella lo salvaba de morir ahogado para al final morir congelado por salvarla (película tenia que ser) en fin, muchas cosas mas bien mamilas que hicieron y no están en la lista, ha que cosas tiene la vida.

Sin comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Cargando ... Cargando ...

Registros duplicados en Oracle

Como suele pasar, se me olvido crear la llave primaria para una tabla, resultando que se insertaran registros duplicados en ella, ahora, ¿Cómo los elimino? Muy fácil, encontré, rascándole a google, una instrucción estándar para borrar registros duplicados:

1
2
3
4
5
DELETE FROM tabla
 WHERE ROWID NOT IN
            (SELECT MIN(ROWID)
               FROM tabla
              GROUP BY columna1, columna2, columna3...);

Donde por supuesto “tabla” es el nombre de la tabla y “columna1″, “columna2″, etc. Es la llave que identifica a cada registro.

* 10 Comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Cargando ... Cargando ...

Procesar csv en oracle

Esta está facilita, me tope con la necesitad de procesar un archivo csv (comma separated values o valores separados por coma) con utl_file no tuve mayor problema para leer el archivo, ¿pero la cadena (o registro) del archivo, como la leo? Fácil, cree una función a la que se le manda la cadena a procesar y la posición de la columna que deseas y te regresa su valor.

Si tienes por ejemplo la cadena:

1
11111,22222,33333,44444,55555

Necesitas sacar de esa cadena el 3 campo, o sea, el valor “33333″, solo generas la llamada a la función:

1
variable := get_string_value (3,11111,22222,33333,44444,55555);

Aquí les dejo la función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
--
  -- GET_STRING_VALUE
  --
  -- return the string value for a string id "p_string_id"
  -- in a csv string "p_string"
  -- 
  FUNCTION get_string_value (
     p_string_id            IN      NUMBER,
     p_string               IN      VARCHAR2) 
     RETURN VARCHAR2 IS
 
     v_string_value VARCHAR2(200);
  BEGIN
 
    IF (INSTR(p_string,',') > 0) AND
       (p_string_id         > 0) THEN
       IF p_string_id = 1 THEN
          v_string_value := SUBSTR(p_string, 0, INSTR(p_string,',',1,1)-1);
       ELSE
         IF (INSTR(p_string,',',1,p_string_id-1) > 0) AND
            (INSTR(p_string,',',1,p_string_id)   > 0) THEN			
            v_string_value := SUBSTR(p_string, INSTR(p_string,',',1,p_string_id-1)+1, 
                                              (INSTR(p_string,',',1,p_string_id)-1 - 
                                               INSTR(p_string,',',1,p_string_id-1)));
         ELSIF
            (INSTR(p_string,',',1,p_string_id-1) > 0) AND
            (INSTR(p_string,',',1,p_string_id)   = 0) THEN			
            v_string_value := SUBSTR(p_string, INSTR(p_string,',',1,p_string_id-1)+1, 
                                             (LENGTH(p_string) - 
                                               INSTR(p_string,',',1,p_string_id-1)));
         END IF;
       END IF; 
    END IF;
 
    RETURN v_string_value;
 
  END get_string_value;

Por supuesto no es la única forma de procesar una cadena con valores separados por coma, acá tengo otra forma mediante un loop:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE
  v_line      VARCHAR2(1000);
  v_value     VARCHAR2(100);  
  v_index     NUMBER;
BEGIN
  v_line  := '11111,22222,33333,44444,55555';
  v_index := 0;
  FOR i IN 1.. LENGTH(v_line) LOOP
      IF (SUBSTR(v_line, i, 1) = ',') OR
         (LENGTH(v_line)       = i  ) THEN
         --aqui lo que deseas hacer para cada valor 
         --v_value tendra el valor del campo 
         v_value := REPLACE(SUBSTR(v_line, v_index+1, (i-v_index)), ',','');
         v_index := i;
      END IF;
  END LOOP;
END;
* 2 Comentarios Email Imprimir
1 Estrella2 Estrellas3 Estrellas4 Estrellas5 Estrellas (Sin Valorar)
Cargando ... Cargando ...