[英]batch update a column using sql
我有一個數據庫表(db2),其中有很多行(幾百萬)。 我需要更改其中一列的數據類型。
在DB2 LUW中,似乎沒有一種方法可以直接更改列的數據類型(ALTER TABLE ALTER COLUMN SET DATA TYPE不起作用)。 因此,我要創建一個新列,將數據復制到該列,然后刪除舊列。
由於在表上進行直接更新不是一個好主意,因此我正在創建一個過程,該過程將一次更新並提交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.