4.5. 不支持特性
本节主要介绍统一SQL Oracle2LightDb-oracle
不支持转换的Oracle特性。
4.5.1. 数据类型
4.5.1.1. NUMBER
- 当
p
、s
是以下情况时,不支持: p >= 39
p == 0
s > 127
p==0 && s == 0
s < 0
例如:
create table t(col NUMBER(39));
create table t(col NUMBER(0));
create table t(col NUMBER(1,128));
create table t(col NUMBER(0,0));
4.5.1.2. BFILE
数据类型BFILE不支持
4.5.1.3. FLOAT
数据类型n范围为[1,53],超出区间不支持
4.5.1.4. ROWNUM
ROWNUM
用于WHERE条件中时,以下情况不支持:WHERE ROWNUM <> 1
WHERE ROWNUM != 1
WHERE ROWNUM > x AND ROWNUM <= y
WHERE ROWNUM > x OR ROWNUM <= y
4.5.2. 数字函数
4.5.2.1. SQRT
涉及浮点数加后缀的情况,不支持转换。
例如:
select SQRT(3.0d),SQRT(-3.0d),SQRT(3.0f),SQRT(-3.0f) from dual;
4.5.2.2. TRUNC
涉及浮点数加后缀的情况,不支持转换。
例如:
select TRUNC(1.5d),trunc(15.79d, 1),trunc(15.79f, -1) from dual;
4.5.3. 字符串函数
4.5.3.1. INSTR
INSTR
用于以下情况时不支持INSTRC,INSTR2,INSTR4
例如:
SELECT
INSTRC('CORPORATE FLOOR','OR',5,2) AS instrcr,
INSTR2('CORPORATE FLOOR','OR',5,2) AS instr2r,
INSTR4('CORPORATE FLOOR','OR',5,2) AS instr4r FROM DUAL;
4.5.4. 时间日期函数
4.5.4.1. TO_DSINTERVAL
不支持 DEFAULT
用法。
例如:
select TO_DSINTERVAL('1o 1:02:10' DEFAULT '10 8:00:00' ON CONVERSION ERROR) "Value" from dual;
4.5.4.2. TO_YMINTERVAL
TO_YMINTERVAL
用于以下情况时不支持DEFAULT语法
例如:
SELECT TO_YMINTERVAL('1x-02' DEFAULT '00-00' ON CONVERSION ERROR) "Value" FROM DUAL;
4.5.4.3. SCN_TO_TIMESTAMP
不支持。
例如:
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM employees WHERE employee_id = 188;
4.5.5. 通用比较函数
4.5.6. 转换函数
4.5.6.1. TO_NUMBER
不支持2个及2个以上参数的用法。
例如:
select TO_NUMBER('-AusDollars100','L9G999D99',' NLS_NUMERIC_CHARACTERS = '',.''NLS_CURRENCY = ''AusDollars''') "Amount" from dual;
4.5.6.3. TO_DATE
TO_DATE
用于以下情况时不支持DEFAULT语法
例如:
SELECT TO_DATE('Febuary 15, 2016, 11:00 A.M.'
DEFAULT 'January 01, 2016 12:00 A.M.' ON CONVERSION ERROR,
'Month dd, YYYY, HH:MI A.M.') "Value"
FROM DUAL;
4.5.6.4. TO_NCHAR
TO_NCHAR
用于以下情况时不支持多于1个参数
例如:
SELECT TO_NCHAR(hire_date,'YYYY-MM-DD') from tb_employee;
4.5.6.5. TO_CHAR
TO_CHAR
用于以下情况时不支持INTERVAL分支语法
例如:
SELECT TO_CHAR(INTERVAL '123-2' YEAR(3) TO MONTH) FROM DUAL;
4.5.7. 分析函数
4.5.7.1. CORR_K、CORR_S
不支持。
例如:
SELECT CORR_S(salary, commission_pct) commission, CORR_S(salary, employee_id) empid FROM employees;
4.5.8. 聚合函数
4.5.8.1. CORR_K、CORR_S
不支持。
例如:
SELECT CORR_S(salary, commission_pct) commission, CORR_S(salary, employee_id) empid FROM employees;
4.5.9. 伪列
4.5.9.1. ROWNUM
ROWNUM
用于WHERE条件中时,以下情况不支持:WHERE ROWNUM <> 1
WHERE ROWNUM != 1
WHERE ROWNUM > x AND ROWNUM <= y
WHERE ROWNUM > x OR ROWNUM <= y
4.5.10. 查询
4.5.10.1. PIVOT
- 以下情况不支持:
SELECT *
SELECT fields 中经过pivot for、in分配后剩余用于group by的字段为空
PIVOT … IN 中的表达式没有别名
FROM后面的表带别名
FROM后面是子查询
例如:
select * from t_test a pivot(min(score) for subject in('CHINESE' as c90, 'MATH' as m80, 'ENGLISH' as e70)) where id in (1, 2, 3) order by id;
select id,name,c90,m80,e70 from (select * from a) pivot(min(score) for subject in('CHINESE' as c90, 'MATH' as m80, 'ENGLISH' as e70)) where id in (1, 2, 3) order by id;
select c90 from t_test pivot(min(score) for subject in('CHINESE' as c90, 'MATH' as m80, 'ENGLISH' as e70)) where id in (1, 2, 3) order by id;
4.5.10.2. UNPIVOT
- 以下情况不支持:
FROM后面的表带别名
FROM后面是子查询
例如:
select id, name, score, subject from t_test a unpivot(score for subject in(chinese, math, english)) where id in (1, 2, 3) order by id;
select id, name, score, subject from (select * from a) unpivot(score for subject in(chinese, math, english)) where id in (1, 2, 3) order by id;
4.5.10.3. CONNECT BY
CONNECT BY
中以下情况不支持connect_by_iscycle 不支持
connect_by_root(xxx) 虚列中xxx只支持column,不支持表达式和计算
sys_connect_by_path(xxx,text)虚列中xxx只支持column,不支持表达式和计算
层次查询特有表达式不支持嵌套使用:如: sys_connect_by_root(prior column)
不支持和oracle(+)一起使用
不支持和pivot, unpivot函数一起使用
列名不支持带schema名和数据库名,只支持表名和字段名
不支持和cte一起使用
4.5.10.4. JSON_QUERY
不支持
4.5.10.5. JSON_TABLE
不支持
4.5.10.6. JSON_VALUE
不支持
4.5.10.7. JSON_ARRAY
不支持
4.5.10.8. JSON_ARRAYAGG
不支持
4.5.10.9. JSON_OBJECT
不支持
4.5.10.10. JSON_OBJECTAGG
不支持
4.5.10.11. max|min(列1) keep(dense_rank first|last order by 列2)
不支持
4.5.11. 外连接符号(+)
4.5.11.1. (+)
a.key1 = b.key1(+) or a.key2 = b.key2(+) 不支持OR
例如:
SELECT * FROM table1 t1, table2 t2, table3 t3 WHERE t1.column1 = t2.column1(+) OR t1.column1 = t3.column1(+);
4.5.12. DDL
4.5.12.2. ALTER TABLE table_name ADD PARTITION partition_definition
新增分区不支持。
例如:
ALTER TABLE sales_data ADD PARTITION q1_2024 VALUES LESS THAN (TO_DATE('2024/04/01', 'yyyy/mm/dd'));
4.5.12.3. ALTER TABLE tbl_name (MERGE|COALESCE) PARTITIONS merge_table_partitions::=
合并分区不支持。
例如:
ALTER TABLE sales_data MERGE PARTITIONS q4_2023, q1_2024 INTO PARTITION q1_2024;
4.5.13. DML
4.5.13.1. INSERT FIRST
不支持
例如:
INSERT FIRST
WHEN sal > 10000 THEN
INTO high_sal_emp (empno, ename, job, sal)
VALUES (empno, ename, job, sal)
WHEN sal > 5000 THEN
INTO mid_sal_emp (empno, ename, job, sal)
VALUES (empno, ename, job, sal)
ELSE
INTO low_sal_emp (empno, ename, job, sal)
VALUES (empno, ename, job, sal)
SELECT * FROM table1
4.5.13.2. MERGE INTO
MERGE INTO
用于以下情况不支持MERGE INTO … DELETE
例如:
MERGE INTO table2 t2
USING table1 t1
ON (t1.id = t2.id)
WHEN MATCHED THEN
UPDATE SET t2.name = t1.name,t2.age = t1.age
DELETE WHERE t2.age > 30
WHEN NOT MATCHED THEN
INSERT (id, name, age) VALUES (t1.id, t1.name, t1.age)
4.5.13.3. INSERT INTO TABLE PARTITION
插入分区数据不支持
例如:
INSERT INTO t PARTITION (p1) (col,col2,col3) VALUES (1,2,3)