目录
统一SQL介绍
详见:统一SQL参考手册
PL数据类型
描述
PL 中每个常量、变量、参数、函数返回值都有一个数据类型,用来定义存储格式、使用限制、有效值范围以及合法操作等。
分类
-
SQL 数据类型
-
布尔型
-
RECOED
-
PLS_INTEGER
-
%TYPE
-
联合数组
-
嵌套表
-
可变数组
-
自定义子类型
-
游标指针
oracle官方链接:PL/SQL Data Types
统一SQL支持
统一SQL24.1.0.0版本开始支持简单PL/SQL转换。目前支持LightDB oracle模式 信创数据库的转换。后续版本会持续增强。
SQL 数据类型
序号 | 数据类型分类 | Oracle 数据类型 | 统一SQL | LightDB-Oracle 数据类型 |
---|---|---|---|---|
1 | 数字 | BINARY_FLOAT | 支持 | BINARY_FLOAT |
2 | 数字 | BINARY_DOUBLE | 支持 | BINARY_DOUBLE |
3 | 大对象 | BFILE | 不支持 | |
4 | 大对象 | BLOB | 支持 | BLOB |
5 | 字符 | CHAR(n),CHARACTER(n) | 支持 | CHAR(n),CHARACTER(n) |
6 | 大对象 | CLOB | 支持 | CLOB |
7 | 时间&日期 | DATE | 支持 | DATE |
8 | 数字 | DECIMAL(p,s),DEC(p,s) | 支持 | 参见下文 |
9 | 数字 | DOUBLE PRECISION | 支持 | DOUBLE PRECISION |
10 | 数字 | FLOAT(p) | 支持 | FLOAT(p) |
11 | 数字 | INTEGER,INT | 支持 | BIGINT |
12 | 时间&日期 | INTERVAL YEAR(p) TO MONTH | 支持 | INTERVAL YEAR TO MONTH |
13 | 时间&日期 | INTERVAL DAY(p) TO SECOND(s) | 支持 | INTERVAL DAY TO SECOND(s) |
14 | 其他类型 | LONG | 支持 | LONG |
15 | 其他类型 | LONG RAW | 支持 | BYTEA |
16 | 字符 | NCHAR(n) | 支持 | NCHAR(n) |
17 | 字符 | NCHAR VARYING(n) | 支持 | NCHAR VARYING(n) |
18 | 大对象 | NCLOB | 支持 | CLOB |
19 | 数字 | NUMBER(p,s),NUMERIC(p,s) | 支持 | 参见下文 |
20 | 字符 | NVARCHAR2(n) | 支持 | NVARCHAR2(n) |
21 | 其他类型 | RAW(n) | 支持 | RAW(n) |
22 | 其他类型 | REAL | 支持 | REAL |
23 | 其他类型 | ROWID | 支持 | ROWID |
24 | 数字 | SMALLINT | 支持 | BIGINT |
25 | 时间&日期 | TIMESTAMP(p) | 支持 | TIMESTAMP(p) |
26 | 时间&日期 | TIMESTAMP(p) WITH TIME ZONE | 支持 | TIMESTAMP(p) WITH TIME ZONE |
27 | 其他类型 | UROWID(n) | 支持 | VARCHAR(n) |
28 | 字符 | VARCHAR(n) | 支持 | VARCHAR(n) |
29 | 字符 | VARCHAR2(n) | 支持 | VARCHAR2(n) |
30 | XML类型 | XMLTYPE | 支持 | XMLTYPE |
类型具体使用相关以及精度、标度等请前往统一SQL参考手册中Oracle2LightDB-Oracle数据类型章节:统一SQL参考手册
备注:DECLARE 中变量有如下限制:
- CONSTANT 暂不支持
- XMLTYPE 暂不支持赋值
- INTERVAL YEAR TO MONTH 暂不支持赋值
- INTERVAL YEAR(p) TO MONTH 暂不支持赋值
- INTERVAL DAY TO SECOND 暂不支持赋值
- INTERVAL DAY(p) TO SECOND(s) 暂不支持赋值
- TIMESTAMP 暂不支持赋值
- TIMESTAMP WITH TIME ZONE 暂不支持赋值
- TIMESTAMP(p) WITH TIME ZONE 暂不支持赋值
- 赋值暂时只支持简单表达式
-
长度、精度、标度暂时不做范围限制,具体是否错误由执行层保证
使用案例
-- 转换前Oracle SQL:
DECLARE
acct_id1 BINARY_FLOAT := 0.0;
acct_id2 BINARY_DOUBLE := 0.0;
acct_id3 ROWID := '(0,1)';
acct_id4 BLOB := EMPTY_BLOB();
acct_id5 CHAR := 'A';
acct_id6 CHARACTER := 'A';
acct_id7 CLOB := EMPTY_CLOB();
acct_id8 DATE := TO_DATE('2024-03-19', 'YYYY-MM-DD');
acct_id9 DECIMAL := 0;
acct_id10 DEC := 0;
acct_id12 DOUBLE PRECISION := 0.0;
acct_id13 FLOAT := 0.0;
acct_id14 INTEGER := 0;
acct_id15 INT := 0;
acct_id16 INTERVAL YEAR TO MONTH ;
acct_id17 INTERVAL YEAR(2) TO MONTH ;
acct_id18 INTERVAL DAY TO SECOND ;
acct_id19 INTERVAL DAY(1) TO SECOND(6) ;
acct_id20 LONG := 'Sample text';
acct_id21 LONG RAW := utl_raw.cast_to_raw('Sample text');
acct_id22 NCHAR := 'A';
acct_id23 NCHAR VARYING(2) := 'AA';
acct_id24 NCLOB := EMPTY_CLOB();
acct_id25 NUMBER := 9999;
acct_id26 NUMERIC := 0;
acct_id27 NVARCHAR2(2000) := 'Initial value';
acct_id28 RAW(2000) := hextoraw('0102030405060708');
acct_id29 REAL := 0.0;
acct_id31 SMALLINT := 0;
acct_id32 TIMESTAMP := TO_TIMESTAMP('2024-03-19 12:34:56', 'YYYY-MM-DD HH24:MI:SS');
acct_id33 TIMESTAMP WITH TIME ZONE ;
acct_id34 TIMESTAMP(3) WITH TIME ZONE ;
acct_id35 UROWID := 'AAAACPAABAAAAShAAA';
acct_id36 VARCHAR(51) := 'NULL';
acct_id37 VARCHAR2(151) := 'NULL';
acct_id38 XMLTYPE ;
BEGIN
acct_id25 := 9999;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
acct_id1 binary_float := 0.0;
acct_id2 binary_double := 0.0;
acct_id3 rowid := '(0,1)';
acct_id4 blob := EMPTY_BLOB();
acct_id5 char := 'A';
acct_id6 character := 'A';
acct_id7 clob := EMPTY_CLOB();
acct_id8 date := TO_DATE('2024-03-19', 'YYYY-MM-DD');
acct_id9 decimal(38,0) := 0;
acct_id10 dec(38,0) := 0;
acct_id12 double precision := 0.0;
acct_id13 float := 0.0;
acct_id14 bigint := 0;
acct_id15 bigint := 0;
acct_id16 interval year to month;
acct_id17 interval year to month;
acct_id18 interval day to second;
acct_id19 interval day to second(6);
acct_id20 long := 'Sample text';
acct_id21 bytea := utl_raw.cast_to_raw('Sample text');
acct_id22 nchar := 'A';
acct_id23 nchar varying(2) := 'AA';
acct_id24 clob := EMPTY_CLOB();
acct_id25 number := 9999;
acct_id26 numeric(38,0) := 0;
acct_id27 nvarchar2(2000) := 'Initial value';
acct_id28 raw(2000) := hextoraw('0102030405060708');
acct_id29 real := 0.0;
acct_id31 bigint := 0;
acct_id32 timestamp := TO_TIMESTAMP('2024-03-19 12:34:56', 'YYYY-MM-DD HH24:MI:SS');
acct_id33 timestamp with time zone;
acct_id34 timestamp(3) with time zone;
acct_id35 varchar(4000) := 'AAAACPAABAAAAShAAA';
acct_id36 varchar(51) := 'NULL';
acct_id37 varchar2(151) := 'NULL';
acct_id38 xmltype;
BEGIN
acct_id25 := 9999;
END;
布尔型
语法
variable_name BOOLEAN
使用案例
-- 转换前Oracle SQL:
DECLARE
acct_id1 BOOLEAN;
acct_id2 BOOLEAN := FALSE;
BEGIN
acct_id1 := true;
acct_id2 := true;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
acct_id1 boolean;
acct_id2 boolean := FALSE;
BEGIN
acct_id1 := TRUE;
acct_id2 := TRUE;
END;
RECOED
语法
TYPE record_type IS RECORD ( field_definition [, field_definition]... ) ;
field_definition暂时只支持field datatype
使用案例
-- 转换前Oracle SQL:
DECLARE
type recordType is record(
age integer,
tal integer);
record1 recordType;
BEGIN
record1.age:=1;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
TYPE recordType IS RECORD(
age bigint,
tal bigint
);
record1 recordType;
BEGIN
record1.age := 1;
END;
PLS_INTEGER
语法
variable_name PLS_INTEGER
使用案例
-- 转换前Oracle SQL:
DECLARE
acct_id40 pls_integer:=-123;
BEGIN
acct_id40 := 9999;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
acct_id40 pls_integer := -123;
BEGIN
acct_id40 := 9999;
END;
%TYPE
语法
variable_name table_or_view_name.column_name%TYPE;
使用案例
-- 转换前Oracle SQL:
CREATE TABLE te(a int);
DECLARE
id te.a%TYPE;
BEGIN
id := 9999;
END;
-- 转换后LightDB-Oracle SQL:
CREATE TABLE te (a bigint);
DECLARE
id te.a%TYPE;
BEGIN
id := 9999;
END;
联合数组
语法
TYPE typeName IS TABLE OF datetype INDEX BY { PLS_INTEGER | BINARY_INTEGER| VARCHAR2(size)};
暂时只支持定义
使用案例
-- 转换前Oracle SQL:
DECLARE
TYPE typeName1 IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
TYPE typeName2 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
TYPE typeName3 IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);
v1 typeName1;
v2 typeName2;
v3 typeName3;
v4 int;
BEGIN
v4:=999;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
TYPE typeName1 IS TABLE OF varchar2(10) INDEX BY pls_integer;
TYPE typeName2 IS TABLE OF varchar2(10) INDEX BY binary_integer;
TYPE typeName3 IS TABLE OF varchar2(10) INDEX BY varchar2(10);
v1 typeName1;
v2 typeName2;
v3 typeName3;
v4 bigint;
BEGIN
v4 := 999;
END;
嵌套表
语法
TYPE typeName IS TABLE OF datetype [NOT NULL];
暂时只支持定义
使用案例
-- 转换前Oracle SQL:
DECLARE
TYPE typeName IS TABLE OF VARCHAR2(10);
v1 typeName;
v2 int;
BEGIN
v2:=999;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
TYPE typeName IS TABLE OF varchar2(10);
v1 typeName;
v2 bigint;
BEGIN
v2 := 999;
END;
可变数组
语法
TYPE typeName IS VARRAY(size) OF datetype [NOT NULL];
暂时只支持定义
使用案例
-- 转换前Oracle SQL:
DECLARE
TYPE typeName IS VARRAY(2) OF int;
v1 typeName;
v2 int;
BEGIN
v2:=999;
END;
-- 转换后LightDB-Oracle SQL:
DECLARE
TYPE typeName IS VARRAY(2) OF bigint;
v1 typeName;
v2 bigint;
BEGIN
v2 := 999;
END;
自定义子类型
暂不支持
游标指针
暂不支持
Oracle到其余信创数据库的转换用法请参考:统一SQL参考手册