diff --git a/db-administration/db-mgmt/db-mgmt-ts.md b/db-administration/db-mgmt/db-mgmt-ts.md index 9b52fef679a94d6481c8a42701a0eaf81f921587..0b52037247abcc835247fc01cc753fa0dc66d461 100644 --- a/db-administration/db-mgmt/db-mgmt-ts.md +++ b/db-administration/db-mgmt/db-mgmt-ts.md @@ -14,21 +14,21 @@ id: db-mgmt-ts ### 语法格式 ```sql -CREATE TS DATABASE [IF NOT EXISTS] [RETENTIONS ] [PARTITION INTERVAL ] [COMMENT [=] <'comment_text'>]; +CREATE TS DATABASE [RETENTIONS ] [COMMENT [=] <'comment_text'>]; ``` ### 参数说明 :::warning 说明 -配置可选参数时,必须严格按照 `[RETENTIONS ] [PARTITION INTERVAL ] [COMMENT [=] <'comment_text'>]` 的顺序,否则系统将会报错。 +- 配置可选参数时,必须严格按照 `[RETENTIONS ] [COMMENT [=] <'comment_text'>]` 的顺序,否则系统将会报错。 +- 3.0.0 版本数据库分区间隔仅支持 10 天,其他配置值无效。 + ::: | 参数 | 说明 | | --- | --- | -| `IF NOT EXISTS` | 可选关键字。当使用 `IF NOT EXISTS` 关键字时,如果目标数据库不存在,系统创建目标数据库。如果目标数据库存在,系统不会创建数据库,但不会报错。当未使用 `IF NOT EXISTS` 关键字时,如果目标数据库不存在,系统创建目标数据库。如果目标数据库存在,系统报错,提示目标数据库已存在。 | | `db_name` | 待创建的数据库的名称。该名称必须唯一,且遵循[数据库标识符规则](../../sql-reference/sql-identifiers.md)。目前,数据库名称不支持中文字符,最大长度不能超过 63 个字节。| | `keep_duration` | 可选参数,设置数据库的数据生命周期。数据超过此时长后将被系统自动清除。
默认值: `0s`(永久保留)
时间单位:
- 秒:`s` 或 `second`
- 分钟:`m` 或 `minute`
- 小时:`h` 或 `hour`
- 天:`d` 或 `day`
- 周:`w` 或 `week`
- 月:`mon` 或 `month`
- 年:`y` 或 `year`
取值范围:正整数,上限为 1000 年
**说明:**
- 表级设置优先于库级设置。
- 保留时长越长,存储空间占用越大,请根据业务需求合理配置。
- 如果待写入的数据已超过生命周期限制,系统会直接丢弃该数据,不予写入。| -| `interval` | 可选参数,指定数据库数据目录分区的时间范围。如未指定,则默认为 `10d`,即每 10 天进行一次分区。支持配置的时间单位包括:天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。取值必须是整数值,最大值不得超过 `1000` 年。| | `comment_text` | 可选参数。指定数据库的注释信息。 | ### 语法示例 @@ -75,20 +75,6 @@ CREATE TS DATABASE [IF NOT EXISTS] [RETENTIONS ] [PARTI CREATE TS DATABASE ``` -- 创建数据库时,指定数据库的分区时间范围。 - - 以下示例创建一个名为 `iot` 的数据库,并将数据库的分区时间范围设置为 `2d`。 - - ```sql - CREATE TS DATABASE iot PARTITION INTERVAL 2d; - ``` - - 执行成功后,控制台输出以下信息: - - ```sql - CREATE TS DATABASE - ``` - ## 查看数据库 ### 前提条件 diff --git a/db-administration/db-object-mgmt/relational-db/procedure-mgmt-relational.md b/db-administration/db-object-mgmt/relational-db/procedure-mgmt-relational.md index 266bdb8d5dac5e2567e26607925f246524dfdb4c..28b83f9df818e682a70b7594662380467cb12453 100644 --- a/db-administration/db-object-mgmt/relational-db/procedure-mgmt-relational.md +++ b/db-administration/db-object-mgmt/relational-db/procedure-mgmt-relational.md @@ -19,6 +19,7 @@ KWDB 关系引擎支持创建、修改、查看、删除、执行存储过程。 - `LEAVE` - 事务语句 - 特殊函数(`ROW_COUNT()`) +- `PREPARE`、`EXECUTE`、`DEALLOCATE` ::: warning 说明 @@ -58,7 +59,7 @@ KWDB 关系引擎支持创建、修改、查看、删除、执行存储过程。 | `upsert_stmt`| 更新插入语句,用于更新、插入数据。 | | `delete_stmt`| 删除语句,用于删除目标表中的行数据,格式为 `DELETE FROM .... RETURNING target_list INTO select_into_targets`。| | `declare_stmt`| 用于声明自定义变量、处理程序以及游标。有关详细信息,参见[声明](../../../sql-reference/other-sql-statements/declare-sql.md)语句。| -| `proc_set_stmt` | 用于设置自定义变量,格式为 `SET var_name = a_expr`。
- `var_name`:自定义变量的名称。
- `a_expr`:自定义变量赋值的表达式。| +| `proc_set_stmt` | 用于设置自定义变量,格式为 `SET var_name = a_expr`。其中,`var_name` 表示自定义变量的名称,`a_expr` 表示自定义变量赋值的表达式,支持正常的自定义变量取值和存储过程中定义的临时变量(`DECLARE` 语句声明的变量)。
在存储过程中设置的自定义变量仅对当前会话有效,会话结束后自动失效。
在存储过程中设置的自定义变量,在调用存储过程后,用户仍可在外部会话中访问和修改该自定义变量。
在存储过程中设置自定义变量的类型后,不支持修改自定义变量的类型。后续赋值必须与初始类型一致,否则系统报错。
如果存储过程外部设置了自定义变量,在创建存储过程中设置自定义变量时,系统检查存储过程外部是否已存在具有相同名称的自定义变量。如果存在且类型一致,则成功设置自定义变量。否则,系统将报错。
**说明**
在存储过程内设置的自定义变量值不受 `COMMIT`、`ROLLBACK` 事务语句的影响。| | `proc_if_stmt` | `IF` 条件语句,用于根据给定的条件执行不同的 SQL 语句块,格式为 `IF a_expr THEN proc_stmt_list opt_stmt_elsifs opt_stmt_else ENDIF`。
- `a_expr`:`IF` 语句的条件表达式,该表达式必须是返回布尔值的表达式。
- `proc_stmt_list`:满足条件后需要执行的语句。支持的语句与 `CREATE PROCEDURE` 语句支持的语句相同。
- `opt_stmt_elsifs`:可选项,`IF` 语句的其他条件分支。
- `opt_stmt_else`:可选项,`IF` 语句的 `ELSE` 条件分支。| | `proc_while_stmt` | `WHILE` 循环语句,用于在指定条件为真时重复执行一段代码,格式为 `opt_loop_label WHILE a_expr DO proc_stmt_list ENDWHILE opt_label`。
- `opt_loop_label`:`WHILE` 循环语句的标签,格式为 `LABEL label_name:`。
-`a_expr`:`WHILE` 循环语句的条件判断表达式。
-`proc_stmt_list`:满足条件后需要执行的语句。支持的语句与 `CREATE PROCEDURE` 语句支持的语句相同。
- `opt_label`:`WHILE` 循环语句的标签,与 `opt_loop_label` 参数成对出现,格式为 `label_name`。 | | `begin_stmt` | 启动事务语句。 | @@ -70,59 +71,113 @@ KWDB 关系引擎支持创建、修改、查看、删除、执行存储过程。 | `fetch_cursor_stmt` | 获取游标语句。有关详细信息,参见[获取游标](../../../sql-reference/other-sql-statements/cursor-sql.md#获取游标)。 | | `close_cursor_stmt` | 关闭游标语句。有关详细信息,参见[关闭游标](../../../sql-reference/other-sql-statements/cursor-sql.md#关闭游标)。 | | `proc_leave_stmt`| 在使用 `LABEL` 关键字为存储过程体或 `WHILE` 语句定义标签时,可以使用 `LEAVE` 语句跳出存储过程体或 `WHILE` 循环,格式为 `LEAVE label_name`。 | +| `prepare_stmt` | 预处理语句,格式为 `PREPARE stmt_name AS stmt_sql`。预处理语句名称在当前会话中必须全局唯一。在存储过程中创建预处理语句时,若与已存在的预处理语句重名,系统将报错。在存储过程中创建的预处理语句仅对当前会话有效,会话结束后自动清理。
在存储过程中,预处理语句定义的 SQL 语句必须是存储过程支持的单个完整 SQL 语句。SQL 语句的参数占位符仅支持美元符号(`$`)且仅能替换 SQL 中的值(如 `WHERE id = $1`),不能替换表名、列名、关键字等标识符。
在存储过程中,预处理语句支持 `SELECT`、`INSERT`、`UPDATE`、`UPSERT`、`DELETE` 语句。
在存储过程中,预处理语句不支持事务语句(`BEGIN`、`START TRANSACTION`、`COMMIT`、`ROLLBACK`)、会话控制语句(`USE`)、存储过程的流程控制语句、存储过程相关的语句(`CREATE PROCEDURE`、`ALTER PROCEDURE`、`DROP PROCEDURE`、`CALL PROCEDURE`)、`SELECT INTO` 语句、DDL 语句。
存储过程内部可以使用在存储过程外部定义的预处理语句。反之,如果系统未主动释放存储过程中创建的预处理语句,在存储过程外部也可以使用该预处理语句。
**说明**
- 不支持预处理语句中嵌套另一个预处理语句。
- 预处理语句中不能包含存储过程中定义的临时变量(`DECLARE` 语句声明的变量)和自定义变量。
- 运行预处理语句后,如果未显式执行 `DEALLOCATE PREPARE` 语句,预处理对象会保留在当前会话中。此时,如果在存储过程外部创建具有相同名称的预处理对象,系统会报错。 | +| `execute_stmt` | 执行预处理语句,格式为 `EXECUTE stmt_name para_value`。
**说明**
执行预处理语句中不能包含存储过程中定义的临时变量(`DECLARE` 语句声明的变量)或传入参数。用户需要通过 `SET @var = variable` 语句提前进行转换。 | +| `deallocate_stmt` | 释放预处理语句,格式为 `DEALLOCATE PREPARE stmt`。如需删除所有的预处理语句,使用 `DEALLOCATE ALL` 或者 `DEALLOCATE PREPARE ALL` 语句。| ### 语法示例 -以下示例创建一个名为 `test` 的存储过程。 +- 创建存储过程。 -```sql --- 设置分隔符。 -delimiter \\ + 以下示例创建一个名为 `test` 的存储过程。 --- 创建存储过程。 -create procedure test() -label test: -begin - declare a int; - declare b int; - declare err int; - declare exit HANDLER FOR NOT FOUND,SQLEXCEPTION - BEGIN - SET err = -1; - SELECT a,b; - ROLLBACK; - ENDHANDLER; - - START TRANSACTION; - set a = 10; - select a, b from t1; - update t1 set a = a + 1 where b > 0; - insert into t1 values (a, b); - label my_loop: - WHILE b <= 10 DO - declare d int; - set d = b + 2; - if d > 9 then - select * from t1; - leave my_loop; - elsif b > 5 then - select * from t2; - endif; - set b = b + 1; - ENDWHILE my_loop; - IF err = 0 THEN - SELECT a,b; - ENDIF; - COMMIT; -end test\\ -delimiter ; -CREATE PROCEDURE -``` + ```sql + -- 设置分隔符。 + delimiter \\ + + -- 创建存储过程。 + create procedure test() + label test: + begin + declare a int; + declare b int; + declare err int; + declare exit HANDLER FOR NOT FOUND,SQLEXCEPTION + BEGIN + SET err = -1; + SELECT a,b; + ROLLBACK; + ENDHANDLER; + + START TRANSACTION; + set a = 10; + select a, b from t1; + update t1 set a = a + 1 where b > 0; + insert into t1 values (a, b); + label my_loop: + WHILE b <= 10 DO + declare d int; + set d = b + 2; + if d > 9 then + select * from t1; + leave my_loop; + elsif b > 5 then + select * from t2; + endif; + set b = b + 1; + ENDWHILE my_loop; + IF err = 0 THEN + SELECT a,b; + ENDIF; + COMMIT; + end test\\ + delimiter ; + CREATE PROCEDURE + ``` + +- 创建存储过程,并在存储过程中设置自定义变量。 + + ```sql + -- 设置分隔符。 + DELIMITER \\ + + -- 创建存储过程。 + CREATE PROCEDURE proc1() + BEGIN + declare a int; + set a = 10; + set @b = 1; + select @b; + + set @b = a; + select @b; + + END // + CREATE PROCEDURE + Time: 60.4819ms + ``` + +- 创建存储过程,并在存储过程中使用 `PREPARE`、`EXECUTE`、`DEALLOCATE` 语句。 + + ```sql + -- 设置分隔符。 + DELIMITER \\ + + -- 创建存储过程。 + CREATE PROCEDURE proc1() + BEGIN + PREPARE stmt as SELECT 1; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END // + + CREATE PROCEDURE + Time: 60.4819ms + ``` ## 调用存储过程 `CALL` 语句用于调用存储过程。 +::: warning 说明 + +- 如果在创建存储过程时定义了自定义变量,在调用存储过程时,系统检查存储过程外部是否已存在具有相同名称的自定义变量。如果存在且类型一致,系统将成功调用存储过程并用新的自定义变量值覆盖原有值。否则,系统将报错。 +- 如果在创建存储过程时定义了预处理语句,在调用存储过程时,系统检查预处理语句的语法。如果不符合语法,系统将报错。 +- 如果在创建存储过程时定义了执行预处理语句,在调用存储过程时,系统检查执行预处理语句的对象是否存在。如果不存在,系统将报错。 +- 如果在创建存储过程时定义了释放预处理语句,在调用存储过程时,系统检查释放预处理语句的对象是否存在。如果不存在,系统将报错。 + +::: + ### 前提条件 用户是 `admin` 角色的成员或者拥有目标存储过程 EXECUTE 权限和存储过程体中引用的所有对象的相关权限(例如表的 SELECT 权限)。默认情况下,`root` 用户属于 `admin` 角色。 diff --git a/db-administration/db-object-mgmt/ts-db/table-mgmt-ts.md b/db-administration/db-object-mgmt/ts-db/table-mgmt-ts.md index a3f53f50741ccc6e7af4cfeb445b935f91e09510..acd76954f9f7dabf173a1f17d63aba62497c354f 100644 --- a/db-administration/db-object-mgmt/ts-db/table-mgmt-ts.md +++ b/db-administration/db-object-mgmt/ts-db/table-mgmt-ts.md @@ -16,7 +16,7 @@ id: table-mgmt-ts ### 语法格式 ```sql -CREATE TABLE [IF NOT EXISTS] () +CREATE TABLE () [TAGS|ATTRIBUTES] () PRIMARY [TAGS|ATTRIBUTES] () [RETENTIONS ] @@ -31,12 +31,11 @@ PRIMARY [TAGS|ATTRIBUTES] () - 目前,时序表名、列名和标签名称不支持中文字符。 - 配置可选参数时,必须严格按照 `[RETENTIONS ] [DICT ENCODING] [COMMENT [=] <'comment_text'>] [WITH HASH()]` 的顺序,否则系统将会报错。 -- 对于 KWDB 3.1.0,表的分区间隔配置使用所属数据库的时间分区间隔配置。 +- 3.0.0 版本中,表活跃时间和分区间隔的配置不会生效。 ::: | 参数 | 说明 | | --- | --- | -| `IF NOT EXISTS` | 可选关键字。当使用 `IF NOT EXISTS` 关键字时,如果目标数表不存在,系统创建目标表。如果目标表存在,系统不会创建表,但不会报错。当未使用 `IF NOT EXISTS` 关键字时,如果目标表不存在,系统创建目标表。如果目标表存在,系统报错,提示目标表已存在。| | `table_name`| 待创建的时序表的名称,表名的最大长度为 128 字节。在指定数据库中,时序表名称必须唯一,并且遵循[数据库标识符规则](../../../sql-reference/sql-identifiers.md)。 | | `column_list`| 待创建的数据列列表,支持添加两个以上的列定义,最多可指定 4096 列。列定义包括列名、数据类型、注释信息和默认值。
- 列名的最大长度为 128 字节,支持指定 NOT NULL,默认为空值。支持自定义第一列的列名,但数据类型必须是 TIMESTAMPTZ 或 TIMESTAMP 且非空。默认时区为 UTC。
- 对于非时间类型的数据列,默认值只能是常量。对于时间类型的列(TIMESTAMPTZ 或 TIMESTAMP),默认值可以是常量,也可以是 `now()` 函数。如果默认值类型与列类型不匹配,设置默认值时,系统报错。支持默认值设置为 NULL。
- KWDB 支持毫秒、微秒和纳秒的时间精度。默认情况下,KWDB 采用毫秒时间精度。
- 支持在数据类型之后添加数据列的注释信息。| | `tag_list`| 标签列表,支持添加一个或多个标签定义,最多可指定 `128` 个标签。标签定义包含标签名、数据类型和注释信息。
- 标签名的最大长度为 128 字节,支持指定 NOT NULL,默认为空值。不支持 TIMESTAMP、TIMESTAMPTZ、NVARCHAR 和 GEOMETRY 数据类型。
- 支持在 nullable 条件之后添加标签列的注释信息。 | diff --git a/sql-reference/ddl/relational-db/relational-procedure.md b/sql-reference/ddl/relational-db/relational-procedure.md index a26ca8ff115c4181771a69a2d3ca13ddbed1ee1c..97c9ce118150bbfa1b66db1d4a8c65d2989031cc 100644 --- a/sql-reference/ddl/relational-db/relational-procedure.md +++ b/sql-reference/ddl/relational-db/relational-procedure.md @@ -20,6 +20,7 @@ KWDB 关系引擎支持创建、修改、查看、删除、执行存储过程。 - `LEAVE` - 事务语句 - 特殊函数(`ROW_COUNT()`) +- `PREPARE`、`EXECUTE`、`DEALLOCATE` ::: warning 说明 @@ -84,7 +85,7 @@ KWDB 关系引擎支持创建、修改、查看、删除、执行存储过程。 | `upsert_stmt`| 更新插入语句,用于更新、插入数据。 | | `delete_stmt`| 删除语句,用于删除目标表中的行数据,格式为 `DELETE FROM .... RETURNING target_list INTO select_into_targets`。| | `declare_stmt`| 用于声明自定义变量、处理程序以及游标。有关详细信息,参见[声明](../../other-sql-statements/declare-sql.md)语句。| -| `proc_set_stmt` | 用于设置自定义变量,格式为 `SET var_name = a_expr`。
- `var_name`:自定义变量的名称。
- `a_expr`:自定义变量赋值的表达式。| +| `proc_set_stmt` | 用于设置自定义变量,格式为 `SET var_name = a_expr`。其中,`var_name` 表示自定义变量的名称,`a_expr` 表示自定义变量赋值的表达式,支持正常的自定义变量取值和存储过程中定义的临时变量(`DECLARE` 语句声明的变量)。
在存储过程中设置的自定义变量仅对当前会话有效,会话结束后自动失效。
在存储过程中设置的自定义变量,在调用存储过程后,用户仍可在外部会话中访问和修改该自定义变量。
在存储过程中设置自定义变量的类型后,不支持修改自定义变量的类型。后续赋值必须与初始类型一致,否则系统报错。
如果存储过程外部设置了自定义变量,在创建存储过程中设置自定义变量时,系统检查存储过程外部是否已存在具有相同名称的自定义变量。如果存在且类型一致,则成功设置自定义变量。否则,系统将报错。
**说明**
在存储过程内设置的自定义变量值不受 `COMMIT`、`ROLLBACK` 事务语句的影响。| | `proc_if_stmt` | `IF` 条件语句,用于根据给定的条件执行不同的 SQL 语句块,格式为 `IF a_expr THEN proc_stmt_list opt_stmt_elsifs opt_stmt_else ENDIF`。
- `a_expr`:`IF` 语句的条件表达式,该表达式必须是返回布尔值的表达式。
- `proc_stmt_list`:满足条件后需要执行的语句。支持的语句与 `CREATE PROCEDURE` 语句支持的语句相同。
- `opt_stmt_elsifs`:可选项,`IF` 语句的其他条件分支。
- `opt_stmt_else`:可选项,`IF` 语句的 `ELSE` 条件分支。| | `proc_while_stmt` | `WHILE` 循环语句,用于在指定条件为真时重复执行一段代码,格式为 `opt_loop_label WHILE a_expr DO proc_stmt_list ENDWHILE opt_label`。
- `opt_loop_label`:`WHILE` 循环语句的标签,格式为 `LABEL label_name:`。
-`a_expr`:`WHILE` 循环语句的条件判断表达式。
-`proc_stmt_list`:满足条件后需要执行的语句。支持的语句与 `CREATE PROCEDURE` 语句支持的语句相同。
- `opt_label`:`WHILE` 循环语句的标签,与 `opt_loop_label` 参数成对出现,格式为 `label_name`。 | | `begin_stmt` | 启动事务语句。 | @@ -96,59 +97,113 @@ KWDB 关系引擎支持创建、修改、查看、删除、执行存储过程。 | `fetch_cursor_stmt` | 获取游标语句。有关详细信息,参见[获取游标](../../other-sql-statements/cursor-sql.md#获取游标)。 | | `close_cursor_stmt` | 关闭游标语句。有关详细信息,参见[关闭游标](../../other-sql-statements/cursor-sql.md#关闭游标)。 | | `proc_leave_stmt`| 在使用 `LABEL` 关键字为存储过程体或 `WHILE` 语句定义标签时,可以使用 `LEAVE` 语句跳出存储过程体或 `WHILE` 循环,格式为 `LEAVE label_name`。 | +| `prepare_stmt` | 预处理语句,格式为 `PREPARE stmt_name AS stmt_sql`。预处理语句名称在当前会话中必须全局唯一。在存储过程中创建预处理语句时,若与已存在的预处理语句重名,系统将报错。在存储过程中创建的预处理语句仅对当前会话有效,会话结束后自动清理。
在存储过程中,预处理语句定义的 SQL 语句必须是存储过程支持的单个完整 SQL 语句。SQL 语句的参数占位符仅支持美元符号(`$`)且仅能替换 SQL 中的值(如 `WHERE id = $1`),不能替换表名、列名、关键字等标识符。
在存储过程中,预处理语句支持 `SELECT`、`INSERT`、`UPDATE`、`UPSERT`、`DELETE` 语句。
在存储过程中,预处理语句不支持事务语句(`BEGIN`、`START TRANSACTION`、`COMMIT`、`ROLLBACK`)、会话控制语句(`USE`)、存储过程的流程控制语句、存储过程相关的语句(`CREATE PROCEDURE`、`ALTER PROCEDURE`、`DROP PROCEDURE`、`CALL PROCEDURE`)、`SELECT INTO` 语句、DDL 语句。
存储过程内部可以使用在存储过程外部定义的预处理语句。反之,如果系统未主动释放存储过程中创建的预处理语句,在存储过程外部也可以使用该预处理语句。
**说明**
- 不支持预处理语句中嵌套另一个预处理语句。
- 预处理语句中不能包含存储过程中定义的临时变量(`DECLARE` 语句声明的变量)和自定义变量。
- 运行预处理语句后,如果未显式执行 `DEALLOCATE PREPARE` 语句,预处理对象会保留在当前会话中。此时,如果在存储过程外部创建具有相同名称的预处理对象,系统会报错。 | +| `execute_stmt` | 执行预处理语句,格式为 `EXECUTE stmt_name para_value`。
**说明**
执行预处理语句中不能包含存储过程中定义的临时变量(`DECLARE` 语句声明的变量)或传入参数。用户需要通过 `SET @var = variable` 语句提前进行转换。 | +| `deallocate_stmt` | 释放预处理语句,格式为 `DEALLOCATE PREPARE stmt`。如需删除所有的预处理语句,使用 `DEALLOCATE ALL` 或者 `DEALLOCATE PREPARE ALL` 语句。| ### 语法示例 -以下示例创建一个名为 `test` 的存储过程。 +- 创建存储过程。 -```sql --- 设置分隔符。 -delimiter \\ + 以下示例创建一个名为 `test` 的存储过程。 --- 创建存储过程。 -create procedure test() -label test: -begin - declare a int; - declare b int; - declare err int; - declare exit HANDLER FOR NOT FOUND,SQLEXCEPTION - BEGIN - SET err = -1; - SELECT a,b; - ROLLBACK; - ENDHANDLER; - - START TRANSACTION; - set a = 10; - select a, b from t1; - update t1 set a = a + 1 where b > 0; - insert into t1 values (a, b); - label my_loop: - WHILE b <= 10 DO - declare d int; - set d = b + 2; - if d > 9 then - select * from t1; - leave my_loop; - elsif b > 5 then - select * from t2; - endif; - set b = b + 1; - ENDWHILE my_loop; - IF err = 0 THEN - SELECT a,b; - ENDIF; - COMMIT; -end test\\ -delimiter ; -CREATE PROCEDURE -``` + ```sql + -- 设置分隔符。 + delimiter \\ + + -- 创建存储过程。 + create procedure test() + label test: + begin + declare a int; + declare b int; + declare err int; + declare exit HANDLER FOR NOT FOUND,SQLEXCEPTION + BEGIN + SET err = -1; + SELECT a,b; + ROLLBACK; + ENDHANDLER; + + START TRANSACTION; + set a = 10; + select a, b from t1; + update t1 set a = a + 1 where b > 0; + insert into t1 values (a, b); + label my_loop: + WHILE b <= 10 DO + declare d int; + set d = b + 2; + if d > 9 then + select * from t1; + leave my_loop; + elsif b > 5 then + select * from t2; + endif; + set b = b + 1; + ENDWHILE my_loop; + IF err = 0 THEN + SELECT a,b; + ENDIF; + COMMIT; + end test\\ + delimiter ; + CREATE PROCEDURE + ``` + +- 创建存储过程,并在存储过程中设置自定义变量。 + + ```sql + -- 设置分隔符。 + DELIMITER \\ + + -- 创建存储过程。 + CREATE PROCEDURE proc1() + BEGIN + declare a int; + set a = 10; + set @b = 1; + select @b; + + set @b = a; + select @b; + + END // + CREATE PROCEDURE + Time: 60.4819ms + ``` + +- 创建存储过程,并在存储过程中使用 `PREPARE`、`EXECUTE`、`DEALLOCATE` 语句。 + + ```sql + -- 设置分隔符。 + DELIMITER \\ + + -- 创建存储过程。 + CREATE PROCEDURE proc1() + BEGIN + PREPARE stmt as SELECT 1; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END // + + CREATE PROCEDURE + Time: 60.4819ms + ``` ## 调用存储过程 `CALL` 语句用于调用存储过程。 +::: warning 说明 + +- 如果在创建存储过程时定义了自定义变量,在调用存储过程时,系统检查存储过程外部是否已存在具有相同名称的自定义变量。如果存在且类型一致,系统将成功调用存储过程并用新的自定义变量值覆盖原有值。否则,系统将报错。 +- 如果在创建存储过程时定义了预处理语句,在调用存储过程时,系统检查预处理语句的语法。如果不符合语法,系统将报错。 +- 如果在创建存储过程时定义了执行预处理语句,在调用存储过程时,系统检查执行预处理语句的对象是否存在。如果不存在,系统将报错。 +- 如果在创建存储过程时定义了释放预处理语句,在调用存储过程时,系统检查释放预处理语句的对象是否存在。如果不存在,系统将报错。 + +::: + ### 所需权限 用户是 `admin` 角色的成员或者拥有目标存储过程 EXECUTE 权限和存储过程体中引用的所有对象的相关权限(例如表的 SELECT 权限)。默认情况下,`root` 用户属于 `admin` 角色。 diff --git a/sql-reference/ddl/ts-db/ts-database.md b/sql-reference/ddl/ts-db/ts-database.md index febfd890226f5228efce9d720fd11f26ada70ab2..08993f030960f61fa976f754d9d4bd3fc7f32b1d 100644 --- a/sql-reference/ddl/ts-db/ts-database.md +++ b/sql-reference/ddl/ts-db/ts-database.md @@ -17,20 +17,21 @@ id: ts-database ### 语法格式 -![](../../../static/sql-reference/create_ts_db.png) +![](../../../static/sql-reference/createdb_ts.png) ### 参数说明 :::warning 说明 -配置可选参数时,必须严格按照 `[RETENTIONS ] [PARTITION INTERVAL ] [COMMENT [=] <'comment_text'>]` 的顺序,否则系统将会报错。 + +- 配置可选参数时,必须严格按照 `[RETENTIONS ] [COMMENT [=] <'comment_text'>]` 的顺序,否则系统将会报错。 +- 3.0.0 版本数据库分区间隔仅支持 10 天,其他配置值无效。 + ::: | 参数 | 说明 | | --- | --- | -| `IF NOT EXISTS` | 可选关键字。当使用 `IF NOT EXISTS` 关键字时,如果目标数据库不存在,系统创建目标数据库。如果目标数据库存在,系统不会创建数据库,但不会报错。当未使用 `IF NOT EXISTS` 关键字时,如果目标数据库不存在,系统创建目标数据库。如果目标数据库存在,系统报错,提示目标数据库已存在。 | | `database_name` | 待创建的数据库的名称。该名称必须唯一,且遵循[数据库标识符规则](../../sql-identifiers.md)。目前,数据库名称不支持中文字符,最大长度不能超过 63 个字节。| | `keep_duration` | 可选参数,设置数据库的数据生命周期。数据超过此时长后将被系统自动清除。
默认值: `0s`(永久保留)
时间单位:
- 秒:`s` 或 `second`
- 分钟:`m` 或 `minute`
- 小时:`h` 或 `hour`
- 天:`d` 或 `day`
- 周:`w` 或 `week`
- 月:`mon` 或 `month`
- 年:`y` 或 `year`
取值范围:正整数,上限为 1000 年
**说明:**
- 表级设置优先于库级设置。
- 保留时长越长,存储空间占用越大,请根据业务需求合理配置。
- 如果待写入的数据已超过生命周期限制,系统会直接丢弃该数据,不予写入。| -| `interval` | 可选参数,指定数据库数据目录分区的时间范围。如未指定,则默认为 `10d`,即每 10 天进行一次分区。支持配置的时间单位包括:天(D 或 DAY)、周(W 或 WEEK)、月(MON 或 MONTH)、年(Y 或 YEAR)。取值必须是整数值,最大值不得超过 `1000` 年。| | `comment_text` | 可选参数。指定数据库的注释信息。 | ### 语法示例 @@ -77,20 +78,6 @@ id: ts-database CREATE TS DATABASE ``` -- 创建数据库时,指定数据库的分区时间范围。 - - 以下示例创建一个名为 `iot` 的数据库,并将数据库的分区时间范围设置为 `2d`。 - - ```sql - CREATE TS DATABASE iot PARTITION INTERVAL 2d; - ``` - - 执行成功后,控制台输出以下信息: - - ```sql - CREATE TS DATABASE - ``` - ## 查看数据库 `SHOW DATABASES` 语句用于查看 KWDB 数据库系统中包含的所有数据库,包括关系数据库和时序数据库。 diff --git a/sql-reference/ddl/ts-db/ts-table.md b/sql-reference/ddl/ts-db/ts-table.md index 370eac71a36bdb5a7f99f63e53ac658e1dec3c6f..2e0d89aeb4dc72def7d206143a642a0e3a9405d2 100644 --- a/sql-reference/ddl/ts-db/ts-table.md +++ b/sql-reference/ddl/ts-db/ts-table.md @@ -15,7 +15,7 @@ id: ts-table ### 语法格式 -![](../../../static/sql-reference/createtable.png) +![](../../../static/sql-reference/create_table_ts.png) ### 参数说明 @@ -23,13 +23,12 @@ id: ts-table - 目前,时序表名、列名和标签名称不支持中文字符。 - 配置可选参数时,必须严格按照 `[RETENTIONS ] [DICT ENCODING] [COMMENT [=] <'comment_text'>] [WITH HASH()]` 的顺序,否则系统将会报错。 -- 对于 KWDB 3.1.0,表的分区间隔配置使用所属数据库的时间分区间隔配置。 +- 3.0.0 版本中,表活跃时间和分区间隔的配置不会生效。 ::: | 参数 | 说明 | | --- | --- | -| `IF NOT EXISTS` | 可选关键字。当使用 `IF NOT EXISTS` 关键字时,如果目标数表不存在,系统创建目标表。如果目标表存在,系统不会创建表,但不会报错。当未使用 `IF NOT EXISTS` 关键字时,如果目标表不存在,系统创建目标表。如果目标表存在,系统报错,提示目标表已存在。| | `table_name`| 待创建的时序表的名称,表名的最大长度为 128 字节。在指定数据库中,时序表名称必须唯一,并且遵循[数据库标识符规则](../../sql-identifiers.md)。 | | `column_list`| 待创建的数据列列表,支持添加两个以上的列定义,最多可指定 4096 列。列定义包括列名、数据类型、注释信息和默认值。
- 列名的最大长度为 128 字节,支持指定 NOT NULL,默认为空值。支持自定义第一列的列名,但数据类型必须是 TIMESTAMPTZ 或 TIMESTAMP 且非空。默认时区为 UTC。
- 对于非时间类型的数据列,默认值只能是常量。对于时间类型的列(TIMESTAMPTZ 或 TIMESTAMP),默认值可以是常量,也可以是 `now()` 函数。如果默认值类型与列类型不匹配,设置默认值时,系统报错。支持默认值设置为 NULL。
- 时间戳列支持设置时间精度。目前,KWDB 支持毫秒、微秒和纳秒的时间精度。默认情况下,KWDB 采用毫秒时间精度。
- 支持在数据类型之后添加数据列的注释信息。 | | `tag_list`| 标签列表,支持添加一个或多个标签定义,最多可指定 `128` 个标签。标签定义包含标签名、数据类型和注释信息。
- 标签名的最大长度为 128 字节,支持指定 NOT NULL,默认为空值。不支持 TIMESTAMP、TIMESTAMPTZ、NVARCHAR 和 GEOMETRY 数据类型。
- 支持在 nullable 条件之后添加标签列的注释信息。 | diff --git a/static/sql-reference/create_ts_db.png b/static/sql-reference/create_ts_db.png deleted file mode 100644 index 3216bc04a270eb2dccfe48e300c30be3e8184468..0000000000000000000000000000000000000000 Binary files a/static/sql-reference/create_ts_db.png and /dev/null differ diff --git a/static/sql-reference/createtable.png b/static/sql-reference/createtable.png deleted file mode 100644 index 4c8bc21bc8c577a4a289e6e961f52b71221258a1..0000000000000000000000000000000000000000 Binary files a/static/sql-reference/createtable.png and /dev/null differ diff --git a/static/sql-reference/opt_proc_body.png b/static/sql-reference/opt_proc_body.png index d6836309b6200352f24cecef69c50ad1cdf1bb05..f069ee9e29db4b8de16b567d3250b1bf9e50dcd2 100644 Binary files a/static/sql-reference/opt_proc_body.png and b/static/sql-reference/opt_proc_body.png differ