欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle數據庫批量變更字段類型的實現(xiàn)步驟

 更新時間:2024年02月22日 09:14:14   作者:高彬  
我有個項目使用Oracle數據庫,運行幾年后數據量較大,需要對數據庫做一次優(yōu)化,其中有些字段類型類型需要調整,這里分享一下實現(xiàn)步驟,感興趣的朋友可以參考下

場景:

我有個項目使用Oracle數據庫,運行幾年后數據量較大,需要對數據庫做一次優(yōu)化,其中有些字段類型類型需要調整,這里分享一下實現(xiàn)步驟。

思路:

首先大家要知道Oracle數據庫不允許修改有數據表的的字段類型,經過分析我選擇下面的方式實現(xiàn)修改字段類型:

1、如果原字段叫A ,則創(chuàng)建一個新字段(A2);

2、把原字段(A)的數據更新到A2;

3、刪除原字段A;

4、把A2改名為A;

 以上是思路,以下是操作步驟 :

操作步驟

第1步、因為阻止修改做了約束的字段,因此先刪除所有約束,在刪除之前我們要備份好約束,調整完數據類型還要還原約束。

-- 生成索引
SELECT T.TABLE_NAME, --表名
T.INDEX_NAME, --索引名
I.UNIQUENESS, --是否非空
I.INDEX_TYPE, --索引類型
C.CONSTRAINT_TYPE, --鍵類型
WM_CONCAT(T.COLUMN_NAME) COLS,
 
'ALTER TABLE ' || T.TABLE_NAME || ' DROP CONSTRAINT ' || T.INDEX_NAME ||';' 刪除索引 ,
 
(CASE
WHEN C.CONSTRAINT_TYPE = 'P' OR C.CONSTRAINT_TYPE = 'R' THEN --主鍵和外鍵創(chuàng)建腳本拼接
'ALTER TABLE ' || T.TABLE_NAME || ' ADD CONSTRAINT ' ||
T.INDEX_NAME || (CASE
WHEN C.CONSTRAINT_TYPE = 'P' THEN
' PRIMARY KEY ('
ELSE
' FOREIGN KEY ('
END) || WM_CONCAT(T.COLUMN_NAME) || ');'
ELSE --索引創(chuàng)建腳本拼接
'CREATE ' || (CASE
WHEN I.UNIQUENESS = 'UNIQUE' THEN
I.UNIQUENESS || ' '
ELSE
CASE
WHEN I.INDEX_TYPE = 'NORMAL' THEN
''
ELSE
I.INDEX_TYPE || ' '
END
END) || 'INDEX ' || T.INDEX_NAME || ' ON ' || T.TABLE_NAME || '(' ||
WM_CONCAT(COLUMN_NAME) || ');'
END) 添加索引 
FROM USER_IND_COLUMNS T, USER_INDEXES I, USER_CONSTRAINTS C
WHERE T.INDEX_NAME = I.INDEX_NAME
AND T.INDEX_NAME = C.CONSTRAINT_NAME(+)--自建表規(guī)則(只查詢自己創(chuàng)建的表【我的建表規(guī)則以TB_開頭】,排除系統(tǒng)表)
AND I.INDEX_TYPE != 'FUNCTION-BASED NORMAL' --排除基于函數的索引
GROUP BY T.TABLE_NAME,
T.INDEX_NAME,
I.UNIQUENESS,
I.INDEX_TYPE,
C.CONSTRAINT_TYPE;
 

上面的sql會生成“刪除索引”和“添加索引”,   執(zhí)行 刪除索引  中的語句會刪掉庫中的所有約束。

第2步:生成修改字段類型的sql

 
select 
 x."fieldType",
'alter table '||x."tableName"||' add '||c.column_name||'_U2 '||
case LOWER(x."fieldType")
when 'dateTime' then 'date'  
when 'decimal'  then 'number(18,2)'
when 'tring'  then 'VARCHAR2(100)'
when 'int16'  then 'number(5)'
when 'int'  then 'number(9)'
when 'int32'  then 'number(9)'
when 'int64'  then 'number(19)'
else  '異常類型'
end ||';
update '||x."tableName"||' set '||c.column_name||'_U2='|| case when  c.column_name ='ZFID' then f_tonumber(SUBSTR(ZFID, 1,8)) else  c.column_name end  ||';
alter table '||x."tableName"||'  drop column '||c.column_name||';
alter table '||x."tableName"||' rename column '||c.column_name||'_U2 to '||c.column_name||';' s,
 
-- 'alter table '||x."tableName"||' modify '||x."fieldName"||' varchar2(50);' sql,
x."id",x."fieldName" , x."tableName",lower( c.data_type) 表類型,
lower(case when to_char( x."fieldType") like 'E_%' then 'int' else x."fieldType" end ) 實體類型,
x."fieldName",x."className",x."nameSpace",x."createDate" 
from user_tab_columns  c  
inner join XT_CLASS x 
on c.table_name = x."tableName" and c.column_name = x."fieldName"
where  1=1 and X."nameSpace"='RCSCloud.Models'  and  lower(x."tableName") not like 'v_%'

上面sql中用到的  xt_class是目標字段類型,我是從實體類中使用代碼生成到xt_class表里的,這個過程需要您自己實現(xiàn),xt_class表結構如下:

CREATE TABLE "XT_CLASS" 
   (	"tableName" VARCHAR2(50) NOT NULL ENABLE, 
	"fieldName" VARCHAR2(50) NOT NULL ENABLE, 
	"fieldTitle" VARCHAR2(255), 
	"fieldType" VARCHAR2(50), 
	"className" VARCHAR2(50), 
	"nameSpace" VARCHAR2(255), 
	"createDate" DATE, 
	"id" NUMBER(11,0) NOT NULL ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "IOTDATA"

第3步:把第2步生成的sql執(zhí)行完 數據類型就調整好了,最后把第1步生成的“添加約束"的sql執(zhí)行一遍 就完成了。

最后

到此這篇關于Oracle數據庫批量變更字段類型的實現(xiàn)步驟的文章就介紹到這了,更多相關Oracle批量變更字段類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • ORACLE查詢表最近更改數據的方法

    ORACLE查詢表最近更改數據的方法

    修改項目時,涉及到了Oracle中許多表的修改(包括:增加、刪除字段,修改注釋等)。由于開始沒有進行記錄,造成在上測試機時,忘記了具體修改過哪些表了
    2012-11-11
  • Windows server 2019安裝Oracle 19c的圖文教程

    Windows server 2019安裝Oracle 19c的圖文教程

    Oracle是是一款高效、可靠、吞吐量高的數據庫,本文主要介紹了Windows server 2019安裝Oracle 19c的圖文教程,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Oracle PL/SQL入門案例實踐

    Oracle PL/SQL入門案例實踐

    Oracle PL/SQL入門案例實踐...
    2007-03-03
  • Oracle 游標使用總結

    Oracle 游標使用總結

    游標(CURSOR)也叫光標,在關系數據庫中經常使用,在PL/SQL程序中可以用CURSOR與SELECT一起對表或者視圖中的數據進行查詢并逐行讀取。
    2009-10-10
  • oracle 存儲過程、函數和觸發(fā)器用法實例詳解

    oracle 存儲過程、函數和觸發(fā)器用法實例詳解

    這篇文章主要介紹了oracle 存儲過程、函數和觸發(fā)器用法,結合實例形式詳細分析了oralce 存儲過程、函數和觸發(fā)器具體功能、原理、定義、使用方法及相關操作注意事項,需要的朋友可以參考下
    2020-02-02
  • Oracle中獲取執(zhí)行計劃的幾種方法分析

    Oracle中獲取執(zhí)行計劃的幾種方法分析

    以下是對Oracle中獲取執(zhí)行計劃的幾種方法進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • oracle 提示登錄密碼過期完美解決方法

    oracle 提示登錄密碼過期完美解決方法

    這篇文章主要介紹了oracle 提示登錄密碼過期完美解決方法,在文中給大家補充介紹了Oracle使用scott用戶登錄提示密碼過期問題,需要的朋友參考下
    2018-04-04
  • 詳解Oracle數據庫中自帶的所有表結構(sql代碼)

    詳解Oracle數據庫中自帶的所有表結構(sql代碼)

    這篇文章主要介紹了Oracle數據庫中自帶的所有表結構,本文給大家介紹的非常詳細,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • Oracle數據IMP和EXP命令用法詳解

    Oracle數據IMP和EXP命令用法詳解

    這篇文章主要給大家介紹了關于Oracle數據IMP和EXP命令用法詳解的相關資料,我們可以使用Oracle自帶的exp、imp命令來進行數據庫備份,imp和exp稱之為導入導出,這種方式也能快速的導入導出table或數據庫,需要的朋友可以參考下
    2023-11-11
  • Oracle表空間詳解

    Oracle表空間詳解

    這篇文章主要介紹是Oracle表空間管理,文章中有詳細的代碼示例,對學習有一定的幫助,感興趣的小伙伴可以參考一下
    2023-04-04

最新評論