2012-10-22 18 views
0

我写这个程序,我有问题,我怎么能覆盖上新的价值原值和新的大单串用新邮件返回新线。 过程分裂一个大的邮件已经得到了上几单邮件,更改域的电子邮件。程序和功能。返回一个大的字符串

感知:我有一个表,其中有一个很大的字符串的邮件atributes示例值。当从aaa.pl和bbb.pl其指出错误时,其同样在我离开这个邮件我必须改变这个电子邮件域NewDomain.pl。例如:

旧值:'[email protected] [email protected] [email protected]

,并导致我想更新: **新价值: '[email protected] [email protected] [email protected]

第一道工序:

CREATE OR REPLACE PROCEDURE changeMailAll 
AS    
BEGIN 
     DECLARE delim char(3); 
       cur_position INTEGER(11) DEFAULT 1; 
       r_remainder VARCHAR(250); 
       cur_string VARCHAR(1000); 
       delim_length INTEGER; 
       length_remainder INTEGER; 
       mail VARCHAR(255); 
       MAILs VARCHAR(20000); 
       v_value VARCHAR2(255); 
       v_valueNew VARCHAR2(255); 
       v_customerId VARCHAR(20); 
       c INTEGER; 
       d INTEGER; 
       positionMonkey INTEGER; 
       v_identity VARCHAR(50); 
       domena VARCHAR2(50); 
       v_loop VARCHAR(100); 
       adres VARCHAR(255); 
       **str PKT_StringFnc.t_array;** 

     CURSOR cursorMails IS 
      SELECT Customer_Id, Value FROM PKT_userTrue where method_id = 'E_MAIL'; 


    BEGIN 

       OPEN cursorMails; 

        LOOP 

         FETCH cursorMails INTO v_customerId, v_value; 

           **str := PKT_StringFnc.SPLIT(v_value,' '); 

         FOR i IN 1..str.COUNT LOOP 
           dbms_output.put_line('XXX1' || str(i)); 
           END LOOP;**   
        EXIT WHEN cursorMails%NOTFOUND; 
        END LOOP; 
       CLOSE cursorMails; 
END; 
END; 

结束第二个过程,我从第一道工序

CREATE OR REPLACE PACKAGE BODY PKT_StringFnc 
IS 

    FUNCTION SPLIT (p_in_string VARCHAR2, p_delim VARCHAR2) RETURN t_array 
    IS 

     i  number :=0; 
     pos  number :=0; 
     lv_str varchar2(255) := p_in_string; 
     positionMonkey INTEGER; 
     domena VARCHAR2(50); 
     adres VARCHAR(255); 
     lv_str_new VARCHAR2(255); 
     aaa VARCHAR(20) := '@aaa.pl '; 
     bbb VARCHAR(30) := '@bbb.pl '; 
     result VARCHAR(1000); 


    strings t_array; 

    BEGIN 

     pos := instr(lv_str,p_delim,1,1); 

     WHILE (pos != 0) LOOP 

     i := i + 1; 
     strings(i) := substr(lv_str,1,pos); 
     positionMonkey := INSTR(strings(i),'@'); 

     domena := SUBSTR(strings(i), positionMonkey); 

     adres := RTRIM(strings(i),domena); 

     lv_str := substr(lv_str,pos+1,length(lv_str)); 

     pos := instr(lv_str,p_delim,1,1); 

     IF pos = 0 THEN 
      strings(i+1) := lv_str; 
       ELSE 
        strings(i+1) := lv_str_new; 

     END IF; 

      IF domena = aaa OR domena = bbb THEN 

      lv_str_new := REPLACE(strings(i),domena,'@NewDomain.com'); 

      END IF; 
     DBMS_OUTPUT.PUT_LINE('lv_str_newREPLACE:'|| lv_str_new); 

     END LOOP; 

     RETURN strings; 
    END SPLIT; 

END; 
/

拆分邮件当我回到一个大的字符串我想在表更新和在那里我可以做到这一点?

感谢您的帮助

也许有人可以重写从两个最简单的程序,一个程序

回答

1

我不知道是否像

UPDATE pktTrue 
SET Value = REGEXP_REPLACE(Value, '(@aaa.pl)|(@bbb.pl)|(@[a-zA-Z0-9._%-]+\.[a-zA-Z]{2,4})', '\1\[email protected]', 1, 0, 'c') 
WHERE method_id = 'E_MAIL'; 

会为你工作?

+0

mayebe它的美好,但它不工作。我使用oracle 9i,我不能安装另一个版本。我明白这个代码是插入我的功能和程序是吗?如果我对你的代码很好。 错误:“ORA-00904:”REGEXP_REPLACE“:niepoprawny identyfikator” – Przemek

+0

好的,我从页面添加函数regexp_replace http://phil-sqltips.blogspot.com/2009/06/regexpreplace-regexplike-for-oracle-9i.html和它的工作,但不行。此更新不要更改域名 – Przemek

+0

什么意思{2,4}? – Przemek