版本发布日期:. 2023年6月30日
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 JOIN 和
RIGHT 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);
支持 NUMBER 和 BOOLEAN
类型隐式转换。请参见 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;
创建表时支持
STORAGE,compress /
nocompress 和 logging /
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;
支持在 ecpg(Oracle Pro*c兼容)
中使用绑定参数的匿名执行块。请参见
执行一个带输入输出参数的
Do Statement。
示例:
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;
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;
支持 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';
示例:
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)
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
java.sql.ResultSet#getBlob(java.lang.String)
支持读取字节数组格式的 blob 值。请参见
LightDB JDBC 。
ltjdbc 支持直接执行
create procedure、create function
等语法创建存储过程和函数。请参见
LightDB JDBC 。
java.sql.ResultSet#getObject(int, java.lang.Class<T>)
支持将 date 列类型转换为 LocalDateTime。请参见
LightDB JDBC 。