簡體   English   中英

重命名多個記錄oracle

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM