• LightDB版本发布 13.8-23.3


    Oracle 兼容

    • CREATE SEQUENCE 命令创建序列时支持声明 NOMAXVALUE,兼容Oracle创建序列时 NOMAXVALUE 定义。
      示例:
    create sequence s1 nomaxvalue;
    \d+ s1
                                Sequence "public.s1"
    Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache
    --------+-------+---------+---------------------+-----------+---------+-------
    bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • CREATE SEQUENCE 命令创建序列时支持声明 MAXVALUE,兼容Oracle创建序列时 MAXVALUE 定义。
      示例
    create sequence s2 maxvalue 100000;
    \d+ s2
    Sequence "public.s2"
    Type  | Start | Minimum | Maximum | Increment | Cycles? | Cache
    --------+-------+---------+---------+-----------+---------+-------
    bigint |     1 |       1 |  100000 |         1 | no      |     1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • CREATE TABLE 命令创建分区时支持 nocompress/compress 关键字。
      示例
    CREATE TABLE lt_oracle_partition_list1
    (
        a int,
        b float,
        c date,
        d timestamp,
        e varchar2(20)
    ) PARTITION BY LIST(e)
    (
        PARTITION p1 VALUES ('0001', '0002', '0003', '0004', '0005') compress,
        PARTITION p2 VALUES ('0006', '0007', '0008', '0009') nocompress,
        PARTITION p3 VALUES ('0010', '0011')
    );
    \d+ lt_oracle_partition_list1
    
    Partitioned table "public.lt_oracle_partition_list1"
    Column |            Type             | Collation | Nullable | Default | Storage  | Stats target | Description
    --------+-----------------------------+-----------+----------+---------+----------+--------------+-------------
    a      | integer                     |           |          |         | plain    |              |
    b      | double precision            |           |          |         | plain    |              |
    c      | oracle.date                 |           |          |         | plain    |              |
    d      | timestamp without time zone |           |          |         | plain    |              |
    e      | varchar2(20)                |           |          |         | extended |              |
    Partition key: LIST (e)
    Partitions: "lt_oracle_partition_list1$p$p1" FOR VALUES IN ('0001', '0002', '0003', '0004', '0005'),
    "lt_oracle_partition_list1$p$p2" FOR VALUES IN ('0006', '0007', '0008', '0009'),
    "lt_oracle_partition_list1$p$p3" FOR VALUES IN ('0010', '0011')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • CREATE TABLE 命令创建分区时支持 list+hash 复合分区。
      示例
    create table lt_lh_partition(a int, b int)
    partition by list(a)
    subpartition by hash(b)
    (
        partition l_1 values(1),
        partition l_2 values(2)
    );
    
    \d+ lt_lh_partition
    
    Partitioned table "public.lt_lh_partition"
    Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
    --------+---------+-----------+----------+---------+---------+--------------+-------------
    a      | integer |           |          |         | plain   |              |
    b      | integer |           |          |         | plain   |              |
    Partition key: LIST (a)
    Partitions: "lt_lh_partition$p$l_1" FOR VALUES IN (1), PARTITIONED,
    "lt_lh_partition$p$l_2" FOR VALUES IN (2), PARTITIONED
    
    \d+ lt_lh_partition$p$l_1
    
    Partitioned table "public.lt_lh_partition$p$l_1"
    Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description
    --------+---------+-----------+----------+---------+---------+--------------+-------------
    a      | integer |           |          |         | plain   |              |
    b      | integer |           |          |         | plain   |              |
    Partition of: lt_lh_partition FOR VALUES IN (1)
    Partition constraint: ((a IS NOT NULL) AND (a = 1))
    Partition key: HASH (b)
    Partitions: "lt_lh_partition$p$l_1_p0" FOR VALUES WITH (modulus 1, remainder 0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • CREATE TABLE 命令支持了一些选项,如compress/nocompress,logging/nologging。 这些选项在历史版本使用上有顺序限制,该版本允许这些选项可以任意顺序出现。
    • 禁止 CREATE TABLE 创建的表名和 CREATE PACKAGE 创建的包名重复。
    • ALTER TABLE 命令支持一次添加多列时可以把列定义放在要括号里。
      示例
    CREATE TABLE foo(a int);
    ALTER TABLE foo ADD COLUMN a1 int;
    ALTER TABLE foo ADD COLUMN a2 int default 3;
    ALTER TABLE foo ADD COLUMN b1 int, ADD COLUMN b2 int;
    ALTER TABLE foo ADD (c1 int);
    ALTER TABLE foo ADD (c2 int default 3);
    ALTER TABLE foo ADD (e1 int), ADD e2 int, ADD COLUMN e3 int, ADD (e4 int, e5 int);
    begin
        execute immediate 'alter table foo add(d int)';
    end;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • ALTER TABLE 命令支持 TRUNCATE PARTITION partition_name 时指定 update indexes。
      示例
    create table part_update_indexes_range(id int primary key)
    PARTITION by range(id)(
        partition p1 VALUES LESS THAN (202000) nocompress,
        partition p2 VALUES LESS THAN (202001) compress,
        partition p3 VALUES LESS THAN (202002)
    );
    
    ALTER  TABLE  part_update_indexes_range  TRUNCATE  PARTITION  p1 update indexes;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • DROP TABLE 命令支持通过 cascade constraints 级联删除该表所有的约束。
      示例
    CREATE TABLE student(id int, name varchar2(100));
    
    ALTER TABLE student ADD CONSTRAINT uk_student unique(id);
    
    \d student
    Table "public.student"
    Column |     Type      | Collation | Nullable | Default
    --------+---------------+-----------+----------+---------
    id     | integer       |           |          |
    name   | varchar2(100) |           |          |
    Indexes:
    "uk_student" UNIQUE CONSTRAINT, btree (id)
    
    DROP TABLE student cascade constraints;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 新增 CREATE TYPE name { AS | IS } OBJECT 语法,支持创建对象类型。
      示例
    select dbms_output.serveroutput(true);
    CREATE TYPE stock AS OBJECT (
        stock_no int,
        price    numeric(16,2),
        member procedure dis(prompt varchar)
    );
    
    CREATE TYPE BODY stock AS
    member procedure dis(prompt varchar) is
        begin
            dbms_output.put_line(prompt || ':' || self.stock_no || '-' || self.price);
        end;
    END;
    /
    
    DECLARE
        s stock := stock(600570, 180.00);
    BEGIN
        s.dis('current');
    END;
    /
    
    current:600570-180.00
    DO
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 新增 TO_CLOB 函数,通过该函数我们将能够将数据从文本字符串类型转换为 CLOB 类型。
      示例
    CREATE TABLE testorafce_to_clob (
        col_char CHAR(10),
        col_varchar2 VARCHAR2(20),
        col_varchar VARCHAR(20),
        col_nchar NCHAR(10),
        col_nvarchar2 NVARCHAR2(20),
        col_smallint smallint,
        col_integer integer,
        col_bigint bigint,
        col_decimal decimal,
        col_numeric numeric,
        col_real real,
        col_double double precision,
        col_clob CLOB,
        col_raw raw(10)
    );
    
    INSERT INTO testorafce_to_clob (col_char, col_varchar2, col_varchar, col_nchar, col_nvarchar2, col_smallint, col_integer, col_bigint, col_decimal, col_numeric, col_real, col_double, col_clob, col_raw)
    VALUES ('ABC1', 'Hello', 'world', 'hello', 'world', 1, 2, 3, 4, 5, 6, 7, 'This is a CLOB', 'AB');
    
    INSERT INTO testorafce_to_clob (col_char, col_varchar2, col_varchar, col_nchar, col_nvarchar2, col_smallint, col_integer, col_bigint, col_decimal, col_numeric, col_real, col_double, col_clob, col_raw)
    VALUES ('ABC2', 'Hello', 'world', 'hello', 'world', 1, 2, 3, 4, 5, 6, 7, 'This is a CLOB', '1');
    
    INSERT INTO testorafce_to_clob (col_char, col_varchar2, col_varchar, col_nchar, col_nvarchar2, col_smallint, col_integer, col_bigint, col_decimal, col_numeric, col_real, col_double, col_clob, col_raw)
    VALUES ('ABC3', 'Hello', 'world', 'hello', 'world', 1, 2, 3, 4, 5, 6, 7, to_clob('This is a CLOB'), '1AB456789');
    
    SELECT  to_clob(col_char) AS clob_char,
            to_clob(col_varchar2) AS clob_varchar2,
            to_clob(col_varchar) AS col_varchar,
            to_clob(col_nchar) AS clob_nchar,
            to_clob(col_nvarchar2) AS clob_nvarchar2,
            to_clob(col_clob) AS clob_clob,
            to_clob(col_smallint) AS col_smallint,
            to_clob(col_integer) AS col_integer,
            to_clob(col_bigint) AS col_bigint,
            to_clob(col_decimal) AS col_decimal,
            to_clob(col_numeric) AS col_numeric,
            to_clob(col_real) AS col_real,
            to_clob(col_double) AS col_double,
            to_clob(col_raw) AS clob_nclob
    FROM testorafce_to_clob order by col_char asc;
    
    clob_char  | clob_varchar2 | col_varchar | clob_nchar | clob_nvarchar2 |   clob_clob    | col_smallint | col_integer | col_bigint | col_decimal | col_numeric | col_real | col_double | clob_nclob
    ------------+---------------+-------------+------------+----------------+----------------+--------------+-------------+------------+-------------+-------------+----------+------------+------------
    ABC1       | Hello         | world       | hello      | world          | This is a CLOB | 1            | 2           | 3          | 4           | 5           | 6        | 7          | AB
    ABC2       | Hello         | world       | hello      | world          | This is a CLOB | 1            | 2           | 3          | 4           | 5           | 6        | 7          | 01
    ABC3       | Hello         | world       | hello      | world          | This is a CLOB | 1            | 2           | 3          | 4           | 5           | 6        | 7          | 01AB456789
    (3 rows)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 新增 XMLType 对象类型,支持 XMLType.getClobVal 方法。
      示例
    CREATE TABLE xml_table (id NUMBER, xml_column XMLType );
    
    INSERT INTO xml_table (id, xml_column) VALUES (1, XMLType('John'));
    
    DECLARE
        v_clob CLOB;
    BEGIN
        SELECT XMLType.getClobVal(xml_column) INTO v_clob FROM xml_table WHERE id = 1;
        DBMS_OUTPUT.PUT_LINE('CLOB value: ' || v_clob);
    END;
    /
    CLOB value: John
    DO
    
    DECLARE
        xml_data XMLType;
        clob_data CLOB;
    BEGIN
        xml_data := XMLType('John Doe');
        clob_data := xml_data.getClobVal();
        DBMS_OUTPUT.PUT_LINE(clob_data);
    END;
    /
    John Doe
    DO
    
    SELECT XMLType.getClobVal(xml_column) from xml_table;
    getclobval
    --------------------------------
    John
    (1 row)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 新增 lightdb_oracle_sql_mode GUC参数,用于支持Oracle模式下列名显示默认转为大写。
      示例
    create table std(no int, name varchar2(32));
    
    insert into std values(1, 'zhangsan');
    
    select * from std;
    no |   name
    ----+----------
    1 | zhangsan
    (1 row)
    
    set lightdb_oracle_sql_mode to 'true';
    
    select * from std;
    NO |   NAME
    ----+----------
    1 | zhangsan
    (1 row)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • ltsql 命令新增支持Oracle SQL*Plus的 RENAME old_name TO new_name 命令,可以对表名进行重命名。
    • ltsql 命令新增支持Oracle SQL*Plus SPOOL命令。
    • Oracle模式下支持 binary_float 和 binary_double,都遵循IEEE754标准。
    • Oracle模式下支持 ‘\0’ 可以正常插入 char(n) 类型字符串中。
      示例
    create database oradb with lightdb_ascii_zero_store_value 20 lightdb_syntax_compatible_type 'oracle';
    \c oradb
    
    create table t00(a char(1), b char(2));
    
    insert into t00(a,b) values(E'\0',E'\0');
    
    insert into t00(a,b) values(chr(0),chr(0));
    
    select * from t00;
    
    a   |   b
    ------+-------
    \x14 | \x14
    \x14 | \x14
    (2 rows)
    
    '\0' 转为了lightdb_ascii_zero_store_value值进行存储
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • Oracle模式下日期作差结果兼容Oracle,返回numeric类型。
    • col视图兼容Oracle,width字段与Oracle保持兼容。
    • greatest/least兼容Oracle。
    1. 主要实现了以下兼容特性:
    2. 只要有一个参数为 NULL 结果就返回 NULL。
    3. 把第一个参数作为被比较的类型,其余参数类型强制转换为第一个参数的类型。
    4. 当遇到一个参数为 NULL 时,不再解析其余参数。
    • orafce 中的所有Oracle函数改成默认safe的,默认支持启用并行处理。

    plorasql 增强

    • PL/oraSQL 函数支持事务提交回滚。
    • PL/oraSQL 函数支持 inout 参数。
    • PL/oraSQL 函数支持DML语句。
    • PL/oraSQL 存储过程中支持使用CREATE DOMAIN创建游标类型的变量。
      示例
    SELECT dbms_output.serveroutput(true);
    CREATE TABLE employees(employee_id int, first_name varchar2(100), last_name varchar2(100));
    INSERT INTO employees values(1500, 'first15', 'last15');
    CREATE DOMAIN mycursor AS refcursor;
    CREATE OR REPLACE PROCEDURE get_employee_name AS
        employee_cursor mycursor;
        v_employee_name VARCHAR2(50);
    BEGIN
        OPEN employee_cursor FOR SELECT first_name FROM employees WHERE employee_id = 1500;
        LOOP
            FETCH employee_cursor INTO v_employee_name;
            EXIT WHEN employee_cursor%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_employee_name);
        END LOOP;
        CLOSE employee_cursor;
    END;
    /
    call get_employee_name ();
    Employee Name: first15
    CALL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    MySQL 兼容

    • 新增 INSERT IGNORE 功能。
      示例
    create database test_mysql with lightdb_syntax_compatible_type  mysql;
    \c test_mysql
    
    create table t(a int primary key, b int);
    insert ignore into t(a,b) values(1,1),(1,1),(2,2);
    select * from t;
    a | b
    ---+---
    1 | 1
    2 | 2
    (2 rows)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 新增 INSERT 支持对自增列插入NULL语法,每次插入都会根据序列进行自增。
    • 新增 JSON 函数集合。 请参见 myfce JSON函数 。
      JSON_ARRAY
      JSON_OBJECT
      JSON_EXTRACT
      JSON_CONTAINS
      JSON_CONTAINS_PATH
      JSON_PRETTY
      JSON_REMOVE
      JSON_INSERT
      JSON_REPLACE
      JSON_SET
    • 新增 lightdb_mysql_lower_case_table_names 参数。 使用 create database 语句创建数据库时,可以指定参数来设置是否开启大小写敏感功能。
    • varchar 类型兼容 boolean 类型数据。

    lightdb 新特性

    • 新增 lt_upgrade_check 升级前检查工具,用于提前检查升级不兼容及异常项,尽量避免在升级过程中出现失败。
    • 新增 ECPG 代码中支持使用 ‘–’ 和 ‘//’ 注释。
    • 新增服务端、客户端支持GBK,GB18030-2022,已通过人行国标认证。
    • 新增 lt_createdb 行为在CN分布式下默认传播到DN节点。
    • 新增 lightdb_cursor_after_commit GUC参数来控制fetch行为。 lightdb_cursor_after_commit 为 off 时不能在一个事务提交之后再去 fetch操作这个结果集; 为 on 时一个事务提交之后,这个游标还可以继续使用。
    • 新增 distinct connect by level 语法支持。
    • 新增 connect_by_isleaf 语法支持。
    • ltsql 增强支持提示当前服务数据库的兼容模式。
    • lt_upgrade 增强支持跨版本升级。
    • ltloader 增强性能,达到Oracle sqlldr的80%以上。
    • lt_dump 增强。
    1. –lt-exclude-lightdb-objects 支持过滤内置用户 lightdb 和 lt_probackup。
    2. –lt-exclude-lightdb-objects 支持导出 ACCESS METHOD。
    3. lt_dump 和 lt_dumpall 增加 --lt-target-version选项,用于指定导出的内容所适用的目标版本。
    4. 导出默认的创建模版支持为 template1。
    5. create database 语句支持 lightdb_syntax_compatible_type 选项逻辑。
    • mysql_fdw 增强支持查询超过64K的字段。

    ltjdbc 增强

    • ltjdbc 支持 numeric 使用 Short 类型。
    • ltjdbc 支持setNull传入 Types.CLOB 和 Types.BLOB 。
    • ltjdbc 支持整型数值使用 string 类型。
    • ltjdbc 支持函数 xmlparse。
  • 相关阅读:
    【JavaSE】类和对象 【this引用和构造方法】(二)
    Java NIO 关键概念之 Buffer
    【C语言】插入排序详解
    分析Python7个爬虫小案例(附源码)
    基于MSER的高速公路交通标志提取matlab仿真
    【脉冲通信】用于空间应用的飞秒脉冲通信的符号误码率模型研究(Matlab代码实现)
    Go语言基础 基本数据类型使用
    postman查询数据库-Xmysql
    施展世界:GPT时代需要的教育,是学会如何提出好问题
    免杀对抗-内存加载-shellcode转换-UUID+MAC+IPV4
  • 原文地址:https://blog.csdn.net/z465759695/article/details/133671152