Oracle10g ORA-01403“;未找到数据";-UTL_文件

Oracle10g ORA-01403“;未找到数据";-UTL_文件,oracle10g,utl-file,Oracle10g,Utl File,我使用以下脚本创建3个文件: set serveroutput on declare nombreArchivo varchar2(30); f_out UTL_FILE.FILE_TYPE; begin nombreArchivo :='fich_fseek.txt'; dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo escri

我使用以下脚本创建3个文件:

set serveroutput on

declare
  nombreArchivo             varchar2(30);
  f_out                     UTL_FILE.FILE_TYPE;
begin
  nombreArchivo :='fich_fseek.txt';
  dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo escritura.');
  f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'w');
  UTL_FILE.PUT_LINE(f_out,'Hola, me llamo Álvaro.');
  UTL_FILE.PUT_LINE(f_out,'Esto es una prueba para ver cómo funcionan las funciones FSEEK y FGETPOS.');  
  UTL_FILE.PUT_LINE(f_out,'Espero que te diviertas.');
  UTL_FILE.NEW_LINE(f_out,1);
  UTL_FILE.PUT_LINE(f_out,'Atentamente,');
  UTL_FILE.PUT_LINE(f_out,'el que esto escribe'); 
  UTL_FILE.FCLOSE(f_out);

  nombreArchivo :='caracter.txt';
  dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo escritura.');
  f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'w');
  UTL_FILE.PUT(f_out,'a');
  UTL_FILE.FCLOSE(f_out);

  nombreArchivo :='vacio.txt';
  dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo escritura.');
  f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'w');
  UTL_FILE.FCLOSE(f_out);
exception
  when others then -- así me aseguro que cualquier flujo abierto será cerrado
    dbms_output.put_line('Se ha producido un error: '||SQLERRM);
    UTL_FILE.FCLOSE_ALL;
end;
/
当我创建另一个脚本来读取文件而不使用exception子句时,会出现问题:

set serveroutput on

declare
  nombreArchivo             varchar2(30):='fich_fseek.txt';
  --nombreArchivo             varchar2(30):='caracter.txt';
  --nombreArchivo             varchar2(30):='vacio.txt';
  f_out                     UTL_FILE.FILE_TYPE;
  texto                     varchar2(100);
  posición                  pls_integer := 0;

  existe                    boolean;
  tamaño_archivo            number;
  tamaño_bloque             number; 
begin
  UTL_FILE.FGETATTR('TEMPORAL', nombreArchivo, existe, tamaño_archivo, tamaño_bloque);
  if existe then
    if tamaño_archivo > 0 then
      dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo lectura, que tiene un tamaño de '||tamaño_archivo||' bytes.');
      f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'r');

      posición := UTL_FILE.FGETPOS(f_out);
      while posición < tamaño_archivo loop
        UTL_FILE.GET_LINE(f_out, texto);
        dbms_output.put_line('pre  Posición '||posición);
        dbms_output.put_line(texto);
        posición := UTL_FILE.FGETPOS(f_out);
        dbms_output.put_line('post Posición '||posición);
      end loop;

      UTL_FILE.FCLOSE(f_out);
    else
      dbms_output.put_line('El fichero '||nombrearchivo||' está vacío (0 bytes).');
    end if;
  else
    dbms_output.put_line('El archivo '||nombrearchivo||' no existe');
  end if;
end;
/
打开服务器输出
声明
nombrearchivovarchar2(30):=“fich_fseek.txt”;
--nombrearchivovarchar2(30):='caracter.txt';
--nombrearchivovarchar2(30):='vacio.txt';
f_out UTL_FILE.FILE_类型;
texto varchar2(100);
posición pls_整数:=0;
存在布尔;
塔马诺阿奇沃数;
塔马诺-布洛克数;
开始
UTL_FILE.fgetttr('TEMPORAL',nombreArchivo,existe,tamaño_archivo,tamaño_bloque);
如果存在,那么
如果tamaño_archivo>0,则
dbms|u output.put|u line('Abrir el-fichero'| nombrearchivo | | en modo讲师,que tiene un tamaño de'| tamaño|u archivo | bytes');
f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'r');
posición:=UTL_FILE.FGETPOS(f_out);
而posición

然后出现了一个
ORA-01403“未找到数据”
,但只出现了“fich_fseek.txt”文件。

感谢Alex Poole的评论。实际上,如果在Windows中以错误的方式计算新行字符,那么我将使用更正的\u大小:循环,直到读取的\u字节小于更正的\u大小,而不是直到读取的\u字节小于更正的\u大小。校正非常简单,在起始点校正的大小等于文件大小,但每次读取新行时,校正的大小将在一个单位(字节)内减小:

打开服务器输出
声明
nombrearchivovarchar2(30):=“fich_fseek.txt”;
--nombrearchivovarchar2(30):='caracter.txt';
--nombrearchivovarchar2(30):='vacio.txt';
f_out UTL_FILE.FILE_类型;
texto varchar2(100);
posición pls_整数:=0;
存在布尔;
塔马诺阿奇沃数;
塔马诺-布洛克数;
塔马诺·科雷吉多数;
开始
UTL_FILE.fgetttr('TEMPORAL',nombreArchivo,existe,tamaño_archivo,tamaño_bloque);
如果存在,那么
如果tamaño_archivo>0,则
dbms|u output.put|u line('Abrir el-fichero'| nombrearchivo | | en modo讲师,que tiene un tamaño de'| tamaño|u archivo | bytes');
f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'r');
posición:=UTL_FILE.FGETPOS(f_out);
塔马诺·科雷吉多:=塔马诺·阿奇沃;
而posición
使用逐字节读取的替代版本:

set serveroutput on

declare
  nombreArchivo             varchar2(30):='fich_fseek.txt';
  --nombreArchivo             varchar2(30):='caracter.txt';
  --nombreArchivo             varchar2(30):='vacio.txt';
  f_out                     UTL_FILE.FILE_TYPE;
  texto                     varchar2(100) := '';
  posición                  pls_integer := 0;

  existe                    boolean;
  tamaño_archivo            number;
  tamaño_bloque             number;

  flag_acento               boolean := false;
  tamaño_corregido          number;
begin
  UTL_FILE.FGETATTR('TEMPORAL', nombreArchivo, existe, tamaño_archivo, tamaño_bloque);
  if existe then
    if tamaño_archivo > 0 then
      dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo lectura, que tiene un tamaño de '||tamaño_archivo||' bytes.');
      f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'r');

      posición := UTL_FILE.FGETPOS(f_out);
      tamaño_corregido := tamaño_archivo;
      while posición < tamaño_corregido  loop 
        UTL_FILE.GET_RAW(f_out, texto, 1);
        if texto = 'C3' then
          --dbms_output.put_line('Encontrado');
          flag_acento := true; --TODO
          goto CONTINUE;
        end if;
        if flag_acento then
          dbms_output.put_line('Posición '||rpad(posición,3)||' '||texto||': '||utl_raw.cast_to_varchar2('C3'||texto));
          flag_acento := false;
        else
          dbms_output.put_line('Posición '||rpad(posición,3)||' '||texto||': '||CHR(TO_NUMBER(texto,'xx')));
        end if;

        if texto = '0A' then -- caracter de sálto de línea
          --exit;
          tamaño_corregido := tamaño_corregido-1;
        end if;

        <<CONTINUE>> posición := UTL_FILE.FGETPOS(f_out);
      end loop;
      --dbms_output.put_line('ASDF '||CHR(TO_NUMBER('C3','xx'))||CHR(TO_NUMBER('81','xx')));
      /*unión := utl_raw.cast_to_varchar2('C381');
      dbms_output.put_line('ASDF '||unión );*/
      UTL_FILE.FCLOSE(f_out);
    else
      dbms_output.put_line('El fichero '||nombrearchivo||' está vacío (0 bytes).');
    end if;
  else
    dbms_output.put_line('El archivo '||nombrearchivo||' no existe');
  end if;
end;
/
打开服务器输出
声明
nombrearchivovarchar2(30):=“fich_fseek.txt”;
--nombrearchivovarchar2(30):='caracter.txt';
--nombrearchivovarchar2(30):='vacio.txt';
f_out UTL_FILE.FILE_类型;
texto varchar2(100):='';
posición pls_整数:=0;
存在布尔;
塔马诺阿奇沃数;
塔马诺-布洛克数;
flag_acento boolean:=false;
塔马诺·科雷吉多数;
开始
UTL_FILE.fgetttr('TEMPORAL',nombreArchivo,existe,tamaño_archivo,tamaño_bloque);
如果存在,那么
如果tamaño_archivo>0,则
dbms|u output.put|u line('Abrir el-fichero'| nombrearchivo | | en modo讲师,que tiene un tamaño de'| tamaño|u archivo | bytes');
f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'r');
posición:=UTL_FILE.FGETPOS(f_out);
塔马诺·科雷吉多:=塔马诺·阿奇沃;
而posiciónset serveroutput on

declare
  nombreArchivo             varchar2(30):='fich_fseek.txt';
  --nombreArchivo             varchar2(30):='caracter.txt';
  --nombreArchivo             varchar2(30):='vacio.txt';
  f_out                     UTL_FILE.FILE_TYPE;
  texto                     varchar2(100) := '';
  posición                  pls_integer := 0;

  existe                    boolean;
  tamaño_archivo            number;
  tamaño_bloque             number;

  flag_acento               boolean := false;
  tamaño_corregido          number;
begin
  UTL_FILE.FGETATTR('TEMPORAL', nombreArchivo, existe, tamaño_archivo, tamaño_bloque);
  if existe then
    if tamaño_archivo > 0 then
      dbms_output.put_line('Abrir el fichero '||nombrearchivo||' en modo lectura, que tiene un tamaño de '||tamaño_archivo||' bytes.');
      f_out:=UTL_FILE.FOPEN('TEMPORAL',nombreArchivo,'r');

      posición := UTL_FILE.FGETPOS(f_out);
      tamaño_corregido := tamaño_archivo;
      while posición < tamaño_corregido  loop 
        UTL_FILE.GET_RAW(f_out, texto, 1);
        if texto = 'C3' then
          --dbms_output.put_line('Encontrado');
          flag_acento := true; --TODO
          goto CONTINUE;
        end if;
        if flag_acento then
          dbms_output.put_line('Posición '||rpad(posición,3)||' '||texto||': '||utl_raw.cast_to_varchar2('C3'||texto));
          flag_acento := false;
        else
          dbms_output.put_line('Posición '||rpad(posición,3)||' '||texto||': '||CHR(TO_NUMBER(texto,'xx')));
        end if;

        if texto = '0A' then -- caracter de sálto de línea
          --exit;
          tamaño_corregido := tamaño_corregido-1;
        end if;

        <<CONTINUE>> posición := UTL_FILE.FGETPOS(f_out);
      end loop;
      --dbms_output.put_line('ASDF '||CHR(TO_NUMBER('C3','xx'))||CHR(TO_NUMBER('81','xx')));
      /*unión := utl_raw.cast_to_varchar2('C381');
      dbms_output.put_line('ASDF '||unión );*/
      UTL_FILE.FCLOSE(f_out);
    else
      dbms_output.put_line('El fichero '||nombrearchivo||' está vacío (0 bytes).');
    end if;
  else
    dbms_output.put_line('El archivo '||nombrearchivo||' no existe');
  end if;
end;
/