ORACLE PL/SQL 中的字符串比较

问题描述 投票:0回答:1

我从 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); 
oracle plsql
1个回答
0
投票

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); 
© www.soinside.com 2019 - 2024. All rights reserved.