在資料字典中直接修改Oracle表列名

2021-04-01 21:32:24 字數 2898 閱讀 9248

9i 之前的oracle資料庫沒有提供直接修改表中列名稱的功能,但在實際使用時常需要修改表的列名和列順序,不得已有些oracle的使用人員用重新建立乙個新的具有正確列名和順序的資料庫表,再將舊表的資料轉儲進來,最後刪除舊表並將新錶重新命名為舊表的方法來完成此功能。此方法的最大問題是要求有雙倍的儲存空間、較大的回滾段和較長的時間,如果表中資料量較大,這項工作開銷會很大。實際上我們可以從資料字典中直接修改表列的名稱和順序。下面是具體的實現步驟:

1.以internal使用者名稱登入oracle資料庫,並建立一測試表。

sql>create table scott.test as select empno,ename from scott.emp;

sql>desc scott.test

name type nullable default comments

------- ------------ -------

empno number(4) y

ename varchar2(10) y

下面我們要把scott.test表中empno和ename兩列調換順序,並把ename列更名為emp_name,empno改為emp_no。

2.查詢表中列的實際儲存位置或表。

sql>set long 9999

由於text列是long型別,只有「set」之後才能完全顯示。

sql>select text from all_views where view_name = 『user_tab_columns』;

資料字典檢視user_tab_columns中儲存有表列的定義資訊,從該語句的查詢結果可以看出,列定義資訊是儲存在表sys.col$中的,即如果修改表中列的定義,應該在sys.col$表中修改。

3.從資料字典檢視all_objects中查詢物件scott.test物件id。

sql> select * from all_objects where owner =『scott』 and object_name=『test』;

4.根據scott.test物件的id,從sys.col$檢索出表中列的定義資訊。

sql> select obj#,col#,name from sys.col$ where obj# =13888;

obj# col# name

---------- ---------- -------

13888 1 empno

13888 2 ename

5.使用update語句來進行修改。

update sys.col$ set col# = 2,name=『emp_no』 where obj# = 13888 and name=『empno』;

update sys.col$ set col# = 1,name=『emp_name』 where obj# = 13888 and name =『ename』;

commit;

6. 重啟資料庫服務。

由於資料字典是在資料庫啟動時載入到sql中的,所以修改了它之後,如果使用「select * from scott.test; 」,會發現好像並沒有修改。因此,修改完成之後,還需要重啟資料庫服務。

sql>shutdown

sql>startup

這時,再檢視,就會發現修改已經成功。

sql> select * from scott.test;

emp_name emp_no

---------- ------

**ith 7369

allen 7499

ward 7521

…… 這種方法直接從資料庫中進行表列定義的修改,存在一定風險,但它對於資料量特別大的表是非常有用的。充分利用資料字典功能,往往能夠完成日常很難完成的工作。下面筆者寫了一段簡單的儲存過程,可實現表中列的重新命名。讀者可直接呼叫此過程來完成列的重新命名:

sql>exec altercolname(『模式名稱』,『表名稱』,『原列名稱』,『新列名稱』);

create or replace procedure sys.altercolname

(schmaname in varchar2,

tabname in varchar2,

oldcolname in varchar2,

newcolname in varchar2) is

n_schmaname varchar2(30); --模式名稱

n_tablename varchar2(30); --表名稱

n_oldcolname varchar2(30); --原來列名稱

n_newcolname varchar2(30); --新的列名稱

n_objnum number;

begin

n_schmaname := upper(schmaname);

n_tablename := upper(tabname);

n_oldcolname := upper(oldcolname);

n_newcolname := upper(newcolname);

select object_id into n_objnum

from all_objects

where owner = n_schmaname

and object_name=n_tablename;

update sys.col$

set name=n_newcolname

where obj# = n_objnum and

name=n_oldcolname;

commit;

end altercolname;

在oracle 9i中,可以直接使用

alter table table_name rename column *** to ***

Oracle 資料字典

資料字典包括以下內容 1.所有資料庫schema物件的定義 表,檢視,索引,聚簇,同義詞,序列,過程,函式,包,觸發器 2.資料庫的空間分配和使用情況 3.欄位的預設值 4.完整性約束資訊 5.oracle使用者名稱,角色,許可權等資訊 6.審計資訊 7.其他資料庫資訊 資料字典有4部分組成 內部r...

oracle 資料字典

oracle資料字典 select from user tab columns 檢視使用者列物件 select from user tab comments 檢視使用者表的備註 select from user tab statistics select from all users 所有使用者 s...

Oracle 資料字典

資料字典包括以下內容 1.所有資料庫schema物件的定義 表,檢視,索引,聚簇,同義詞,序列,過程,函式,包,觸發器 2.資料庫的空間分配和使用情況 3.欄位的預設值 4.完整性約束資訊 5.oracle使用者名稱,角色,許可權等資訊 6.審計資訊 7.其他資料庫資訊 資料字典有4部分組成 內部r...