0

我编写了一个 Oracle 函数,它将一些符号替换为其他符号。字符串示例:

SELECT ReplaceStringFormat('Employee with FIO <FIO>') FROM dual;

替换后的结果:

'Employee with FIO '||FIO||''

当字符串以括号开头或以括号结尾时出现错误 ORA-12725,如下所示:

SELECT ReplaceStringFormat('(<DEPTID>) have <EMP_NUMB> employees') FROM dual; 

或者

SELECT ReplaceStringFormat('Employee <FIO> works in dept (<DEPTID>)') FROM dual;

我是 REGEXP 的新手。请解释一下,我该如何解决我的问题。

函数代码:

CREATE OR REPLACE FUNCTION ReplaceStringFormat (p_source_string IN VARCHAR2)
   RETURN VARCHAR2 IS

 v_result_string VARCHAR2(4000);
  v_counter BINARY_INTEGER := 1;
  v_flag NUMBER(1);
  v_last_char CHAR(1);
  v_last_char_new VARCHAR(5);
  v_first_char CHAR(1);
  v_first_char_new VARCHAR(5);
  v_first_char_flag NUMBER(1) := 0;

  BEGIN
    v_result_string := p_source_string;
    v_flag := 0; 
     WHILE v_counter <= 2 LOOP
      IF v_flag = 0 THEN
       IF INSTR (v_result_string, '<') = 1 THEN
        v_result_string := REGEXP_REPLACE(v_result_string, '<', '', '1', '1');
        v_first_char_flag := 1;
       ELSE
        IF v_first_char_flag = 0 THEN 
         v_first_char := SUBSTR(v_result_string, 1, 1);
         v_first_char_new := ''''||v_first_char;
         v_result_string := REGEXP_REPLACE(v_result_string, v_first_char, v_first_char_new, 1);
         v_first_char_flag := 1;
        ELSE
         v_result_string := REPLACE(v_result_string, '<', '''||');
         v_counter := v_counter + 1;
         v_flag := 1;
        END IF;
      END IF;
      ELSE
       v_result_string := REPLACE(v_result_string, '>','||''');
       v_last_char := SUBSTR(v_result_string, LENGTH(v_result_string), 1);
       v_last_char_new := v_last_char||'''';
       v_result_string := REGEXP_REPLACE(v_result_string, v_last_char, v_last_char_new, LENGTH(v_result_string));
       v_counter := v_counter + 1;
     END IF;
    END LOOP;  
  RETURN v_result_string;
END ReplaceStringFormat;

ORA-12725 出现在以下行:

v_result_string := REGEXP_REPLACE(v_result_string, v_first_char, v_first_char_new, 1);

v_result_string := REGEXP_REPLACE(v_result_string, v_last_char, v_last_char_new, LENGTH(v_result_string));

谢谢你的建议!

4

1 回答 1

1

我不确定您是否真的需要正则表达式。标准REPLACE应该起作用:

SQL> SELECT '''' || REPLACE(REPLACE(txt, '<', '''||'), '>', '||''') || '''' rep
  2    FROM (SELECT 'Employee <FIO> works in dept (<DEPTID>)' txt FROM dual);

REP
-------------------------------------------------
'Employee '||FIO||' works in dept ('||DEPTID||')'

关于您的ORA-12725错误,您应该在代码中添加调试信息。我不确定您要在这里完成什么,但是如果您添加一个异常块,您会发现:

v_result_string = 'Employee '||FIO||' works in dept ('||D'EPTID||')
v_last_char     = )
v_last_char_new = )'

这里的字符串)不是正确的正则表达式。

似乎您想用这个字符替换字符串的最后一个字符,后跟一个单引号。再一次,我认为您正在尝试使用正则表达式,因为它们不是最合适的工具。附加单引号最好留给附加运算符||(或concat函数)。

正则表达式是一个强大的工具,但它们并不是最适合所有任务。要执行附加字符串等基本操作,您应该使用标准函数。

于 2013-04-17T14:23:03.053 回答