我在Oracle Linux 7.2上有文本文件(iso-8859-1),我试图在Oracle DB 12.1c(AL32UTF8)上加载表。
declare
f Utl_File.File_Type;
v_Buffer varchar2(1000);
v_Table Parse.Varchar2_Table;
v_Nfields integer;
begin
f := Utl_File.Fopen('SA', '1.txt', 'R');
if Utl_File.Is_Open(f) then
loop
begin
Utl_File.Get_Line(f, v_Line, 1000);
if v_Line is null then
exit;
end if;
Parse.Delimstring_To_Table(v_Line, v_Table, v_Nfields, Chr(9));
--insert into ...
end if;
exception
when No_Data_Found then
exit;
end;
end loop;
end if;
Utl_File.Fclose(f);
end;
使用this解析
我在pl / sql开发人员中输出了漂亮(正确)的消息"一个或多个UTF8字段包含非UTF 8数据,编辑可能会产生意外结果"
和Apex 5中的输出不正确。
我可以用这个做点什么吗?我转发?在甲骨文和更多...翻译...
更新1
select *
from nls_database_parameters
where parameter like '%CHARACTERSET%';
PARAMETER VALUE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
答案 0 :(得分:1)
UTL_FILE期望UTL_FILE.FOPEN在文本模式下打开的文件在数据库字符集中进行编码。
显然事实并非如此。
使用DBMS_LOB.OPEN()打开一个BFILE(请参阅BFILENAME)作为RAW
值,并使用UTL_I18N.RAW_TO_CHAR()函数将其转换为VARCHAR2。
然后,您可以使用Parse.Delimstring_To_Table
函数来解析行。
考虑使用EXTERNAL TABLE或SQL*Loader,也许它们更容易使用。