Oracle BLOB文件(日文字符)插入表

Oracle BLOB文件(日文字符)插入表,oracle,plsql,oracle11g,character-encoding,blob,Oracle,Plsql,Oracle11g,Character Encoding,Blob,我发现blob文件包含日语字符。以下是我的示例文本文件: 100100Œ©ÏˆË—Š•i”Ô•ªŠ„Žž‚Ì“®ìŠm”F 但在我的表中插入后才包含 100100¿¿¿¿¿¿¿i¿¿¿¿¿¿¿¿¿¿¿¿¿F 我如何得到与原始数据相同的表 这是我的解析脚本 FUNCTION f_parse_brow (messages IN BLOB, st IN NUMBER, st_next OUT NUMBER) RETURN VARCHAR2 is buffer_size INTEGER

我发现blob文件包含日语字符。以下是我的示例文本文件:

100100Œ©ÏˆË—Š•i”Ô•ªŠ„Žž‚Ì“®ìŠm”F
但在我的表中插入后才包含

100100¿¿¿¿¿¿¿i¿¿¿¿¿¿¿¿¿¿¿¿¿F
我如何得到与原始数据相同的表

这是我的解析脚本

FUNCTION f_parse_brow (messages IN BLOB, st IN NUMBER, st_next OUT NUMBER) 
RETURN VARCHAR2 is

buffer_size   INTEGER          := 64000;
buffer        RAW (32676);
pattern       RAW (300)        := UTL_RAW.cast_to_raw (CHR (10));
v_temp        INTEGER;
var_buf       VARCHAR2 (32767);
st1           NUMBER;

begin
  v_temp := DBMS_LOB.INSTR (messages, pattern, st, 1);

 st1 := st;
 IF v_temp > 0
 THEN       
  buffer := DBMS_LOB.SUBSTR (messages, v_temp-st1, st1);
 ELSE        
  buffer := DBMS_LOB.SUBSTR (messages, buffer_size, st1);
 END IF;
 var_buf := UTL_RAW.cast_to_varchar2 (buffer);

 st_next := v_temp + 1;
 RETURN var_buf;
end f_parse_brow;
然后将数据填充到表中

Procedure p_populate_data(errbuf out varchar2,retcode out number,p_id in 
number,p_type in varchar2) is
--
l_lob                       BLOB;
str                         NUMBER            := 1;
str2                        NUMBER            := 2;
v_num                       NUMBER            := 1;
bvar_buf                    VARCHAR2 (32000);
bvar_buf2                   VARCHAR2 (32000);  
v_pcktab                    datatabtyp;
v_pckdatatab                bdatatabtyp;
--
vMESSAGE       VARCHAR2(3000);
V_PLAN_ID      NUMBER;
V_LENGTH       NUMBER;
VERR           VARCHAR2(500);  
--

BEGIN

select blob_content 
into l_lob
from GIIC_UPLOAD_FILE
where status='O'
and FILE_ID=p_id
AND FILE_NAME = P_TYPE;
--
--

WHILE str2 > 1
  LOOP
     bvar_buf := f_parse_brow (l_lob, str, str2);    


     IF (SUBSTR (bvar_buf, 1, 1) IS NOT NULL
         OR SUBSTR (bvar_buf, 1, 1) <> '')
     THEN
        SELECT length(BVAR_BUF) INTO V_LENGTH FROM DUAL;
        v_pcktab (v_num).data_file := bvar_buf;
        v_num := v_num + 1;

     ELSE
        EXIT;
     END IF;            
     str := str2;
  END LOOP; 



--
  v_num := 1;
--   
FOR i IN v_pcktab.FIRST .. v_pcktab.LAST
  LOOP

     VMESSAGE := RTRIM (SUBSTR (v_pcktab(i).data_file,
                             1,
                             V_LENGTH) 
                        );
             --       
     dbms_output.put_line(v_pcktab(i).data_file);

     v_pckdatatab (v_num).VMESSAGE          := v_pcktab(i).data_file;
     --
     v_num := v_num + 1;
  END LOOP;
  --
BEGIN
  --
  FOR s IN v_pckdatatab.FIRST .. v_pckdatatab.LAST
  LOOP
     IF v_pckdatatab(s).VMESSAGE IS NULL THEN
        null;
     ELSE

        select NPCS_HLFT_INV_REP_SEQ.NEXTVAL
        into v_PLAN_ID
        from dual;



       BEGIN
             INSERT INTO NPCS_HLFT_INV_REP--dev --to_trans4wdev
                           (FILE_ID,
                            FILE_TEXT,
                            GET_FLAG,
                            GET_DATE,
                            FILE_TYPE
                           )
                   VALUES (v_PLAN_ID,
                           v_pckdatatab (s).VMESSAGE,
                           '0',
                           SYSDATE,
                           p_type
                          );
              COMMIT;
           EXCEPTION WHEN OTHERS THEN
              NULL;
           END;

     END IF;
  END LOOP;
  --
  update GIIC_UPLOAD_FILE
  set status=1,
      lastupdate_TIMESTAMP=sysdate,
      lastupdate_by=1111
  where status='O'
  and FILE_id=p_id
  and FILE_NAME=p_type;
  commit;
  --
END;


end p_populate_data;    

斑点和性格在某种程度上是矛盾的。此外,示例字符不是日语,它们属于一些东欧语言。您应该检查您的数据模型。这只是一个想法-尝试在代码中将varchar2更改为nvarchar2。另外检查数据库字符集是否为AL16UTF16数据库字符集AL32UTF8,基本上只是将包含3行的表单blob文件插入到表中变为3行,但使用我的脚本插入时,该字符没有插入好不同的内容