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

Oracle LONG 型別深度解析:特性、限制與大文本插入實戰

     編輯:Oracle 資料庫基礎

前言

LONG 是 Oracle 早期用於儲存超大文本(上限 2 GB)的資料型別,雖然 12c 起官方建議改用 CLOB,但大量舊系統仍在使用。本文系統梳理其特性、嚴格限制,並提供 PL/SQL 跨表複製與 Java setCharacterStream 插入超長文本的實戰方案。

一、LONG 型別核心特性

  • 容量:可變長字串,最大 2 GB。
  • 適用場景:不需全文檢索的長文本(如資料字典物件定義);需搜尋請用 VARCHAR2 或 CLOB + Oracle Text。
  • 工具支援差:SQL*Plus、大多數 GUI 工具難以正常顯示/匯出。
  • 受磁碟空間限制:實際可用大小取決於表空間剩餘空間。

二、允許的 SQL 操作(極少)

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

三、嚴格限制清單(必讀)

#限制項目說明
1單表僅一欄一張表只能定義一個 LONG 欄位
2不可建索引無法創建任何類型索引
3不可叢集含 LONG 欄位的表不能建立叢集
4跨表 INSERT SELECT 失效INSERT INTO t2 SELECT * FROM t1 會報 ORA-00997
5CTAS 失效CREATE TABLE t2 AS SELECT * FROM t1 同報錯
6約束極少僅支援 NULL/NOT NULL/DEFAULT,不能做 PK
7查詢子句受限不可用於 WHERE/GROUP BY/ORDER BY/DISTINCT
8分布式查詢不可用DB Link 跨庫查詢不支援 LONG
9PL/SQL 變數不可宣告無法 DECLARE v_long LONG;
10SQL 函數不可用SUBSTR、INSTR 等均不支援

四、跨表複製 LONG 資料:PL/SQL 兩階段法

因限制 #4,需先插入非 LONG 欄位,再逐列更新 LONG 欄位:

DECLARE
  CURSOR c_src IS SELECT id, history FROM testlong;
  r_src c_src%ROWTYPE;
BEGIN
  -- 1. 先複製其他欄位
  INSERT INTO testlong1 (id, name)
  SELECT id, name FROM testlong;

  -- 2. 逐列更新 LONG 欄位
  OPEN c_src;
  LOOP
    FETCH c_src INTO r_src;
    EXIT WHEN c_src%NOTFOUND;
    UPDATE testlong1 SET history = r_src.history WHERE id = r_src.id;
  END LOOP;
  CLOSE c_src;
  COMMIT;
END;
/

五、Java JDBC 插入超過 4000 字元的 LONG 欄位

直接 setString 會觸發 ORA-01704(字串字面值過長)。解決方案:使用 PreparedStatement.setCharacterStream 以流式寫入。

String sql = "INSERT INTO msg_info (id, gp_id, title, content, status, create_time, expire_time, upid) VALUES (?,?,?,?, 'C', SYSDATE, SYSDATE+?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setLong(1, msgId);
ps.setInt(2, gpId);
ps.setString(3, title);
// 關鍵:用 CharacterStream 寫入超長文本
ps.setCharacterStream(4, new StringReader(content), content.length());
ps.setInt(5, msgTerm);
ps.setLong(6, upId);
ps.executeUpdate();
conn.commit();

注意:Oracle 12c+ 強烈建議遷移至 CLOB,並使用 setClob / setCharacterStream 對應 CLOB 欄位,相容性更佳。

六、總結

LONG 型別限制極多,僅作為歷史系統維護之用。新專案請直接採用 CLOB + SecureFiles 儲存,並搭配 Oracle Text 實現全文檢索。若必須操作既有 LONG 欄位,請牢記「先插其他欄、再更新 LONG」與「JDBC 用 CharacterStream」兩大鐵律。

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