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