Plsql ORA-06502:PL/SQL:数字或值错误:处理多字节字符时字符串缓冲区太小错误

Plsql ORA-06502:PL/SQL:数字或值错误:处理多字节字符时字符串缓冲区太小错误,plsql,Plsql,当我试图处理包含德语字符(多字节字符)的输入字符串时,程序失败,出现ORA-06502错误 该过程分析CSV中的一行输入字符串,并将CSV的每列值添加到列表中并返回 输入字符串: SIPCORE1000;瑞士匿名社会服务公司SKYGUIDE;Any2Any;对;SSM;不;没有;6730:14892466;;109 程序: PROCEDURE ParseCSV( i_csvline IN VARCHAR2, i_Delimiter IN

当我试图处理包含德语字符(多字节字符)的输入字符串时,程序失败,出现ORA-06502错误

该过程分析CSV中的一行输入字符串,并将CSV的每列值添加到列表中并返回

输入字符串:

SIPCORE1000;瑞士匿名社会服务公司SKYGUIDE;Any2Any;对;SSM;不;没有;6730:14892466;;109

程序:

 PROCEDURE ParseCSV(
        i_csvline IN VARCHAR2,
        i_Delimiter   IN            VARCHAR2 DEFAULT ';',
        i_Enclosed IN VARCHAR2 DEFAULT '"',
        o_ColumnValueList OUT dimension.NAMELIST )
    IS 
      --
      CARRIAGE_RETURN CONSTANT CHAR(1) := chr(13);
      LINE_FEED       CONSTANT CHAR(1) := chr(10);
      --
      l_char           CHAR(1);
      l_lookahead      CHAR(1);
      l_pos            NUMBER          := 0;
      l_columnValue          VARCHAR2(32767) := NULL;
      l_columnValue_complete BOOLEAN         := false;
      l_line_complete  BOOLEAN         := false;
      l_new_column      BOOLEAN         := true;
      l_enclosed       BOOLEAN         := false;
      v_namelist dimension.NAMELIST :=dimension.NAMELIST();
      v_lastchar        VARCHAR2(10);
    BEGIN 
      SELECT SUBSTR(i_csvline,-1) INTO v_lastchar FROM dual;
      LOOP
        -- increment postion index
        l_pos := l_pos + 1;
        -- get the next character from input CSV line
        l_char := dbms_lob.substr( i_csvline, 1, l_pos);

        -- Exit when no more characters to process
        EXIT WHEN l_char IS NULL OR l_pos > dbms_lob.getLength( i_csvline );

        -- If the first character of new token is optionally enclosed character 
        -- note that and skip it and get the next character
        IF l_new_column AND l_char = i_Enclosed THEN
          l_enclosed             := true;
          l_pos                  := l_pos + 1;
          l_char                 := dbms_lob.substr( i_csvline, 1, l_pos);
        END IF;
        l_new_column := false;

        -- get the lookahead character
        l_lookahead := dbms_lob.substr( i_csvline, 1, l_pos+1 );

        -- Inspect the character (and lookahead) to determine what to do
        IF l_char             = i_Enclosed AND l_enclosed THEN
          IF l_lookahead      = i_Enclosed THEN
            l_pos            := l_pos + 1;
            l_columnValue          := l_columnValue || l_lookahead;
          elsif l_lookahead   = i_Delimiter THEN
            l_pos            := l_pos + 1;
            l_columnValue_complete := true;
          ELSE
            l_enclosed := false;
          END IF;
        elsif l_char IN ( CARRIAGE_RETURN, LINE_FEED ) AND NOT l_enclosed THEN
          l_columnValue_complete := true;
          l_line_complete  := true;
          IF l_lookahead  IN ( CARRIAGE_RETURN, LINE_FEED ) THEN
            l_pos := l_pos + 1;
          END IF;
        elsif l_char        = i_Delimiter AND NOT l_enclosed THEN
          l_columnValue_complete := true;
        elsif l_pos         = dbms_lob.getLength( i_csvline ) THEN
          l_columnValue          := l_columnValue || l_char;
          l_columnValue_complete := true;
          l_line_complete  := true;
        ELSE
          l_columnValue := l_columnValue || l_char;
        END IF;
        -- process a new token
        IF l_columnValue_complete THEN
          v_namelist.EXTEND;
          v_namelist(v_namelist.LAST):=l_columnValue;
          l_columnValue                    := NULL;
          l_enclosed                 := false;
          l_new_column                := true;
          l_columnValue_complete           := false;
        END IF;
        IF l_line_complete THEN
          l_line_complete := false;
        END IF;
      END LOOP;
      IF v_lastchar=i_Delimiter
      THEN
          v_namelist.EXTEND;
          v_namelist(v_namelist.LAST):=NULL;
      END IF; 
      o_ColumnValueList:=v_namelist;
    END ParseCSV;

当涉及多字节编码字符(在我的例子中是德语字符)时,保存这些字符的变量应该是VARCHAR2,并且大小至少为2。我将变量类型定义为VARCHAR2,大小定义为10。现在,程序按预期工作。

您是否可以发布
维度的定义
对象以及创建或替换类型“名称列表”作为VARCHAR2(200)的表;