[英]Rename multiple records oracle
我正在嘗試重命名包含特殊字符的列中的多個記錄
WHERE REGEXP_LIKE(Name, '[!@#$%^&*=+/<>?|]') ;
我試圖將包含特殊字符的每條記錄提取到數組中,並使用update語句遍歷它。 但是....當我嘗試更改第一個記錄時,其他(3)也會更改為新值。
我嘗試使用INPUT字段/框設置新值,是否還可以將文本框上方的行更改為舊值(帶特殊字符的名稱)
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, '[!@#$%^&*=+/<>?|]')
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;
這會將帶有特殊字符的表中的所有值更改為提示“ whatever”的輸入,但是我需要為每個記錄設置不同的值。
這里的圖片是輸入“測試”時發生的情況
您需要弄清楚將tes#%t,$ tac%,&verflow之類的名稱轉換為測試,堆棧,溢出等的邏輯。至於一次更新和報告一行,這樣的方法應該起作用:
DECLARE
CURSOR name_cursor IS
SELECT id, name
FROM Location
WHERE REGEXP_LIKE(name, '[!@#$%^&*=+/<>?|]')
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
以便光標知道update命令中WHERE CURRENT OF
的當前行。
它不使用批量獲取,因此運行速度可能稍慢(至少在紙上運行),但更緊湊。 如果批量獲取對您很重要,建議您使用原始代碼,將id
列合並到游標中,並在UPDATE
命令的WHERE
子句中使用id
而不是name
。
將您的代碼重寫為
DECLARE
CURSOR name_cursor IS
SELECT id, name
FROM Location
WHERE REGEXP_LIKE(name, '[!@#$%^&*=+/<>?|]')
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;
分享並享受。
“我有3個名字,tes#%t,$ tac%和&verflow,我希望它們以正確的方式更改,tes#%t必須成為test,$ tac%必須成為堆棧,依此類推。”
您在那里有兩個不同的規則:第一個規則將%
變為null
,第二個規則將%
變為k
。 這是一個問題,您需要解決它。
一旦確定了實際要實施的規則,就可以使用簡單的TRANSLATE調用來更改不需要的字符。 了解更多 。
因此,要刪除它們:
UPDATE Location
SET name = translate (name
, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*=+/<>?|'
, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
WHERE REGEXP_LIKE(name, '([!@#\$%\^&\*=\+/<>\?\|]+)')
/
...或更改它們:
UPDATE Location
SET name = translate (name
, '!@#$%^&*=+/<>?|'
, 'la3sk6787abciqi'
)
WHERE REGEXP_LIKE(name, '([!@#\$%\^&\*=\+/<>\?\|]+)')
/
這是SQL小提琴 。
我創建了一些東西使其保持簡單
首先,我將選擇每個帶有特殊字符的記錄,並顯示ID和NAME。 現在我有了ID和名稱,可以在光標中使用它們了
例:
我有一個記錄,其中ID“ 2”具有特殊字符:
ID NAME
---------- --------------------
2 RE#$
3 rete%#
因此,當輸入字段“ ID”彈出時,我將輸入“ 2”,現在我將得到一個提示,要求輸入“ Name”,在其中鍵入新名稱。
這是我的新腳本:
SELECT *
FROM LOCATION
WHERE REGEXP_LIKE(name, '[!@#$%^&*=+/<>?|]');
/
DECLARE
CURSOR name_cursor IS
SELECT id, name
FROM Location
WHERE REGEXP_LIKE(name, '[!@#$%^&*=+/<>?|]')
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;
還有改進的方法嗎? Mabye帶有參數或其他內容?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.