金仓 Oracle 兼容模式
KingbaseES 提供 Oracle 兼容模式,通过设置 database_mode = oracle 可兼容大量 Oracle 语法,但仍有部分差异需手工处理。
# 创建 Oracle 兼容模式数据库 CREATE DATABASE myapp_db TEMPLATE template0 ENCODING 'UTF8' WITH db_compatibility = 'oracle';
常见语法兼容问题
问题一:ROWNUM 用法
-- Oracle 写法 SELECT * FROM emp WHERE ROWNUM <= 10; -- 金仓标准写法(同时兼容 Oracle 模式下的 ROWNUM) SELECT * FROM emp LIMIT 10;
问题二:DATE 类型含时间部分
Oracle 的 DATE 同时存储日期和时间;金仓标准模式下 DATE 仅存储日期,Oracle 兼容模式下 DATE 等同于 TIMESTAMP。
-- 查看当前模式 SHOW database_mode; -- 若在标准模式,将字段类型改为 TIMESTAMP ALTER TABLE orders ALTER COLUMN created_at TYPE TIMESTAMP;
问题三:序列和自增字段
-- Oracle 写法(触发器 + 序列) CREATE SEQUENCE emp_id_seq START WITH 1; -- 金仓推荐写法(IDENTITY 列,更简洁) CREATE TABLE emp ( id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name VARCHAR(50) ); -- 兼容写法(Oracle 兼容模式下同样支持) CREATE TABLE emp ( id INTEGER DEFAULT emp_id_seq.nextval PRIMARY KEY, name VARCHAR(50) );
问题四:存储过程中的异常处理
-- Oracle 写法 EXCEPTION WHEN NO_DATA_FOUND THEN v_result := NULL; WHEN OTHERS THEN RAISE; -- 金仓兼容(Oracle 模式支持;标准模式需改为 KSQL 语法) EXCEPTION WHEN NO_DATA_FOUND THEN v_result := NULL; WHEN OTHERS THEN RAISE EXCEPTION '%', SQLERRM;
迁移工具推荐
| 工具 | 用途 | 备注 |
|---|---|---|
| KDts(金仓数据迁移工具) | Schema 和数据迁移 | 官方工具,可视化界面 |
| KSQL Developer | SQL 语法转换验证 | 内置 Oracle 语法检测 |
| AWR 对比报告 | 迁移前后性能对比 | 需采集基线数据 |
迁移建议:按"存储过程 → 触发器 → 视图 → 应用 SQL"顺序逐层验证,每一层验证通过后再推进,避免问题堆积导致返工。