CLOB 插入兩大方式對比
方式一:SQL 字串直接拼接(不推薦)
String sql = "INSERT INTO xx(id, test) VALUES ('" + id + "', '" + data + "')";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
- 限制:Oracle SQL 陳述式中單引號間字串長度 不得超過 4000 位元組
- 錯誤:
ORA-01704: string literal too long (超過 4000)
- 更糟:2000-4000 位元組間可能觸發
ORA-01461(LONG 類型限制)
- 根因:SQL 解析階段即受限,非資料類型限制
方式二:參數綁定(強烈推薦)
String sql = "INSERT INTO xx(id, test) VALUES (:id, :data)";
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.Parameters.Add("id", id);
cmd.Parameters.Add("data", OracleDbType.Clob).Value = data;
cmd.ExecuteNonQuery();
- 繞過 SQL 字串字面值長度限制
- 支援任意大小 CLOB(受限於 4GB-1 理論上限)
- 防止 SQL 注入,效能更佳(計劃重用)
- 無特殊錯誤處理需求
CLOB 核心特性速查
| 特性 | 說明 |
| 最大長度 | 4GB - 1 (4,294,967,295 位元組) |
| 字元集 | 資料庫字元集 (AL32UTF8 等) |
| 儲存方式 | 行內 (小於 ~4000 bytes) 或行外 (LOB Segment) |
| 暫存 LOB | PL/SQL 中使用 DBMS_LOB.CREATETEMPORARY |
.NET/OracleClient 完整範例
using (OracleConnection conn = new OracleConnection(connStr))
using (OracleCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "INSERT INTO docs(id, content) VALUES (:id, :content)";
cmd.Parameters.Add("id", OracleDbType.Varchar2).Value = Guid.NewGuid().ToString();
cmd.Parameters.Add("content", OracleDbType.Clob).Value = largeTextContent;
cmd.ExecuteNonQuery();
}
PL/SQL 端處理 CLOB
DECLARE
v_clob CLOB;
BEGIN
-- 建立暫存 CLOB
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
-- 寫入資料
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_data), v_data);
-- 插入表
INSERT INTO docs(id, content) VALUES (seq_id.NEXTVAL, v_clob);
-- 釋放暫存
DBMS_LOB.FREETEMPORARY(v_clob);
END;
常見陷阱避坑指南
- 永不直接拼接 CLOB 到 SQL 字串 — 4000 位元組硬性限制
- 使用參數綁定 — 統一解決長度、注入、效能問題
- 大量載入 — 考慮
SQL*Loader、External Table、DBMS_LOB.LOADCLOBFROMFILE
- 讀取大 CLOB — 使用
DBMS_LOB.READ 分塊讀取,避免記憶體暴增
- 字元集轉換 — 客戶端 NLS_LANG 需與資料庫字元集相容
- 上一篇文章: Oracle 10g 伺服器部署要點:遠程連線、防火牆、SSH 與啟動模式完整指南
- 下一篇文章: Oracle XMLType 完整操作指南:建表、插入、查詢、更新與大文件載入
Copyright ©
程式碼之家 All Rights Reserved