首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle LONG 型別深度解析:特性、限制與實戰操作

     編輯:Oracle 資料庫相關知識

LONG 型別核心特性

  • 可變長度字串,理論上限 2 GB。
  • 主要用於不需全文檢索的大型文本(如數據字典物件定義、日誌全文)。
  • 若需字串搜尋,請改用 VARCHAR2 或 CLOB。
  • 許多工具(含 SQL*Plus)對 LONG 支援極差,操作受限。
  • 受限於磁碟空間,實際可用大小取決於存儲配置。

允許的 SQL 操作

  1. SELECT 查詢
  2. UPDATE ... SET long_col = ...
  3. INSERT ... VALUES (..., long_val)

十大硬性限制(必讀)

#限制項目說明
1單表僅能有一個 LONG 欄位嘗試新增第二個會報錯
2不可建立索引無法加速查詢
3含 LONG 欄位的表不可作叢集CLUSTER 語法不支援
4SQL*Plus 中不可 INSERT INTO ... SELECT 跨表複製 LONG需分兩步:先插其他欄位,再更新 LONG
5不可 CREATE TABLE AS SELECT 建立含 LONG 的表同理需分步驟
6除 NULL/NOT NULL/DEFAULT 外,不可加其他約束(如 PK、FK、CHECK)LONG 不能作主鍵
7LONG 欄位不可出現在 WHERE、GROUP BY、ORDER BY、DISTINCT 子句查詢條件不可直接引用
8不支援分散式查詢跨 DB Link 讀取會失敗
9PL/SQL 變數不可宣告為 LONG 型別需用 VARCHAR2(32767) 或 CLOB 接收
10不可套用 SQL 字串函數(SUBSTR、INSTR 等)需先轉為 CLOB 再處理

實戰:跨表複製 LONG 資料(分兩階段)

因限制 #4,無法直接 INSERT INTO t2 SELECT * FROM t1。正確流程:

-- 1. 建立目標表(結構相同)
CREATE TABLE testlong1 (id NUMBER, name VARCHAR2(12), history LONG);

-- 2. 先插入非 LONG 欄位
INSERT INTO testlong1 (id, name)
SELECT id, name FROM testlong;

-- 3. 逐筆更新 LONG 欄位(需在 PL/SQL 區塊或應用程式中迴圈處理)
DECLARE
  l_hist LONG;
BEGIN
  FOR r IN (SELECT id, history FROM testlong) LOOP
    -- 注意:PL/SQL 不能直接宣告 LONG 變數,這裡僅示意邏輯
    -- 實際需用 DBMS_SQL 或動態 SQL 繞過限制
    UPDATE testlong1 SET history = r.history WHERE id = r.id;
  END LOOP;
  COMMIT;
END;
/

建議:新專案請直接使用 CLOB(Oracle 8i+),功能完整、無上述限制,且支援 DBMS_LOB 豐富 API。

快速查詢範例

SELECT id, name, history FROM testlong;

輸出會顯示 LONG 內容(SQL*Plus 預設截斷,需 SET LONG 100000 調整)。

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