0

私はこの手順を書いていますが、古い値を新しい値に上書きし、新しいメールで新しい大きな文字列を含む新しい行を返す方法について質問があります。手順は、いくつかの単一のメールでメールを受け取った1つの大きなメールを分割し、ドメインを変更します.

認識: 属性の例の値を持つ 1 つのテーブルを取得しました。これには、メールを含む 1 つの大きな文字列があります。このメールを、aaa.pl と異なる場合はドメイン NewDomain.pl に、同じ場合は bbb.pl に変更する必要があります。例:

古い値: 'zamowienia@kicius.pl mickey.mouse@aaa.pl kimus.walus@domek.pl'

更新が必要な結果: **新しい値: 'zamowienia@NewDomain.pl mickey.mouse@aaa.pl kimus.walus@NewDomain.pl'

最初の手順:

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;

最初の手順からメールを分割する 2 番目の手順を終了する

    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 つの大きな文字列を返すときに、テーブルを更新したいのですが、どこで更新できますか?

手伝ってくれてありがとう

誰かが最も簡単な手順を 2 つの手順から 1 つの手順に書き直すことができるかもしれません

4

1 に答える 1

1

みたいなのかな

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

あなたのために働きますか?

于 2012-10-22T11:18:53.850 に答える