在通过 Apex 将文本文件导入 Oracle DB 期间处理特殊字符
Handle special characters during textfile import into OracleDB via Apex
我正在开发一种将文本文件导入 BLOB 列 (OracleDB) 的工具。这是通过带有文件浏览按钮和连接的导入程序的 Apex 页面处理的。
有关导入到 BLOB 过程的更多详细信息:http://ittichaicham.com/2011/03/file-browser-in-apex-4-with-blob-column-specified-in-item-source-attribute/
我使用的文本文件包含特殊字符、空值、十进制分隔符等。例如:
(...) 111888|Overflakkée, Blabla|streetname with Rhône||12-13|UXC
Placename (...)
由于都是字符数据,我将使用以下过程将 BLOB 转换为 CLOB:
FUNCTION blob_to_clob (blob_in IN BLOB)
RETURN CLOB
AS
v_clob CLOB;
v_varchar VARCHAR2(32767);
v_start PLS_INTEGER := 1;
v_buffer PLS_INTEGER := 32767;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
LOOP
v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start));
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
v_start := v_start + v_buffer;
END LOOP;
RETURN v_clob;
END blob_to_clob;
查看更多信息:http://www.dba-oracle.com/t_convert_blob_to_clob_script.htm
问题:
在将 blob 转换为 clob 时,一些特殊字符是 lost/altered。
例如,这一行:
(...) 111888|Overflakkée, Blabla|streetname with Rhône||12-13|UXC
Placename (...)
将成为这一行:
(...) 111888|Overflakk� Blabla|streetname with Rh�|12-13|UXC
Placename (...)
行长度、字符甚至分隔符(在本例中为“|”)altered/not可见。
- 有没有办法获取丢失的字符 + 保留 seperators/null 值? (如果有必要将'é'更改为'e',那很好)。
- 是否有更有效的方法将文本文件导入 BLOB/CLOB 列?
此致
您需要将源字符集转换为数据库的字符集
这里是我做的一个例子(主要是为了获取大的json对象,javascript是utf8,在8859p1数据库中使用),很简单我就不解释了太多了。
转换使用示例:
l_clob := blob_to_clob (l_blob, '1');
函数:
function blob_to_clob (blob_in in blob, p_convertutf8 in char default 0)
return clob as
/* Ólafur Tryggvason */
l_clob clob;
l_varchar varchar2 (32767);
l_start pls_integer := 1;
l_buffer pls_integer := 32767;
l_characterset nls_database_parameters.value%type;
begin
select value
into l_characterset
from nls_database_parameters
where parameter = 'NLS_CHARACTERSET';
dbms_lob.createtemporary (l_clob, true);
for i in 1 .. ceil (dbms_lob.getlength (blob_in) / l_buffer) loop
l_varchar := utl_raw.cast_to_varchar2 (dbms_lob.substr (blob_in, l_buffer, l_start));
if p_convertutf8 = '1' then
l_varchar := convert (l_varchar, l_characterset, 'UTF8'); -- WE8ISO8859P1
end if;
dbms_lob.writeappend (l_clob, length (l_varchar), l_varchar);
l_start := l_start + l_buffer;
end loop;
return l_clob;
end blob_to_clob;
我正在开发一种将文本文件导入 BLOB 列 (OracleDB) 的工具。这是通过带有文件浏览按钮和连接的导入程序的 Apex 页面处理的。
有关导入到 BLOB 过程的更多详细信息:http://ittichaicham.com/2011/03/file-browser-in-apex-4-with-blob-column-specified-in-item-source-attribute/
我使用的文本文件包含特殊字符、空值、十进制分隔符等。例如:
(...) 111888|Overflakkée, Blabla|streetname with Rhône||12-13|UXC Placename (...)
由于都是字符数据,我将使用以下过程将 BLOB 转换为 CLOB:
FUNCTION blob_to_clob (blob_in IN BLOB)
RETURN CLOB
AS
v_clob CLOB;
v_varchar VARCHAR2(32767);
v_start PLS_INTEGER := 1;
v_buffer PLS_INTEGER := 32767;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer)
LOOP
v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start));
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar);
v_start := v_start + v_buffer;
END LOOP;
RETURN v_clob;
END blob_to_clob;
查看更多信息:http://www.dba-oracle.com/t_convert_blob_to_clob_script.htm
问题: 在将 blob 转换为 clob 时,一些特殊字符是 lost/altered。
例如,这一行:
(...) 111888|Overflakkée, Blabla|streetname with Rhône||12-13|UXC Placename (...)
将成为这一行:
(...) 111888|Overflakk� Blabla|streetname with Rh�|12-13|UXC Placename (...)
行长度、字符甚至分隔符(在本例中为“|”)altered/not可见。
- 有没有办法获取丢失的字符 + 保留 seperators/null 值? (如果有必要将'é'更改为'e',那很好)。
- 是否有更有效的方法将文本文件导入 BLOB/CLOB 列?
此致
您需要将源字符集转换为数据库的字符集
这里是我做的一个例子(主要是为了获取大的json对象,javascript是utf8,在8859p1数据库中使用),很简单我就不解释了太多了。
转换使用示例:
l_clob := blob_to_clob (l_blob, '1');
函数:
function blob_to_clob (blob_in in blob, p_convertutf8 in char default 0)
return clob as
/* Ólafur Tryggvason */
l_clob clob;
l_varchar varchar2 (32767);
l_start pls_integer := 1;
l_buffer pls_integer := 32767;
l_characterset nls_database_parameters.value%type;
begin
select value
into l_characterset
from nls_database_parameters
where parameter = 'NLS_CHARACTERSET';
dbms_lob.createtemporary (l_clob, true);
for i in 1 .. ceil (dbms_lob.getlength (blob_in) / l_buffer) loop
l_varchar := utl_raw.cast_to_varchar2 (dbms_lob.substr (blob_in, l_buffer, l_start));
if p_convertutf8 = '1' then
l_varchar := convert (l_varchar, l_characterset, 'UTF8'); -- WE8ISO8859P1
end if;
dbms_lob.writeappend (l_clob, length (l_varchar), l_varchar);
l_start := l_start + l_buffer;
end loop;
return l_clob;
end blob_to_clob;