2014-06-15 75 views
0

我试图在包含一列重命名多个记录特殊字符重命名多个记录甲骨文

WHERE REGEXP_LIKE(Name, '[[email protected]#$%^&*=+/<>?|]') ; 

我试图获取一个包含特殊字符到一个数组,遍历它的每一个记录更新声明。 但是....当我尝试更改第一个记录时,其他(3)也更改为新值。
我尝试使用输入字段/箱设置新的价值,还有一个possibilty改变文本框的旧值线以上(TE与特殊字符的名称)

CREATE TABLE LOCATION 
    ( "ID" NUMBER PRIMARY KEY, 
     "NAME" VARCHAR2(20 BYTE) 
    ) ; 
Insert into SYSTEM.LOCATION (ID,NAME) values ('2','RE#$'); 
Insert into SYSTEM.LOCATION (ID,NAME) values ('3','rete%#'); 
Insert into SYSTEM.LOCATION (ID,NAME) values ('4','Testjue'); 
Insert into SYSTEM.LOCATION (ID,NAME) values ('5','Test#'); 

/

DECLARE 
    CURSOR name_cursor IS 
    SELECT id, name 
    FROM Location 
    WHERE REGEXP_LIKE(name, '[[email protected]#$%^&*=+/<>?|]') 
    FOR UPDATE OF name; 
BEGIN 
    FOR loc_rec IN name_cursor LOOP 
    DBMS_Output.Put_Line(loc_rec.name); 
    UPDATE Location SET name = '&whatever' WHERE Location.id=loc_rec.ID; 
    END LOOP; 
END; 

这改变了表中的所有值与特殊字符的提示输入“无论”,但我需要为每个记录设置不同的值。
这里的图片当输入为“测试” enter image description here

+0

难道你不能直接更新,而不使用游标? 'UPDATE Location SET name ='&v_location'WHERE REGEXP_LIKE(name,'[!@#$%^&* = +/<>?|]');'。至于为一个语句进行多行更新,可能它们对'name'具有相同的值。 –

+0

我得到了3个名字,tes#%t,$ tac%,&verflow,我希望它们以正确的方式更改,tes#%t必须成为测试,$ tac%必须成为堆栈等等。所以我想循环你选择的项目,并改变他们个人 – Isene112

+0

你的意思是三个具有相同价值的名字?如果是这样的话,并且如果你想用游标一次处理它们,你必须以其他方式识别行,例如通过主键。如果这是你想要做的,请张贴表格结构,我可以帮忙。 –

回答

1

你需要verflow找出逻辑转化像TES#%T,$ TAC%名字,&进入测试,堆栈溢出会发生什么等,至于更新和报告在一次一行,这样的事情应该工作:

DECLARE 
    CURSOR name_cursor IS 
    SELECT id, name 
    FROM Location 
    WHERE REGEXP_LIKE(name, '[[email protected]#$%^&*=+/<>?|]') 
    FOR UPDATE OF name; 
BEGIN 
    FOR loc_rec IN name_cursor LOOP 
    DBMS_Output.Put_Line(loc_rec.name); 
    UPDATE Location SET name = 'whatever' WHERE CURRENT OF loc_rec; 
    END LOOP; 
END; 

选择id使光标知道当前行就是在更新命令的WHERE CURRENT OF是很重要的。

这不使用批量提取,所以它可能运行速度稍慢(至少在纸上),但它更紧​​凑。如果批量提取对您很重要,我建议您使用您的原始代码,将id列纳入光标,并使用id而不是name在您的UPDATE命令的WHERE子句中。

+0

感谢您的快速响应,但我现在遇到错误 PL/SQL:ORA-00942:表或视图不存在(“OF”上的语法错误) 还有一个问题:是否可以看到/先显示旧值,那么您可以决定如何更新该记录? – Isene112

+0

抱歉错误错误代码: ORA-06550:线10,列58: PLS-00413:标识符在CURRENT子句是不是一个游标名 ORA-06550:线10,列58: PL/SQL:ORA- 00904:无效标识符 ORA-06550:第10行第5列: PL/SQL:SQL语句被忽略 06550. 00000 - “行%s,列%s:\ n%s” *原因:通常是PL/SQL编译错误。 – Isene112

+0

我试图改变一下声明: 更新位置SET name ='whatever'WHERE location.id = loc_rec.id; 但当我运行它时,我将所有3条记录更改为任何记录而不是1条记录 – Isene112

0

重写代码为

DECLARE 
    CURSOR name_cursor IS 
    SELECT id, name 
    FROM Location 
    WHERE REGEXP_LIKE(name, '[[email protected]#$%^&*=+/<>?|]') 
    FOR UPDATE OF name; 
BEGIN 
    FOR loc_rec IN name_cursor LOOP 
    DBMS_Output.Put_Line(loc_rec.name); 
    UPDATE Location 
     SET name = CASE LOC_REC.ID 
        WHEN '4' THEN 'Testjue' 
        ELSE 'Test' 
       END 
     WHERE Location.id=loc_rec.ID; 
    END LOOP; 
END; 

分享和享受。

0

“我喜欢3名,TES#%T,$ TAC%,& verflow,我希望他们以正确的方式改变 ,TES#%T必须成为测试,$ TAC%必须成为堆栈 等等。”

你有两个不同的规则有:第一条规则变成%null,第二轮流%k。这是一个问题,你需要解决它。

一旦您确定了您实际要实施的规则,您可以使用简单的TRANSLATE调用来更改不需要的字符。 Find out more

因此,要删除它们:

UPDATE Location 
    SET name = translate (name 
     , '[email protected]#$%^&*=+/<>?|' 
     , 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' 
    WHERE REGEXP_LIKE(name, '([[email protected]#\$%\^&\*=\+/<>\?\|]+)') 
/

...或改变它们:

UPDATE Location 
    SET name = translate (name 
       , '[email protected]#$%^&*=+/<>?|' 
       , 'la3sk6787abciqi' 
         ) 
    WHERE REGEXP_LIKE(name, '([[email protected]#\$%\^&\*=\+/<>\?\|]+)') 
/

这是the SQL fiddle

0

我创造了一些东西让它变得简单
首先,我将选择每个带有特殊字符的记录,并显示ID和NAME。现在我已经得到了ID和姓名,我可以在我的光标使用它们
例子:
我有一个记录,其中ID为“2”得到了特殊字符:

 ID NAME    
---------- -------------------- 
     2 RE#$     
     3 rete%# 


所以当输入字段“ID”弹出我会输入“2”,现在我会得到一个提示输入“名称”,我将键入新名称。
所以这是我的新脚本:

SELECT * 
FROM LOCATION 
    WHERE REGEXP_LIKE(name, '[[email protected]#$%^&*=+/<>?|]'); 
/
DECLARE 
    CURSOR name_cursor IS 
    SELECT id, name 
    FROM Location 
    WHERE REGEXP_LIKE(name, '[[email protected]#$%^&*=+/<>?|]') 
    FOR UPDATE OF name; 
    v_RecordID number; 
BEGIN 
    v_RecordID := &ID; 
    FOR loc_rec IN name_cursor LOOP 
    DBMS_Output.Put_Line(loc_rec.name); 
     UPDATE Location SET name = '&Name' 
     WHERE Location.id=v_RecordID; 
    END LOOP; 
END; 

还有一种方法可以改善它吗?马布耶参数或东西?