Oracle10g ORA-01403“;未找到数据";-UTL_文件
我使用以下脚本创建3个文件: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
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;
/