-- Oracle 原代码SELECT TRUNC(SYSDATE,'YYYY') AS year_start, TRUNC(SYSDATE,'HH24') AS hour_start, MONTHS_BETWEEN(SYSDATE, TO_DATE('2025-01-01','YYYY-MM-DD')) AS month_diff FROM DUAL;
-- KingbaseES 适配后代码SELECT date_trunc('year',CURRENT_DATE) AS year_start, date_trunc('hour',CURRENT_DATE) AS hour_start, MONTHS_BETWEEN(CURRENT_DATE, TO_DATE('2025-01-01','YYYY-MM-DD')) AS month_diff FROM DUAL;
-- Oracle 原代码:计算中位数SELECT MEDIAN(salary) AS median_sal FROM employees;
-- KingbaseES 适配后代码:用 PERCENTILE_CONT 实现同样功能SELECTPERCENTILE_CONT(0.5) WITHINGROUP (ORDERBY salary) AS median_sal FROM employees;
-- Oracle 原代码:构造 JSON 对象SELECTJSON_OBJECT('id'VALUE1,'name'VALUE'test') AS json_obj FROM DUAL;
-- KingbaseES 适配后代码:语法兼容,支持更多参数SELECT json_build_object('id',1,'name','test') AS json_obj FROM DUAL;
-- KingbaseES 扩展用法:解析 JSON 数组SELECT json_array_elements('[{"id":1},{"id":2}]') AS json_elem FROM DUAL;
层次查询:CONNECT BY 语法兼容,还支持 CONNECT_BY_ISCYCLE、CONNECT_BY_ISLEAF 伪列。
代码示例:层次查询适配
-- Oracle 原代码:查询部门层级关系SELECT dept_id, dept_name, LEVEL, CONNECT_BY_ISLEAF AS is_leaf FROM departments STARTWITH parent_dept_id ISNULLCONNECTBY PRIOR dept_id = parent_dept_id;
-- KingbaseES 适配后代码:直接复用,结果完全一样SELECT dept_id, dept_name, LEVEL, CONNECT_BY_ISLEAF AS is_leaf FROM departments STARTWITH parent_dept_id ISNULLCONNECTBY PRIOR dept_id = parent_dept_id;
3. 不支持语法的替代方案
KingbaseES 不支持 Oracle 的 DELETE hint 语法,想实现类似性能优化,可通过禁用索引或调整查询逻辑:
-- Oracle 原代码:使用 hint 强制全表扫描DELETE/*+ FULL(employees) */FROM employees WHERE hire_date <'2020-01-01';
-- KingbaseES 适配后代码:禁用索引实现全表扫描(也能调整优化器参数)ALTER INDEX idx_emp_hire_date DISABLE;
DELETEFROM employees WHERE hire_date <'2020-01-01';
ALTER INDEX idx_emp_hire_date ENABLE;
-- Oracle 原代码:查询用户表信息SELECT table_name, tablespace_name, num_rows FROM all_tables WHERE owner ='SCOTT';
-- Oracle 原代码:查询当前会话信息SELECT sid, username, logon_time FROM v$session WHERE status='ACTIVE';
-- KingbaseES 适配后代码:直接复用,结果格式都兼容SELECT table_name, tablespace_name, num_rows FROM all_tables WHERE owner ='SCOTT';
SELECT sid, username, logon_time FROM v$session WHERE status='ACTIVE';