Oracle 程序和功能。返回一个大字符串
我正在写这个过程,我有一个问题,我如何在新值上覆盖旧值,并用新的大字符串返回新行和新邮件。 程序将一封大邮件拆分,其中只有几封邮件包含电子邮件,并更改域 感知:我得到了一个表,表中有一个atributes示例值,其中有一个电子邮件字符串。我必须将此电子邮件更改为domain NewDomain.pl,如果它与aaa.pl和bbb.pl不同,如果它与我留下的此电子邮件相同。示例: 旧值:'zamowienia@kicius.pl米奇。mouse@aaa.pl基默斯。walus@domek.pl“ 结果我想要更新: **新值:'zamowienia@NewDomain.pl米奇。mouse@aaa.pl基默斯。walus@NewDomain.pl“ 第一程序:Oracle 程序和功能。返回一个大字符串,oracle,plsql,oracle9i,procedure,Oracle,Plsql,Oracle9i,Procedure,我正在写这个过程,我有一个问题,我如何在新值上覆盖旧值,并用新的大字符串返回新行和新邮件。 程序将一封大邮件拆分,其中只有几封邮件包含电子邮件,并更改域 感知:我得到了一个表,表中有一个atributes示例值,其中有一个电子邮件字符串。我必须将此电子邮件更改为domain NewDomain.pl,如果它与aaa.pl和bbb.pl不同,如果它与我留下的此电子邮件相同。示例: 旧值:'zamowienia@kicius.pl米奇。mouse@aaa.pl基默斯。walus@domek.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;
结束第二个过程,从第一个过程拆分邮件
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;
/
当我返回一个大字符串时,我希望在表中进行更新,我可以在哪里进行更新
谢谢你的帮助
也许有人可以把最简单的过程从两个过程改写成一个过程我想知道
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;
/
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';
对你有用吗?也许可以,但不行。我使用oracle 9i,无法安装其他版本。我知道此代码包含在我的函数和过程中。是吗?如果我对了你的代码,那就太棒了。错误:“ORA-00904:“REGEXP_REPLACE”:nieprawny identifikator“ok”我从页面及其工作添加函数REGEXP_REPLACE,但不ok。此更新不会在2到4次之间更改域匹配上一个子表达式(即当前为2到4个字符的顶级域)。我不确定owa_pattern.change是否支持“replacement”参数中所需的反向引用。