首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 常用 FAQ 精選 (一):架構體系基礎篇——數據類型、保留字、版本查詢、字符集與 DDL 獲取

     編輯:Oracle 資料庫基礎

一、Oracle 核心數據類型完整對照

類型分類最大長度/範圍關鍵特性
CHAR固定長度字元2000 位元組空白填充語義,比較時填充至同長度
NCHAR多位元組固定長度2000 字元/位元組按字符集定長,國家字符集專用
VARCHAR2變長字元4000 字元**首選字串類型**,非填充比較語義
NVARCHAR2多位元組變長4000 字元/位元組國家字符集變長類型
DATE日期時間7 位元組固定含世紀/年/月/日/時/分/秒,預設格式 DD-MON-YY
NUMBER數值38 位精度,10-130 ~ 10126變長儲存,通常 4-21 位元組
LONG長文本2 GB已棄用,單表僅 1 列,限制極多
RAW二進制2000 位元組不經字符集轉換
LONG RAW長二進制2 GB已棄用,同 LONG 限制
BLOB二進制大物件4 GB (受限於資料塊大小)LOB 族首選,支援隨機讀寫
CLOB字元大物件4 GB字元集轉換支援
NCLOB國家字符集 CLOB4 GBNCHAR 字符集存儲
BFILE外部二進制檔案OS 限制唯讀,資料庫存儲目錄對象指標
ROWID物理地址10 位元組 (8i+)編碼:對象+檔案+塊+行
UROWID通用 ROWID4000 位元組支援索引組織表、外部表
MLSLABELTrusted Oracle 標籤2-5 位元組極少用,標籤安全專用

遷移建議

  • LONG/LONG RAW → **CLOB/BLOB** (10g+ 支援 TO_LOB 轉換)
  • CHAR → **VARCHAR2** (除非固定長度代碼表)
  • NUMBER(p,s) 明確指定精度刻度,避免隱含轉換

二、保留關鍵字 (8i 基準) — 不可作為對象名

ACCESS  ADD  ALL  ALTER  AND  ANY  AS  ASC  AUDIT  BETWEEN
BY  CHAR  CHECK  CLUSTER  COLUMN  COMMENT  COMPRESS
CONNECT  CREATE  CURRENT  DATE  DECIMAL  DEFAULT  DELETE
DESC  DISTINCT  DROP  ELSE  EXCLUSIVE  EXISTS  FILE  FLOAT
FOR  FROM  GRANT  GROUP  HAVING  IDENTIFIED  IMMEDIATE
IN  INCREMENT  INDEX  INITIAL  INSERT  INTEGER  INTERSECT
INTO  IS  LEVEL  LIKE  LOCK  LONG  MAXEXTENTS  MINUS  MLSLABEL
MODE  MODIFY  NOAUDIT  NOCOMPRESS  NOT  NOWAIT  NULL
NUMBER  OF  OFFLINE  ON  ONLINE  OPTION  OR  ORDER  PCTFREE
PRIOR  PRIVILEGES  PUBLIC  RAW  RENAME  RESOURCE  REVOKE
ROW  ROWID  ROWNUM  ROWS  SELECT  SESSION  SET  SHARE
SIZE  SMALLINT  START  SUCCESSFUL  SYNONYM  SYSDATE  TABLE
THEN  TO  TRIGGER  UID  UNION  UNIQUE  UPDATE  USER  VALIDATE
VALUES  VARCHAR  VARCHAR2  VIEW  WHENEVER  WHERE  WITH

完整動態查詢:SELECT * FROM V$RESERVED_WORDS

三、核心資訊快速查詢指令

需求SQL/命令輸出關鍵信息
資料庫版本詳情SELECT * FROM V$VERSION版本號、核心版本、位數 (32/64-bit)
OS 層面確認位數file $ORACLE_HOME/bin/oracleELF 32-bit/64-bit LSB executable
參數當前值SHOW PARAMETER param_name如 SPFILE 啟用狀態
所有參數 (含隱含)SELECT * FROM V$PARAMETERISDEFAULT, ISSES_MODIFIABLE, ISSYS_MODIFIABLE
隱含參數專用查詢複雜 X$ 關聯查詢 (見原文)欄位:NAME, VALUE, DEFAULT, SES_MOD, SYS_MOD, MODIFIED, DESCRIPTION

四、字符集三層架構與修改鐵律

三層字符集來源與優先級

層級查詢視圖來源生效範圍
資料庫服務端NLS_DATABASE_PARAMETERSPROPS$ 表資料儲存實際編碼
客戶端環境NLS_INSTANCE_PARAMETERSV$PARAMETER (參數檔/環境變數/註冊表)客戶端會話預設
會話級NLS_SESSION_PARAMETERSV$NLS_PARAMETERS (ALTER SESSION / 環境變數)當前會話實際生效

優先級遞增:ALTER SESSION > 環境變數 > 註冊表 > 參數檔

字符集修改鐵律 (8i+)

  1. **僅支援子集 → 超集** 遷移 (如 US7ASCII → ZHS16GBK),**不可逆向**
  2. **嚴禁直接修改 PROPS$** 表,會導致資料字典不一致、嚴重損壞
  3. 標準流程:
    STARTUP NOMOUNT;
    ALTER DATABASE MOUNT EXCLUSIVE;
    ALTER SYSTEM ENABLE RESTRICTED SESSION;
    ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    ALTER DATABASE OPEN;
    ALTER DATABASE CHARACTER SET ZHS16GBK;  -- 目標字符集
    SHUTDOWN IMMEDIATE;
    STARTUP;

NLS_LANG 設定黃金法則

# 格式:語言_地區.字符集
# 字符集**必須**與資料庫字符集一致
# 語言建議用英文避免訊息亂碼
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

五、函數索引建立前提 (8i+)

-- 必須參數
QUERY_REWRITE_ENABLED = TRUE
QUERY_REWRITE_INTEGRITY = TRUSTED
COMPATIBLE = 8.1.0 以上

-- 建立語法
CREATE INDEX idx_upper_name ON employees (UPPER(last_name));

-- 使用條件:WHERE 條件必須與索引表達式完全一致
SELECT * FROM employees WHERE UPPER(last_name) = 'KING';

六、表/分區移動語法與 LOB 特殊處理

表移動

ALTER TABLE table_name MOVE
  [TABLESPACE new_ts]
  [STORAGE (INITIAL 50M NEXT 50M PCTINCREASE 0 PCTFREE 10 PCTUSED 50 INITRANS 2)]
  [NOLOGGING];

分區移動

ALTER TABLE table_name MOVE PARTITION part_name
  [TABLESPACE new_ts]
  [UPDATE GLOBAL INDEXES];  -- 9i+ 同步維護全域索引,否則需手動 REBUILD

LOB 段移動 (普通 MOVE 不移動 LOB)

ALTER TABLE table_name MOVE
  LOB (lob_column) STORE AS (TABLESPACE new_ts);

七、SCN 獲取方式演進

版本方法SQL
9i 及之前X$ 表計算SELECT MAX(KTUXESCND*POWER(2,32)+KTUXESCNW) FROM X$KTUXE
10g / 9i+ (含閃回)DBMS_FLASHBACKSELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL
12c+V$ 視圖直取SELECT CURRENT_SCN FROM V$DATABASE

八、ROWID 結構解碼

版本格式組成 (十六進制)欄位含義
8i+ (擴展)OOOOOO FFF BBBBBB RRR6+3+6+3 = 18 字元對象ID、檔案ID、塊ID、行ID
8.0 之前 (受限)BBBBBBBB.RRRR.FFFF8+4+4 = 16 字元塊ID.行ID.檔案ID

應用:統計表實際佔用塊數

SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) AS used_blocks
FROM large_table;

九、DBMS_METADATA 獲取 DDL (9i+)

單對象 DDL

SET LONG 90000 PAGES 0 HEADING OFF FEEDBACK OFF ECHO OFF
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TABLE_NAME', 'SCHEMA_NAME') FROM DUAL;

全模式腳本化

SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) 
FROM USER_TABLES;

索引/約束/視圖/序列等同理,修改物件類型參數即可。

十、約束索引指定表空間技巧

方法一:先建索引再建約束

CREATE INDEX pk_idx ON t(c1) TABLESPACE index_ts;
ALTER TABLE t ADD CONSTRAINT pk_c1 PRIMARY KEY (c1) USING INDEX pk_idx;

方法二:單條 SQL 內建 (8i+)

CREATE TABLE test (
  c1 NUMBER CONSTRAINT pk_c1 PRIMARY KEY USING INDEX TABLESPACE user_idx,
  c2 VARCHAR2(10)
) TABLESPACE user_data;

結語

本文匯總 Oracle 架構體系最高頻 10 大 FAQ 類別,從數據類型選型到字符集遷移鐵律,從隱含參數探勘到 DDL 元數據提取,構成 DBA 與開發者的「隨身速查手冊」。建議將核心查詢 SQL 封裝為 dba_quick_check.sql 腳本庫,新環境接手時首批執行,快速建立系統畫像。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved