Oracle 21c 不支持 VECTOR 类型和向量索引,VECTOR_DISTANCE 等功能仅从 23ai(23.4+)开始原生引入;在 21c 中需通过外部服务计算向量距离,数据库仅作元数据存储与关联查询。

Oracle 21c 不支持 VECTOR 类型和向量索引。这是最关键的前提,必须先明确——所有在 PL/SQL 中调用 VECTOR_DISTANCE、创建 VECTOR 列、或使用 INMEMORY 向量加速的语义搜索能力,仅从 Oracle 23ai(23.4+)开始原生引入。
如果你正在 Oracle 21c 环境里尝试“向量搜索”,实际走通的只有两条路:绕开数据库内建能力,或确认版本误判。
确认你真在用 Oracle 21c?还是误把 23ai 当成 21c?
很多团队升级后仍沿用旧版客户端或未刷新数据字典视图,导致误判版本:
- 执行
SELECT * FROM v$version;,确认输出中含Oracle Database 23c或23.4.0.0.0及以上; - 若显示
21.0.0.0.0或21.13.0.0.0,则VECTOR类型不存在,CREATE INDEX ... ON col VECTOR会报ORA-00904: invalid identifier或ORA-02000: missing VECTOR keyword; -
SELECT object_name FROM all_objects WHERE object_name = 'VECTOR_DISTANCE';在 21c 中返回空集;23ai 中该函数存在且可直接在 SQL/PL/SQL 中调用。
别在 21c 里硬写 VECTOR_DISTANCE(v1, v2, 'COSINE') —— 它根本无法解析。
在 Oracle 21c 中模拟语义搜索的可行路径
没有原生向量类型,但你可以用标准 SQL + 外部计算完成近似流程:
- 把 embedding 向量存为
RAW或BLOB(例如 384 维 float32 → 1536 字节 RAW); - 在应用层或存储过程里用 UTL_RAW / UTL_NLA 实现余弦距离计算(需手动 unpack float 数组、归一化、点积);
- 或更现实的做法:把向量计算完全移出数据库,只用 Oracle 做元数据关联和结果过滤。
常见组合是:
- 应用层调用 OpenAI / BGE API 获取 query 向量;
- 用
UTL_HTTP或外部表把向量传入 PL/SQL,再通过自定义函数查 BLOB 列做逐行距离计算(性能极差,仅适合百条以内); - 真实业务中几乎没人这么做——因为单次余弦计算在 PL/SQL 里要 10ms+,查 1w 行就是 100 秒。
所以务实建议是:
- 不要在 21c PL/SQL 里实现向量距离逻辑,CPU 和可维护性都不划算
- 把向量相似度计算交给专用服务(Python FastAPI + FAISS / Qdrant),Oracle 只存 ID 和业务字段
- 用 DB Link 或 REST Data Source(Oracle 21c 支持)从外部向量服务拉回 top-k ID,再 join 本地表查详情
为什么有人觉得 21c “能做向量搜索”?
混淆点通常来自三类情况:
- 用了第三方插件(如 Oracle Text 的
CTXSYS.CTX_CONTAINS配合自定义 lexer),但这只是关键词扩展,不是语义向量; - 把 Oracle Machine Learning(OML)里的
DBMS_DATA_MINING聚类当成了向量检索——它不支持实时 query-to-vector 检索; - 开发环境连的是测试库(23ai),而生产库仍是 21c,没做版本兼容检查就上线,导致
PLS-00201: identifier 'VECTOR_DISTANCE' must be declared报错。
特别注意:VECTOR_DISTANCE 不是包函数,不能通过 CREATE OR REPLACE FUNCTION 在 21c 里“自己造一个”——它的实现深度绑定数据库内核的向量运算引擎和 INMEMORY 列缓存。
真正需要 PL/SQL 参与向量搜索的场景,只存在于 23ai 及以后版本。如果你当前被卡在 21c,最省力的升级路径不是改代码,而是确认是否已获准升级到 23ai —— 因为所有向量索引、INMEMORY 自动优化、VECTOR 绑定语法,都是 23ai 的原子能力,无法向下移植。


















