lightdb 23.3已於2023年9月28日正式發佈。相關的特性如下:
E.1. 版本發佈 13.8-23.3
版本發佈日期:. 2023年9月30日
E.1.1. Oracle 兼容
-
CREATE SEQUENCE
命令創建序列時支持聲明 NOMAXVALUE,兼容Oracle創建序列時 NOMAXVALUE 定義。請參見 CREATE SEQUENCE。示例:
create sequence s1 nomaxvalue; \d+ s1 Sequence "public.s1" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache --------+-------+---------+---------------------+-----------+---------+------- bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
-
CREATE SEQUENCE
命令創建序列時支持聲明 MAXVALUE,兼容Oracle創建序列時 MAXVALUE 定義。請參見 CREATE SEQUENCE。示例:
create sequence s2 maxvalue 100000; \d+ s2 Sequence "public.s2" Type | Start | Minimum | Maximum | Increment | Cycles? | Cache --------+-------+---------+---------+-----------+---------+------- bigint | 1 | 1 | 100000 | 1 | no | 1
-
CREATE TABLE
命令創建分區時支持nocompress/compress
關鍵字。請參見 CREATE TABLE。示例:
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')
-
CREATE TABLE
命令創建分區時支持list+hash
複合分區。請參見 CREATE TABLE。示例:
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)
-
CREATE TABLE
命令支持了一些選項,如compress/nocompress,logging/nologging。 這些選項在歷史版本使用上有順序限制,該版本允許這些選項可以任意順序出現。請參見 CREATE TABLE。
-
禁止
CREATE TABLE
創建的表名和CREATE PACKAGE
創建的包名重複。
-
ALTER TABLE
命令支持一次添加多列時可以把列定義放在要括號裏。請參見 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; /
-
ALTER TABLE
命令支持TRUNCATE PARTITION
partition_name
時指定update indexes
。請參見 ALTER TABLE。示例:
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;
-
DROP TABLE
命令支持通過cascade constraints
級聯刪除該表所有的約束。請參見 DROP TABLE。示例:
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;
-
新增
CREATE TYPE
name
{ AS | IS } OBJECT
語法,支持創建對象類型。請參見 CREATE TYPE。示例:
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
-
新增
TO_CLOB
函數,通過該函數我們將能夠將數據從文本字符串類型轉換爲 CLOB 類型。請參見 orafce。示例:
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)
-
新增
XMLType
對象類型,支持XMLType.getClobVal
方法。請參見 orafce。示例:
CREATE TABLE xml_table (id NUMBER, xml_column XMLType ); INSERT INTO xml_table (id, xml_column) VALUES (1, XMLType('<root><name>John</name></root>')); 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: <root><name>John</name></root> DO DECLARE xml_data XMLType; clob_data CLOB; BEGIN xml_data := XMLType('<root><name>John Doe</name></root>'); clob_data := xml_data.getClobVal(); DBMS_OUTPUT.PUT_LINE(clob_data); END; / <root><name>John Doe</name></root> DO SELECT XMLType.getClobVal(xml_column) from xml_table; getclobval -------------------------------- <root><name>John</name></root> (1 row)
-
新增
lightdb_oracle_sql_mode
GUC參數,用於支持Oracle模式下列名顯示默認轉爲大寫。請參見 lightdb_oracle_sql_mode。示例:
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)
-
ltsql
命令新增支持Oracle SQL*Plus的RENAME
old_name
TO
new_name
命令,可以對錶名進行重命名。請參見 RENAME 命令。
-
ltsql
命令新增支持Oracle SQL*PlusSPOOL
命令。請參見 SPOOL 命令。
-
Oracle模式下支持
binary_float
和binary_double
,都遵循IEEE754標準。請參見 orafce。
-
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值進行存儲
-
Oracle模式下日期作差結果兼容Oracle,返回numeric類型。
-
col視圖兼容Oracle,width字段與Oracle保持兼容。
-
greatest/least兼容Oracle。請參見 GREATEST和LEAST。
主要實現了以下兼容特性:
只要有一個參數爲 NULL 結果就返回 NULL。
把第一個參數作爲被比較的類型,其餘參數類型強制轉換爲第一個參數的類型。
當遇到一個參數爲 NULL 時,不再解析其餘參數。
-
orafce
中的所有Oracle函數改成默認safe的,默認支持啓用並行處理。
E.1.2. plorasql 增強
-
PL/oraSQL 函數支持事務提交回滾。請參見 針對Oracle的增強功能。
-
PL/oraSQL 函數支持
inout
參數。請參見 聲明函數參數。 -
PL/oraSQL 函數支持DML語句。請參見 在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
E.1.3. MySQL 兼容
-
新增
INSERT
IGNORE
功能。 請參見 INSERT 。示例:
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)
-
新增
INSERT
支持對自增列插入NULL語法,每次插入都會根據序列進行自增。 請參見 INSERTNULL
說明 。 -
新增
JSON
函數集合。 請參見 myfceJSON函數
。 函數清單如下: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
語句創建數據庫時,可以指定參數來設置是否開啓大小寫敏感功能。 請參見 CREATE DATABASE 。 -
varchar
類型兼容boolean
類型數據。 請參見 myfce 。
E.1.4. lightdb 新特性
-
新增
lt_upgrade_check
升級前檢查工具,用於提前檢查升級不兼容及異常項,儘量避免在升級過程中出現失敗。請參見 lt_upgrade_check 。 -
新增
ECPG
代碼中支持使用‘–’
和‘//’
註釋。 請參見 ECPG 。 -
新增服務端、客戶端支持GBK,GB18030-2022,已通過塞西最高級別認證。 請參見 本地化 。
-
新增
lt_createdb
行爲在CN分佈式下默認傳播到DN節點。 請參見 lt_createdb 。 -
新增
lightdb_cursor_after_commit
GUC參數來控制fetch行爲。lightdb_cursor_after_commit
爲off
時不能在一個事務提交之後再去fetch
操作這個結果集; 爲on
時一個事務提交之後,這個遊標還可以繼續使用。 請參見 lightdb_cursor_after_commit 。 -
新增
distinct connect by level
語法支持。 -
新增
connect_by_isleaf
語法支持。 請參見 SELECT 。 -
ltsql
增強支持提示當前服務數據庫的兼容模式。 -
lt_upgrade
增強支持跨版本升級。 -
ltloader
增強性能,達到Oracle
sqlldr的80%以上。 請參見 ltldr 。 -
lt_dump
增強。 請參見 lt_dump 。 清單如下:--lt-exclude-lightdb-objects
支持過濾內置用戶lightdb
和lt_probackup
。--lt-exclude-lightdb-objects
支持導出ACCESS METHOD
。lt_dump
和lt_dumpall
增加--lt-target-version
選項,用於指定導出的內容所適用的目標版本。導出默認的創建模版支持爲
template1
。create database
語句支持lightdb_syntax_compatible_type
選項邏輯。 -
mysql_fdw
增強支持查詢超過64K的字段。
E.1.5. ltjdbc 增強
-
ltjdbc
支持numeric
使用Short
類型。 -
ltjdbc
支持setNull傳入Types.CLOB
和Types.BLOB
。 -
ltjdbc
支持整型數值使用string
類型。 -
ltjdbc
支持函數xmlparse
。