簡體   English   中英

使用sql批量更新列

[英]batch update a column using sql

我有一個數據庫表(db2),其中有很多行(幾百萬)。 我需要更改其中一列的數據類型。

在DB2 LUW中,似乎沒有一種方法可以直接更改列的數據類型(ALTER TABLE ALTER COLUMN SET DATA TYPE不起作用)。 因此,我要創建一個新列,將數據復制到該列,然后刪除舊列。

由於在表上進行直接更新不是一個好主意,因此我正在創建一個過程,該過程將一次更新並提交10000行。

鑒於此,我有以下問題:

  • 在這里進行更新的最佳方法是什么? -據我所知,游標一次允許迭代超過1行。 是一次更新10000行,然后提交並重復直到表被更新才是正確的方式嗎?
  • 有沒有更好的方法來以更簡單的方式處理更改列的數據類型的原始問題?

DB2具有稱為LOAD FROM CURSOR的功能,該功能允許快速遷移數據。

以下是使用LOAD FROM CURSOR的示例:

-- this is the original table
CREATE TABLE TEST (
    ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    TEXT VARCHAR(50)
)@

CREATE TABLE TEST_NEW (
    ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    TEXT CLOB(5000000)
)@

DECLARE C1 CURSOR FOR SELECT ID, TEXT FROM TEST@

LOAD FROM C1 OF CURSOR INSERT INTO TEST_NEW (ID,TEXT)@ 

DROP TABLE TEST@
RENAME TABLE TEST_NEW TO TEST@

此外,還可以使用以下過程(每10000條記錄后提交):

-- this is the original table
CREATE TABLE TEST (
    ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    TEXT VARCHAR(50)
)@

CREATE OR REPLACE PROCEDURE MIGRATE_TEST()
LANGUAGE SQL
BEGIN

    DECLARE EOF INT DEFAULT 0;

    DECLARE CUR_COUNT INT DEFAULT 0;
    DECLARE CUR_ID INT DEFAULT 0;

    DECLARE C CURSOR WITH HOLD FOR 
        SELECT ID FROM TEST WHERE TEXT_NEW IS NULL;

    DECLARE CONTINUE HANDLER FOR NOT FOUND 
        SET EOF = 1;

    OPEN C;

    FETCH_LOOP: LOOP
        FETCH FROM C INTO CUR_ID; 
        IF EOF <> 0 THEN
                LEAVE FETCH_LOOP;
        END IF;

        UPDATE TEST 
        SET TEXT_NEW = TEXT
        WHERE ID = CUR_ID ;

        SET CUR_COUNT = CUR_COUNT + 1;

        IF CUR_COUNT >= 10000 THEN
            CALL DBMS_OUTPUT.PUT_LINE('COMMITTING');
            COMMIT WORK;
            SET CUR_COUNT = 0;
        END IF;

    END LOOP FETCH_LOOP;

    COMMIT WORK;

    CLOSE C;
END@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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