2013-04-17 7 views
0

Я написал функцию Oracle, которая заменяет некоторые символы на другие. Пример строки:Ошибка с помощью скобок в функции Oracle REGEXP_REPLACE

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 .. Пожалуйста, объясните мне, как я могу решить свою проблему. Код

Function в:

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)); 

Спасибо за советы!

+0

Зачем вам нужно писать свою функцию, если у вас уже есть встроенные функции в Oracle? Каков желаемый результат? Какова цель функции, которую вы написали? Вы уже не получили ответы на свои вопросы здесь: http://stackoverflow.com/questions/16054892/how-can-i-replace-brackets-to-hyphens-within-oracle-regexp-replace-function – Art

+0

Чтение между линиями , являются и заполнителями для значений, которые необходимо подставить в строки? В этом случае простой «select replace» («Employee » работает в dept () »,« », fio_column) из table_containing_fio_column'. Так как многие вложенные вызовы 'replace' необходимы, поскольку у вас есть заполнители. –

ответ

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).

Регулярные выражения - это мощный инструмент, но they are not the best-suited for every tasks. Чтобы делать основные вещи, такие как добавочные строки, вы должны использовать стандартные функции.

+0

Хм .. спасибо Винсент! Я отлажу свою функцию! – Sergey

+0

Винсент, спасибо за совет !!!Ты прав! – Sergey

Смежные вопросы