私はこの手順を書いていますが、古い値を新しい値に上書きし、新しいメールで新しい大きな文字列を含む新しい行を返す方法について質問があります。手順は、いくつかの単一のメールでメールを受け取った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 つの手順に書き直すことができるかもしれません