4.5. 不支持特性

本节主要介绍统一SQL Oracle2LightDb-oracle 不支持转换的Oracle特性。

4.5.1. 数据类型

4.5.1.1. NUMBER

ps 是以下情况时,不支持:
  • 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.2.3. CHR

不支持 USING 用法。

例如:

select CHR (196 USING NCHAR_CS) from dual;

4.5.2.4. LPAD

不支持字符类型以外的类型。

例如:

select LPAD(12345,6),LPAD(12345,6,'^') from dual;

4.5.2.5. UPPER

不支持字符类型以外的类型。

例如:

select UPPER(123) 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.5.1. GREATEST

不支持字符类型以外的类型。

例如:

select GREATEST(1, '3.925', '2.4') from dual;

4.5.5.2. LEAST

不支持字符类型以外的类型。

例如:

select LEAST(1, '3.925', '2.4') from dual;

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.2. TO_CLOB

不支持2个及2个以上参数的用法。

例如:

SELECT TO_CLOB(docu, 873, 'text/xml') FROM media_tab;

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.1. ALTER INDEX id_name

启用/禁用索引不支持。

例如:

ALTER INDEX idx DISABLE;

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)