统一SQL 支持 PL/SQL 数据类型 定义

目录

统一SQL介绍

PL数据类型

描述

分类

统一SQL支持

SQL 数据类型

使用案例

布尔型

语法

使用案例

RECOED

语法

使用案例

PLS_INTEGER

语法

使用案例

%TYPE

语法

使用案例

联合数组

语法

使用案例

嵌套表

语法

使用案例

可变数组

语法

使用案例

自定义子类型

游标指针


统一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参考手册

  • 38
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值