Access - Pregunta Query Oracle 9i

 
Vista:

Pregunta Query Oracle 9i

Publicado por Druz (2 intervenciones) el 31/08/2004 23:51:23
Hola,

Estoy trabajando con oracle 9i, con ODBC desde ASP (Dll) y tengo un query que genera 5 millones de registro y por tal se colapasa buffer y la maquina colapsa.
Pregunta:
1-Existe una forma de obtener 1 registro de esta consulta (7 millones) y grabar este registro en un archivo de texto y luego limpiar el buffer y luego el siguiente registro.
2- Como puede ejecutar un query en oracle que valla por tramos por ejemplo que me rescate desde el registro 1 al 100.00 y luego ejecuto otro query desde 100.001 hasta 200.000

Gracias Amigos
Atte.
Druz
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Pregunta Query Oracle 9i

Publicado por Alejandro (4142 intervenciones) el 09/05/2023 23:03:48
Hola, Druz.

Para solucionar tu problema, puedes utilizar la cláusula ROWNUM de Oracle para obtener registros de forma secuencial y guardarlos en un archivo de texto. Además, puedes implementar un bucle para procesar los registros en grupos o tramos. Aquí te muestro un ejemplo de cómo podrías hacerlo:

1. Obtener un registro a la vez y guardarlo en un archivo de texto:

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
DECLARE
  v_rownum NUMBER;
  v_file UTL_FILE.FILE_TYPE;
  v_data VARCHAR2(4000); -- Tamaño máximo del registro a guardar
 
BEGIN
  -- Abre el archivo de texto para escritura (reemplaza 'ruta_archivo' con la ubicación y nombre del archivo de salida)
  v_file := UTL_FILE.FOPEN('ruta_archivo', 'w', 32767);
 
  -- Recorre los registros uno por uno
  FOR rec IN (SELECT * FROM tu_tabla ORDER BY columna_de_ordenamiento) LOOP
    -- Genera el registro con los campos necesarios
    v_data := rec.campo1 || ',' || rec.campo2 || ',' || rec.campo3 || ...;
 
    -- Escribe el registro en el archivo de texto
    UTL_FILE.PUT_LINE(v_file, v_data);
 
    -- Limpia el buffer
    UTL_FILE.FFLUSH(v_file);
  END LOOP;
 
  -- Cierra el archivo de texto
  UTL_FILE.FCLOSE(v_file);
 
EXCEPTION
  WHEN OTHERS THEN
    -- Manejo de errores
    IF UTL_FILE.IS_OPEN(v_file) THEN
      UTL_FILE.FCLOSE(v_file);
    END IF;
    RAISE;
END;

Recuerda reemplazar 'ruta_archivo' con la ubicación y nombre del archivo de texto que deseas generar, y ajustar la consulta y el ordenamiento según tus necesidades.

2. Ejecutar un query en tramos utilizando ROWNUM:

Puedes utilizar la cláusula ROWNUM para obtener un rango específico de registros. Aquí tienes un ejemplo:

1
2
3
4
5
6
7
SELECT *
FROM (
  SELECT t.*, ROWNUM AS rn
  FROM tu_tabla t
  WHERE ROWNUM <= 200000 -- Cambia los límites según el tramo que necesites
)
WHERE rn >= 100001; -- Cambia los límites según el tramo que necesites

En el ejemplo anterior, se obtendrán los registros del 100.001 al 200.000 de la tabla "tu_tabla". Ajusta los límites según el tramo que desees obtener.

Espero que esto te ayude a solucionar tu problema. ¡Buena suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar