J.5. 版本发布 13.8-23.2

J.5.1. Oracle 兼容
J.5.2. pl/sql 增强
J.5.3. MySQL 兼容
J.5.4. lightdb 新特性
J.5.5. ltjdbc 增强

版本发布日期:. 2023年6月30日

J.5.1. Oracle 兼容

  • CHAR 类型支持指定字节或字符长度。当使用 CHAR 类型定义表中的列时,可以指定列值的长度。请参见 字符类型

示例:

create table t (id char (1 char));
create table t (id char (1 byte));
  • 层级查询增强。connect by 用于处理层次结构数据,已经支持了通过 LEVEL 关键字显示分层查询中的层级数,SYS_CONNECT_BY_PATH 显示分层查询中的层级结构。当前版本对层级查询增加了新的功能,CONNECT_BY_ROOT 显示当前行的根节点,connnect by level < n,显示小于 n 层级的所有递归结果。此外,层级查询中支持了子查询,关联查询,表达式计算等。请参见 CONNECT BY 子句

示例:

SELECT employee, CONNECT_BY_ROOT employee_id as "Manager", SYS_CONNECT_BY_PATH(employee, '/') "Path"
FROM example
START WITH manager_id is not null
CONNECT BY PRIOR employee_id = manager_id
ORDER BY employee_id, manager_id;
 employee | Manager |   Path    
----------+---------+-----------
 Josh     |       2 | /Josh
 Ali      |       3 | /Ali
 Ali      |       2 | /Josh/Ali
 Kyle     |       5 | /Kyle
(4 rows)
  • ALTER TABLE 增强。支持 ALTER TABLE 删除同一列的索引和约束。请参见 ALTER TABLE

示例:

ALTER TABLE my_table
DROP CONSTRAINT my_constraint,
DROP INDEX my_index;
  • 支持外连接 + 号表示 LEFT JOINRIGHT JOIN 。请参见 oracle (+)

示例:

SELECT *
FROM table1, table2
WHERE table1.id = table2.id (+);
  • 使用 USING INDEX 子句来指定使用索引来支持约束,在创建约束的时候同时为约束指定一个索引。请参见 ALTER TABLE

示例:

ALTER TABLE employees
ADD CONSTRAINT emp_id_pk
PRIMARY KEY (id)
USING INDEX;
  • 支持 DELETE 子句中,FROM 可选。请参见 DELETE

示例:

DELETE table_name WHERE col = 1;
  • 支持 SYS.COL 系统视图,它显示了所有表的列信息,包括列名、数据类型、长度、精度、是否为空、默认值等信息。请参见 orafce

示例:

create table test_col_view(key0 varchar(100), key1 number not null, key2 number(38,0));

select * from col where tname= 'TEST_COL_VIEW' order by colno;
     tname     | colno | cname |  coltype  | width | scale | precision |  nulls   | defaultval | character_set_name 
---------------+-------+-------+-----------+-------+-------+-----------+----------+------------+--------------------
 TEST_COL_VIEW |     1 | KEY0  | VARCHAR   | 100   |       |           | NULL     |            | 
 TEST_COL_VIEW |     2 | KEY1  | NUMBER    |       |       |           | NOT NULL |            | 
 TEST_COL_VIEW |     3 | KEY2  | NUMBER    | 38,0  |     0 |        38 | NULL     |            | 
(3 rows)
  • 支持 INSERT ALL 语法,用于一次性插入多条记录到一个或多个表中。请参见 INSERT

示例:

INSERT ALL
    INTO table_name (column1, column2, column3) VALUES (value1, value2, value3)
    INTO table_name (column1, column2, column3) VALUES (value1, value2, value3)
SELECT 1 FROM DUAL;
  • INSERT INTO 语句支持使用别名来指定要插入数据的表。请参见 INSERT

示例:

INSERT INTO employees e (employee_id, first_name, last_name)
VALUES (1001, 'John', 'Doe');
  • merge into 支持分布式。请参见 MERGE INTO

示例:

MERGE INTO target t
USING source s
ON t.tid = s.sid
WHEN MATCHED THEN
    update set balance = t.balance + s.delta
WHEN NOT MATCHED THEN
    INSERT VALUES(s.sid, s.delta);
  • 支持 NUMBERBOOLEAN 类型隐式转换。请参见 orafce

示例:

select 0::NUMBER = TRUE;
 ?column? 
----------
 f
(1 row)

select 1::NUMBER = TRUE;
 ?column? 
----------
 t
(1 row)
  • 增强分区表功能。分区命名兼容 Oracle,并且支持对子分区进行操作。请参见 ALTER TABLE

示例:

alter table lt_truncate_t_r truncate partition p1;
alter table lt_truncate_t_r add partition p2 values less than(30);
alter table lt_truncate_t_r truncate partition p2;
alter table lt_truncate_t_r drop partition p2;
  • 创建表时支持 STORAGEcompress / nocompresslogging / nologging 关键字,仅是语法糖功能,兼容 Oracle 语法,没有实现对应的功能。请参见 CREATE TABLE

示例:

create table comp_log1(id int) compress;
create table comp_log3(id int) logging;
create table comp_log5(id int) compress logging;
create table comp_log13(id int) storage(abcd);
  • 支持 prompt 命令,用于向用户显示文本消息。请参见 prompt 命令

示例:

PROMPT Creating table...

CREATE TABLE test_table (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(50)
);

PROMPT Inserting data...

BEGIN;
INSERT INTO test_table (id, name) VALUES (1, 'John Doe');
INSERT INTO test_table (id, name) VALUES (2, 'Jane Smith');
COMMIT;

PROMPT Querying data...

SELECT * FROM test_table;
DROP table test_table;
PROMPT Done.
  • 支持 ALTER INDEX idx_name REBUILD 语法,用于重建指定索引。该命令可以帮助我们优化索引性能,修复索引损坏或减少索引碎片。请参见 ALTER INDEX

示例:

CREATE TABLE tt(a int);
CREATE INDEX idx_tt_a on tt(a);
ALTER INDEX idx_tt_a REBUILD;
  • sequence 语句支持 order / noorder / nocycle / nocache 关键字。注意,这个功能仅仅是语法糖,没有实现实际功能。请参见 CREATE SEQUENCE

示例:

create sequence lt_seq_test1 order start 100;
create sequence lt_seq_test3 start 100 nocycle;
create sequence lt_seq_test5 start 100 ORDER nocache NOCYCLE;
alter sequence lt_seq_test1 nocache nocycle noorder;
  • 支持 create force view。注意,这个功能仅仅是语法糖,没有实现实际功能。请参见 CREATE VIEW

示例:

CREATE FORCE VIEW force_view as SELECT 1 as ltapk, 2 as ltaut;

示例:

EXEC SQL EXECUTE     
 begin
     begin
        update/*3631412*/ t1 set c = 'C' where id = :v_error_no;
         exception
            when others then
                :iReturnCode = 456;
                rollback;
            when DUP_VAL_ON_INDEX then
                null;
        if SQL%NOTFOUND then
            null;
        end if;
        
     end;
 end;
END-EXEC;

J.5.2. pl/sql 增强

  • pl/sql 支持 sqlcode。用户可以像在 Oracle 中那样创建返回“sqlcode”值的函数。请参见 支持 SQLCODE

例如,当出现零除法错误时,以下代码将输出 SQL 错误代码:

create or replace function zero_divide_f return int as
    a int := 10;
    b int := 0;
    code int;
begin
    a := a / b;
    exception 
      when zero_divide then
        code := sqlcode;
        dbms_output.put_line('this is a normal error ' || code || ' ' || sqlcode || ' ' || sqlcode_to_sqlstate(code) || ' ' ||sqlcode_to_sqlstate(sqlcode));
    return 1;
end;
/
  • pl/sql 中支持使用 with 子句。用户可以使用 with 子句在 SQL 语句中定义临时结果集。

示例:

declare
    v_count varchar(100);
begin
    with tmp as (select * from company where id=2) select * into v_count from tmp;
    DBMS_OUTPUT.PUT_LINE(v_count);
end;
/
  • pl/sql 支持 PRAGMA AUTONOMOUS_TRANSACTION 语法解析。注意,这里仅是语法糖功能,兼容 Oracle 语法,没有实现对应的功能。请参见 AUTONOMOUS TRANSACTION Pragma

示例:

CREATE OR REPLACE PROCEDURE test_pragma_procedure()
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    NULL;
END;
/
  • pl/sql 支持游标变量的大小写不敏感,这意味着在打开游标时指定的游标变量的大小写与声明时的大小写不匹配也不会出现语法错误。请参见 Cursors

示例:

DECLARE
  CURSOR D_tmp(zxc NUMBER,bnm NUMBER,ff smallint default 1234) IS
        SELECT ff || a as feiwu FROM tt;
  ddd D_tMp%ROWTYPE;
  BEGIN
    OPEN D_tmP(5,6);
    FETCH d_tmp INTO ddd;
    DBMS_OUTPUT.PUT_LINE(ddd.feiwu);
    CLOSE D_tmP;
end;
/
  • pl/sql 支持 %TYPE 引用包中变量的类型。请参见 声明

示例:

create table t_binjiang(a int, b int);
-- define package
create or replace package pkgtype is
  v_a int := 0;
  v_b int := 0;
end;
/

-- anonymous block references variables in the package
declare
    a pkgtype.v_a%type := 1;
    b pkgtype.v_b%type := 1;
begin
    insert into t_binjiang values(a, b);
end;
/
  • pl/sql 支持 goto 语句。用户可以使用 goto 语句跳转到块中的特定标签。请参见 GOTO语句

示例:

DO $$
BEGIN
    RAISE NOTICE 'out block 1';
    goto testlabel;
    RAISE NOTICE 'out block 2';
    <<testlabel>>
    BEGIN
        RAISE NOTICE 'in block 1';
        goto testlabel2;
        RAISE NOTICE 'in block 2';
    END;

    RAISE NOTICE 'out block 3';

    <<testlabel2>>
    RAISE NOTICE 'out block 4';

END$$;
NOTICE:  out block 1
NOTICE:  in block 1
NOTICE:  out block 4
  • pl/sql 支持分布式场景下调用包函数。请参见 Packages

示例:

create or replace package typkg
as
    type nt is table of tab1%rowtype;
    res nt;
    function myfunc(v int) return nt;
end;
/

create or replace package body typkg
as
    function myfunc(v int) return nt
    is
    begin
    res(1) := ROW(1,1);
    res(2) := ROW(2,2);
    res(3) := ROW(3,3);
    return res;
    end;
end;
/

select * from table(typkg.myfunc(1)) t0 
where t0.a in (select a from tab1) order by t0.a;

J.5.3. MySQL 兼容

  • 支持 DROP INDEX 语法 DROP INDEX [IF EXISTS] index_name ON table_name; 请参见 DROP INDEX

示例:

create table t1(id int);
create unique index idx_t1_id on t1(id);
drop index idx_t1_id on t1;
  • 查询列时大小写不敏感、显示列大小写敏感。在 mysql 模式下, guc 参数 lightdb_sql_mode 设置 uppercase_identifier。请参见 SELECT

示例:

create table test_case_1(identifier1 varchar(10));

select * from test_case_1;
identifier1
-------------
(0 rows)

select IDentifier1 from test_case_1;
IDentifier1
-------------
(0 rows)

select identifier1 as IDentifier1 from test_case_1;
IDentifier1
-------------
(0 rows)
  • 支持 INSERT IGNORE INTO 语法。INSERT IGNORE INTO 语句用于向表中插入数据,如果插入的数据违反了唯一性约束(如主键或唯一索引),则忽略这些数据,不会抛出错误或警告。请参见 INSERT

示例:

INSERT IGNORE INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • 支持通过 COMMENT 关键字可以用于向数据库对象(如表、列等)添加注释信息。请参见 CREATE TABLE

示例:

create table t1 (
    id int primary comment 'this is id of t1' not null,
    name varchar(10) not null comment 'this is name of t1'
) comment = 'this is t1';
  • 支持 json 相关函数。请参见 MySQL兼容函数

    JSON_ARRAY:创建一个 JSON 数组。

    JSON_OBJECT:创建一个 JSON 对象。

    JSON_EXTRACT:从 JSON 数据中提取值。

    JSON_CONTAINS:检查 JSON 数据是否包含指定的值。

    JSON_CONTAINS_PATH:检查 JSON 字符串中是否存在指定路径。

    JSON_PRETTY:用于格式化 JSON 字符串的函数。它将一个未格式化的 JSON 字符串作为输入,并将其格式化为易于阅读的形式。

  • 支持 sysdate() 函数,用于取当前的执行时间。请参见 当前日期/时间

示例:

select sysdate();
       sysdate
---------------------
 2023-05-09 13:21:13
(1 row)
  • 修复问题 mysql 模式下 dual 虚拟表,普通用户没权限的问题。请参见 MySQL兼容函数

示例:

create user mytestuser with password 'mytestuser';
\c - mytestuser
select 2 from dual;
 ?column? 
----------
        2
(1 row)

J.5.4. lightdb 新特性

  • PWR 准确测量实时查询各类 IO 事件,IPC 事件,竞态等时间开销,并优化了 PWR 性能报告的统计。请参见 lt_profile

  • lt_hint_plan 对不支持 hint 的场景进行优化,忽视未实现的 hint。请参见 lt_hint_plan

  • 支持增量检查点,减少触发检查点时对数据库系统的性能影响。请参见 CHECKPOINT

  • 支持在 pgadmin/navicat 中调试 PL/pgsql 存储过程。请参见 pldebugger

  • PL/pgsql 支持 execute immediate 语法。注意,这里仅是语法糖功能,没有实现对应的功能。请参见 执行动态命令

示例:

CREATE OR REPLACE FUNCTION get_employee_name_func(p_employee_id INTEGER)
RETURNS VARCHAR AS $$
DECLARE
    sql_query TEXT;
    emp_name  VARCHAR;
BEGIN
    sql_query := 'SELECT first_name FROM test_employees WHERE employee_id = $1';
    EXECUTE IMMEDIATE sql_query INTO emp_name USING p_employee_id;

    RAISE NOTICE 'Employee name is: %', emp_name;
    RETURN emp_name;
END;
$$ LANGUAGE plpgsql;
  • 发布客户端包,解压配置环境变量后,用户可以直接使用相关的工具。包括如下工具。 lt_distributed_probackup.py

    lt_distributed_dump.py

    lt_distributed_restore.py

    ltuldr

    lt_basebackup

    lt_dump

    lt_dumpall

    lt_isready

    lt_probackup

    lt_restore

    lt_verifybackup

    ltsql

J.5.5. ltjdbc 增强

  • java.sql.ResultSet#getBlob(java.lang.String) 支持读取字节数组格式的 blob 值。请参见 LightDB JDBC

  • ltjdbc 支持直接执行 create procedurecreate function 等语法创建存储过程和函数。请参见 LightDB JDBC

  • java.sql.ResultSet#getObject(int, java.lang.Class<T>) 支持将 date 列类型转换为 LocalDateTime。请参见 LightDB JDBC