-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;
'dimension'オブジェクトの定義を投稿することもできます – XING
VARCHAR2(200)のTABLEとしての" NAMELIST "を作成または置換します。 – Lohith