我从 Excel 工作表中读取数据并在 ORACLE PL/SQL 中提取列值。但在
if
条件下的比较无法正常工作。
v_value5
值是显示正确值。但当我比较时,条件不匹配。当我尝试显示 v_value5
可变长度时,它总是显示实际长度 +1。例如,如果 v_value5 = 'E'
,则长度始终显示 2。
DBMS_OUTPUT.PUT_LINE('Length -> '|| LENGTH(TRIM(v_value5)));
Result is 2
有人知道这里的字符串比较发生了什么以及为什么长度显示实际长度+1吗?
我怀疑 REPLACE 函数返回一些额外的字符。
注意
v_value5
属于类型 VARCHAR(255)
。
v_file := UTL_FILE.FOPEN('TEST', 'Test.csv', 'R',30000);
LOOP
BEGIN
UTL_FILE.GET_LINE(v_file, v_line);
v_value1 := REGEXP_SUBSTR(v_line, '[^,]+', 1, 1);
v_value2 := REGEXP_SUBSTR(v_line, ',.+', 1, 1);
v_value3 := REPLACE(v_value2, ',', '');
v_value4 := REPLACE(v_value3, ' ', '');
v_value5 := REPLACE(v_value4, '"', '');
IF LENGTH(v_value5) > 1 THEN
IF v_value5 = 'E'
THEN v_Id := '1';
ELSIF v_value5 = 'D'
THEN v_Id := '2';
ELSIF v_value5 = 'E'
THEN v_Id := '3';
ELSIF v_value5 = 'DS'
THEN v_Id := '4';
ELSIF v_value5 = 'EDS'
THEN v_Id := '5';
ELSE
DBMS_OUTPUT.PUT_LINE('No such Data found');
END IF;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(v_file);
UTL_FILE.GET_LINE(v_file, v_line);
返回行,包括行尾的换行符 (ASCII 13)。您需要将其删除。
v_file := UTL_FILE.FOPEN('TEST', 'Test.csv', 'R',30000);
LOOP
DECLARE
v_line VARCHAR2(4000);
v_sep PLS_INTEGER;
v_first VARCHAR2(4000);
v_second VARCHAR2(4000);
BEGIN
UTL_FILE.GET_LINE(v_file, v_line);
v_sep := INSTR(v_line, ',');
v_first := TRANSLATE(SUBSTR(v_line, 1, v_sep - 1), 'A, "' || CHR(13), 'A');
v_second := CASE TRANSLATE(SUBSTR(v_line, v_sep + 1), 'A, "' || CHR(13), 'A')
WHEN 'E' THEN '1'
WHEN 'D' THEN '2'
WHEN 'E' THEN '3' -- This will never match as you have already matched E
WHEN 'DS' THEN '4'
WHEN 'EDS' THEN '5'
END;
IF v_second IS NULL THEN
DBMS_OUTPUT.PUT_LINE('No such Data found');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
UTL_FILE.FCLOSE(v_file);