Sql Oracle REGEXP_REPLACE函数中的括号出错
我已经编写了一个Oracle函数,它将一些符号替换为另一些符号。 字符串示例:Sql Oracle REGEXP_REPLACE函数中的括号出错,sql,regex,oracle,plsql,Sql,Regex,Oracle,Plsql,我已经编写了一个Oracle函数,它将一些符号替换为另一些符号。 字符串示例: SELECT ReplaceStringFormat('Employee with FIO <FIO>') FROM dual; 我有一个错误ORA-12725,当字符串以括号开头或以括号结尾时,如下所示: SELECT ReplaceStringFormat('(<DEPTID>) have <EMP_NUMB> employees') FROM dual; 及 谢谢你的建
SELECT ReplaceStringFormat('Employee with FIO <FIO>') FROM dual;
我有一个错误ORA-12725,当字符串以括号开头或以括号结尾时,如下所示:
SELECT ReplaceStringFormat('(<DEPTID>) have <EMP_NUMB> employees') FROM dual;
及
谢谢你的建议 我不确定您是否真的需要正则表达式。标准应起作用:
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||')'
这里的字符串)
不是正确的正则表达式
您似乎希望将字符串的最后一个字符替换为后跟单引号的该字符。我再一次认为,当正则表达式不是最合适的工具时,您正在尝试使用正则表达式。最好将单引号追加到append操作符|
(或函数)上
正则表达式是一种功能强大的工具,但它不适用于。要完成诸如追加字符串之类的基本操作,您应该使用标准函数。既然您已经在Oracle中内置了函数,为什么还需要编写函数?期望的输出是什么?您编写的函数的目的是什么?您是否已经在这里得到了答案:读取需要替换到字符串中的值的行间、是和占位符?在这种情况下,只需从包含fio列的表中选择一个简单的
替换('Employee works In dept()','',fio列)
。需要对replace
进行尽可能多的嵌套调用,因为您有占位符。
SELECT ReplaceStringFormat('Employee <FIO> works in dept (<DEPTID>)') FROM dual;
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;
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));
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||')'
v_result_string = 'Employee '||FIO||' works in dept ('||D'EPTID||')
v_last_char = )
v_last_char_new = )'