2017-07-27 6 views
-2

ドイツ語の文字を含む入力文字列を処理しようとすると、プログラムはORA-06502エラーで失敗します。私は問題の正確な原因をデバッグすることができません。ORA-06502:PL/SQL:数値または値のエラー:ドイツ語文字の処理中に文字列バッファーが小さすぎます。

この手順では、CSVの行である入力文字列を解析し、csvの各列の値をリストに追加して返します。

入力文字列: SIPCORE1000; SKYGUIDE、ソシエテ・アノニム・スイスは、レサービス注ぐ; Any2Any;はい、SSMのNo;なし; 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; 
+0

'dimension'オブジェクトの定義を投稿することもできます – XING

+0

VARCHAR2(200)のTABLEとしての" NAMELIST "を作成または置換します。 – Lohith

答えて

0

マルチバイトのエンコーディング文字(私の場合はドイツ語の文字)が含まれている場合、これらの文字を保持する変数はVARCHAR2で、サイズは少なくとも2でなければなりません。変数の型をVARCHAR2およびサイズ10として定義しました。期待どおりに動作します。

関連する問題