华为云用户手册

  • 功能描述 RELEASE SAVEPOINT删除一个当前事务先前定义的保存点。 把一个保存点删除就令其无法作为回滚点使用,除此之外它没有其它用户可见的行为。它并不能撤销在保存点建立起来之后执行的命令的影响。要撤销那些命令可以使用ROLLBACK TO SAVEPOINT 。当不再需要的时候删除一个保存点可以令系统在事务结束之前提前回收一些资源。 RELEASE SAVEPOINT也删除所有在指定的保存点建立之后的所有保存点。
  • 示例 --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建一个新表。 gaussdb=# CREATE TABLE tpcds.table1(a int); --开启事务。 gaussdb=# START TRANSACTION; --插入数据。 gaussdb=# INSERT INTO tpcds.table1 VALUES (3); --建立保存点。 gaussdb=# SAVEPOINT my_savepoint; --插入数据。 gaussdb=# INSERT INTO tpcds.table1 VALUES (4); --删除保存点。 gaussdb=# RELEASE SAVEPOINT my_savepoint; --提交事务。 gaussdb=# COMMIT; --查询表的内容,会同时看到3和4。 gaussdb=# SELECT * FROM tpcds.table1; --删除表。 gaussdb=# DROP TABLE tpcds.table1; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 参数说明 INDEX 重新建立指定的索引。 TABLE 重新建立指定表的所有索引,如果表有从属的“TOAST”表,则这个表也会重建索引。如果表上有索引已经被alter unusable失效,则这个索引无法被重新创建。当指定CONCURRENTLY选项时,暂不支持重建从属“TOAST”表上的索引。 DATABASE 重建当前数据库里的所有索引。当指定CONCURRENTLY选项时,暂不支持重建数据库中表的从属“TOAST”表上的索引。 SYSTEM 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 CONCURRENTLY 以不阻塞DML的方式重建索引(加ShareUpdateExclusiveLock锁)。重建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现重建过程中不阻塞DML。不支持在线重建系统表上的索引。不支持REINDEX INTERNAL TABLE CONCURRENTLY和REINDEX SYSTEM CONCURRENTLY。当执行REINDEX DATABASE CONCURRENTLY时,在线重建当前数据库中用户表上的所有索引(不会处理系统表上的索引)。REINDEX CONCURRENTLY不可以在事务内执行。在线重建索引只支持B-tree索引和UB-tree索引,只支持普通索引、GLOBAL索引、LOCAL索引。在线并行重建索引只支持Astore的普通索引、GLOBAL索引、LOCAL索引,Ustore索引不支持在线并行重建。如果在线重建索引失败,可能会留下非法的新索引,在系统无法自动清理失败新索引的情况下(比如数据库宕机),需要尽快手动清除(使用DROP INDEX语句)非法新索引,以防占用更多资源。一般来说,非法的新索引的后缀名为_ccnew。REINDEX INDEX CONCURRENTLY对表加4级会话锁,且其前几个阶段与CREATE INDEX CONCURRENTLY相似,因此也可能产生卡住或死锁的问题,具体场景与CREATE INDEX CONCURRENTLY相似(比如两个会话同时对同一个索引或表进行REINDEX CONCURRENTLY操作,会引发死锁问题),详见CONCURRENTLY章节。 name 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 FORCE 废弃选项,仅为保持前向兼容,故继续保留。 partition_name 需要重建索引的分区的名称或者索引分区的名称。 取值范围: 如果前面是REINDEX INDEX,则这里应该指定索引分区的名称; 如果前面是REINDEX TABLE,则这里应该指定分区的名称; REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。
  • 示例 --创建一个普通表。 gaussdb=# CREATE TABLE my_table (c1 int, c2 int) WITH(STORAGE_TYPE=ASTORE); --创建全量物化视图。 gaussdb=# CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table; --创建增量物化视图。 gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table; --基表写入数据。 gaussdb=# INSERT INTO my_table VALUES(1,1),(2,2); --对全量物化视图my_mv进行全量刷新。 gaussdb=# REFRESH MATERIALIZED VIEW my_mv; --对增量物化视图my_imv进行全量刷新。 gaussdb=# REFRESH MATERIALIZED VIEW my_imv; --删除增量物化视图。 gaussdb=# DROP MATERIALIZED VIEW my_imv; --删除全量物化视图。 gaussdb=# DROP MATERIALIZED VIEW my_mv; --删除表my_table。 gaussdb=# DROP TABLE my_table;
  • 示例 --创建一个普通表。 gaussdb=# CREATE TABLE my_table (c1 int, c2 int) WITH(STORAGE_TYPE=ASTORE); --创建增量物化视图。 gaussdb=# CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT * FROM my_table; --基表写入数据。 gaussdb=# INSERT INTO my_table VALUES(1,1),(2,2); --对增量物化视图my_imv进行增量刷新。 gaussdb=# REFRESH INCREMENTAL MATERIALIZED VIEW my_imv; --删除增量物化视图。 gaussdb=# DROP MATERIALIZED VIEW my_imv; --删除表my_table。 gaussdb=# DROP TABLE my_table;
  • 示例 -- 创建角色tpcds。 gaussdb=# CREATE ROLE tpcds IDENTIFIED BY '*********'; -- 创建表空间reason_table_space gaussdb=# CREATE TABLESPACE REASON_TABLE_SPACE1 owner tpcds RELATIVE location 'tablespace/tsp_reason1'; -- 创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; -- 在表空间创建表tpcds.reason_t1 gaussdb=# CREATE TABLE tpcds.reason_t1 ( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) tablespace reason_table_space1; -- 在表空间创建表tpcds.reason_t2 gaussdb=# CREATE TABLE tpcds.reason_t2 ( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) tablespace reason_table_space1; -- 在表空间创建表tpcds.reason_t3 gaussdb=# CREATE TABLE tpcds.reason_t3 ( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) ) tablespace reason_table_space1; -- 对表tpcds.reason_t1创建索引 gaussdb=# CREATE INDEX index_t1 on tpcds.reason_t1(r_reason_id); gaussdb=# DROP TABLE tpcds.reason_t1; gaussdb=# DROP TABLE tpcds.reason_t2; gaussdb=# DROP TABLE tpcds.reason_t3; --查看回收站 gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- BIN$16409$2CEE988==$0 | reason_t1 | 16408 BIN$16412$2CF2188==$0 | reason_t2 | 16408 BIN$16415$2CF2EC8==$0 | reason_t3 | 16408 BIN$16418$2CF3EC8==$0 | index_t1 | 0 (4 rows) --PURGE清除表 gaussdb=# PURGE TABLE tpcds.reason_t3; gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- BIN$16409$2CEE988==$0 | reason_t1 | 16408 BIN$16412$2CF2188==$0 | reason_t2 | 16408 BIN$16418$2CF3EC8==$0 | index_t1 | 0 (3 rows) --PURGE清除索引 gaussdb=# PURGE INDEX tpcds.index_t1; gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- BIN$16409$2CEE988==$0 | reason_t1 | 16408 BIN$16412$2CF2188==$0 | reason_t2 | 16408 (2 rows) --PURGE清除回收站所有对象 gaussdb=# PURGE recyclebin; gaussdb=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN; rcyname | rcyoriginname | rcytablespace -----------------------+---------------+--------------- (0 rows) -- 删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 功能描述 为当前事务做两阶段提交的准备。 在命令之后,事务就不再和当前会话关联了;它的状态完全保存在磁盘上,它被提交成功的可能性非常高,即使是在请求提交之前数据库发生了崩溃也如此。 一旦准备好了,一个事务就可以在稍后用COMMIT PREPARED或 ROLLBACK PREPARED命令分别进行提交或者回滚。这些命令可以从任何会话中发出,而不光是最初执行事务的那个会话。 从发出命令的会话的角度来看,PREPARE TRANSACTION不同于ROLLBACK:在执行它之后,就不再有活跃的当前事务了,并且预备事务的效果无法见到 (在事务提交的时候其效果会再次可见)。 如果PREPARE TRANSACTION因为某些原因失败,那么它就会变成一个ROLLBACK,当前事务被取消。
  • 功能描述 创建一个预备语句。 预备语句是服务端的对象,可以用于优化性能。在执行PREPARE语句的时候,指定的查询被解析、分析、重写。当随后发出EXECUTE语句的时候,预备语句被规划和执行。这种设计避免了重复解析、分析工作。PREPARE语句创建后在整个数据库会话期间一直存在,一旦创建成功,即便是在事务块中创建,事务回滚,PREPARE也不会删除。只能通过显式调用DEALLOCATE进行删除,会话结束时,PREPARE也会自动删除。
  • 示例 --创建数据表 gaussdb=# CREATE TABLE houses ( id INTEGER, tax INTEGER, bedroom INTEGER, bath DOUBLE PRECISION, price INTEGER, size INTEGER, lot INTEGER, mark text ); --插入训练数据 gaussdb=# INSERT INTO houses(id, tax, bedroom, bath, price, size, lot, mark) VALUES (1,590,2,1,50000,770,22100,'a+'), (2,1050,3,2,85000,1410,12000,'a+'), (3,20,2,1,22500,1060,3500,'a-'), (4,870,2,2,90000,1300,17500,'a+'), (5,1320,3,2,133000,1500,30000,'a+'), (6,1350,2,1,90500,850,25700,'a-'), (7,2790,3,2.5,260000,2130,25000,'a+'), (8,680,2,1,142500,1170,22000,'a-'), (9,1840,3,2,160000,1500,19000,'a+'), (10,3680,4,2,240000,2790,20000,'a-'), (11,1660,3,1,87000,1030,17500,'a+'), (12,1620,3,2,118500,1250,20000,'a-'), (13,3100,3,2,140000,1760,38000,'a+'), (14,2090,2,3,148000,1550,14000,'a-'), (15,650,3,1.5,65000,1450,12000,'a-'); --训练模型 gaussdb=# CREATE MODEL price_model USING logistic_regression FEATURES size, lot TARGET mark FROM HOUSES WITH learning_rate=0.88, max_iterations=default; ——预测 gaussdb=# SELECT id, PREDICT BY price_model (FEATURES size,lot) FROM houses; --删除模型 gaussdb=# DROP MODEL price_model; --删除表 gaussdb=# DROP TABLE houses;
  • 示例 --创建SCHEMA。 gaussdb=# CREATE SCHEMA tpcds; --创建表tpcds.reason。 gaussdb=# CREATE TABLE tpcds.reason ( r_reason_sk INTEGER NOT NULL, r_reason_id CHAR(16) NOT NULL, r_reason_desc VARCHAR(40) ); --向表中插入多条记录。 gaussdb=# INSERT INTO tpcds.reason VALUES (1, 'AAAAAAAABAAAAAAA', 'Xxxxxxxxx'),(2, 'AAAAAAAACAAAAAAA', ' Xxxxxxxxx'),(3, 'AAAAAAAADAAAAAAA', ' Xxxxxxxxx'),(4, 'AAAAAAAAEAAAAAAA', 'Not the product that was ordered'),(5, 'AAAAAAAAFAAAAAAA', 'Parts missing'),(6, 'AAAAAAAAGAAAAAAA', 'Does not work with a product that I have'),(7, 'AAAAAAAAHAAAAAAA', 'Gift exchange'); --开始一个事务。 gaussdb=# START TRANSACTION; --定义一个名为cursor1的游标。 gaussdb=# CURSOR cursor1 FOR SELECT * FROM tpcds.reason; --忽略游标cursor1的前3行。 gaussdb=# MOVE FORWARD 3 FROM cursor1; --抓取游标cursor1的前4行。 gaussdb=# FETCH 4 FROM cursor1; r_reason_sk | r_reason_id | r_reason_desc -------------+------------------+------------------------------------------------------------------------------------------------------ 4 | AAAAAAAAEAAAAAAA | Not the product that was ordered 5 | AAAAAAAAFAAAAAAA | Parts missing 6 | AAAAAAAAGAAAAAAA | Does not work with a product that I have 7 | AAAAAAAAHAAAAAAA | Gift exchange (4 rows) --关闭游标。 gaussdb=# CLOSE cursor1; --结束一个事务。 gaussdb=# END; --删除表。 gaussdb=# DROP TABLE tpcds.reason; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 语法格式 MOVE [ direction [ FROM | IN ] ] cursor_name; 其中direction子句为可选参数。 NEXT | PRIOR | FIRST | LAST | ABSOLUTE count | RELATIVE count | count | ALL | FORWARD | FORWARD count | FORWARD ALL | BACKWARD | BACKWARD count | BACKWARD ALL
  • 参数说明 表1 冲突的锁模式 请求的锁模式/当前锁模式 AC CES S SHARE ROW SHARE ROW EXCLUSIVE SHARE UPDATE EXCLUSIVE SHARE SHARE ROW EXCLUSIVE EXCLUSIVE ACCESS EXCLUSIVE ACCESS SHARE - - - - - - - X ROW SHARE - - - - - - X X ROW EXCLUSIVE - - - - X X X X SHARE UPDATE EXCLUSIVE - - - X X X X X SHARE - - X X - X X X SHARE ROW EXCLUSIVE - - X X X X X X EXCLUSIVE - X X X X X X X ACCESS EXCLUSIVE X X X X X X X X LOCK的参数说明如下所示: name 要锁定的表的名称,可以有模式修饰。 LOCK TABLE命令中声明的表的顺序就是上锁的顺序。 取值范围:已存在的表名。 支持使用DATABASE LINK方式对远端表进行操作,使用方式详情请见DATABASE LINK。 ONLY 如果指定ONLY,只有该表被锁定。如果没有声明,该表和他的所有子表将都被锁定。 ACCESS SHARE 只与ACCESS EXCLUSIVE冲突。 SELECT命令在被引用的表上请求一个这种锁。通常, 任何只读取表而不修改它的命令都请求这种锁模式。 ROW SHARE 与EXCLUSIVE和ACCESS EXCLUSIVE锁模式冲突。 SELECT FOR UPDATE和SELECT FOR SHARE命令会自动在目标表上请求ROW SHARE锁(且所有被引用但不是FOR SHARE/FOR UPDATE的其他表上,还会自动加上ACCESS SHARE锁)。 ROW EXCLUSIVE 与ROW SHARE锁相同,ROW EXCLUSIVE允许并发读取表,但是禁止修改表中数据。UPDATE,DELETE,INSERT命令会自动在目标表上请求这个锁(且所有被引用的其他表上还会自动加上的ACCESS SHARE锁)。通常情况下,所有会修改表数据的命令都会请求表的ROW EXCLUSIVE锁。 SHARE UPDATE EXCLUSIVE 这个模式保护一个表的模式不被并发修改,以及禁止在目标表上执行垃圾回收命令(VACUUM )。 VACUUM(不带FULL选项),ANALYZE,CREATE INDEX CONCURRENTLY命令会自动请求这样的锁。 SHARE SHARE锁允许并发的查询,但是禁止对表进行修改。 CREATE INDEX(不带CONCURRENTLY选项)语句会自动请求这种锁。 SHARE ROW EXCLUSIVE SHARE ROW EXCLUSIVE锁禁止对表进行任何的并发修改,而且是独占锁,因此一个会话中只能获取一次。 任何SQL语句都不会自动请求这个锁模式。 EXCLUSIVE EXCLUSIVE锁允许对目标表进行并发查询,但是禁止任何其他操作。 这个模式只允许并发加ACCESS SHARE锁,也就是说,只有对表的读动作可以和持有这个锁模式的事务并发执行。 任何SQL语句都不会在用户表上自动请求这个锁模式。然而在某些操作的时候,会在某些系统表上请求它。 ACCESS EXCLUSIVE 这个模式保证其所有者(事务)是可以访问该表的唯一事务。 ALTER TABLE,DROP TABLE,TRUNCATE,REINDEX命令会自动请求这种锁。 在LOCK TABLE命令没有明确声明需要的锁模式时,它是缺省锁模式。 NOWAIT 声明LOCK TABLE不去等待任何冲突的锁释放,如果无法立即获取该锁,该命令退出并且发出一个错误信息。 在不指定NOWAIT的情况下获取表级锁时,如果有其他互斥锁存在的话,则等待其他锁的释放。
  • 注意事项 LOCK TABLE只能在一个事务块的内部有用,因为锁在事务结束时就会被释放。出现在任意事务块外面的LOCK TABLE都会报错。 如果没有声明锁模式,缺省为最严格的模式ACCESS EXCLUSIVE。 LOCK TABLE ... IN ACCESS SHARE MODE需要在目标表上有SELECT权限。所有其他形式的LOCK需要UPDATE或DELETE权限。 没有UNLOCK TABLE命令,锁总是在事务结束时释放。 LOCK TABLE只处理表级的锁,因此那些带“ROW”字样的锁模式都是有歧义的。这些模式名称通常可理解为用户试图在一个被锁定的表中获取行级的锁。同样,ROW EXCLUSIVE模式也是一个可共享的表级锁。注意,只要是涉及到LOCK TABLE ,所有锁模式都有相同的语意,区别仅在于规则中锁与锁之间是否冲突,规则请参见表1。 如果没有打开xc_maintenance_mode参数,那么对系统表申请ACCESS EXCLUSIVE级别锁将报错。
  • 功能描述 LOCK TABLE获取表级锁。 GaussDB 在为一个引用了表的命令自动请求锁时,尽可能选择最小限制的锁模式。如果用户需要一种更为严格的锁模式,可以使用LOCK命令。例如,一个应用是在Read Committed隔离级别上运行事务,并且它需要保证表中的数据在事务的运行过程中不被修改。为实现这个目的,则可以在查询之前对表使用SHARE锁模式进行锁定。这样将防止数据不被并发修改,从而保证后续的查询可以读到已提交的持久化的数据。因为SHARE锁模式与任何写操作需要的ROW EXCLUSIVE模式冲突,并且LOCK TABLE name IN SHARE MODE语句将等到所有当前持有ROW EXCLUSIVE模式锁的事务提交或回滚后才能执行。因此,一旦获得该锁,就不会存在未提交的写操作,并且其他操作也只能等到该锁释放之后才能开始。
  • 语法格式 LOCK [ TABLE ] {[ ONLY ] name [, ...]| {name [ * ]} [, ...]} [ IN {ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE} MODE ] [ NOWAIT ];
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( {SELECT | VALUES | INSERT | UPDATE | DELETE} ) – with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 – column_name指定子查询结果集中显示的列名。 – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 – 用户可以使用MATERIALIZED / NOT MATERIALIZED对CTE进行修饰。 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的拷贝,在引用处直接查询该拷贝,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属主干语句中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 INSERT ON DUPLICATE KEY UPDATE不支持WITH及WITH RECURSIVE子句。 INSERT语句的输出,只会显示最外层query block插入的tuple数量。比如: with cte as (insert into t1 values(1) retunring * ) insert into t1 select * from cte; 只会显示插入一条tuple,但实际上插入了两条。 plan_hint子句 以/*+ */的形式在INSERT关键字后,用于对INSERT对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 table_name 要插入数据的目标表名。 取值范围:已存在的表名。 支持使用DATABASE LINK方式对远端表进行操作,使用方式详情请见DATABASE LINK。 partition_clause 指定分区插入操作 PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } | SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } 关键字详见SELECT一节介绍 如果value子句的值和指定分区不一致,会抛出异常。 示例详见CREATE TABLE SUBPARTITION column_name 目标表中的字段名: 字段名可以使用子字段名或者数组下标修饰。 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 目标字段(column_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 value子句和query提供的值在表中从左到右关联到对应列。 取值范围:已存在的字段名。 expression 赋予对应column的一个有效表达式或值: 如果是INSERT ON DUPLICATE KEY UPDATE语句下,expression可以为VALUES(column_name)或EXCLUDED.column_name用来表示引用冲突行对应的column_name字段的值。需注意,其中VALUES(column_name)不支持嵌套在表达式中(例如VALUES(column_name)+1),但EXCLUDED不受此限制。 向表中字段插入单引号 " ' "时需要使用单引号自身进行转义。 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 DEFAULT 对应字段名的缺省值。如果没有缺省值,则为NULL。 query 一个查询语句(SELECT语句),将查询结果作为插入的数据。 RETURNING 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。注意:INSERT ON DUPLICATE KEY UPDATE不支持RETURNING子句。 output_expression INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 取值范围:该表达式可以使用table的任意字段。可以使用*返回被插入行的所有字段。 output_name 字段的输出名称。 取值范围:字符串,符合标识符命名规范。 ON DUPLICATE KEY UPDATE 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新,对于不带唯一约束的表,则仅执行插入。UPDATE时,若指定NOTHING则忽略此条插入,可通过"EXCLUDE." 或者 "VALUES()" 来选择源数据相应的列。 支持触发器,触发器执行顺序由实际执行流程决定: 执行insert: 触发 before insert、 after insert触发器。 执行update:触发before insert、before update、after update触发器。 执行update nothing: 触发before insert触发器。 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 如果插入多行,这些行均与表中同一行数据存在唯一约束冲突,则按照顺序,第一条执行插入或更新,之后依次执行更新。 主键、唯一索引列不允许UPDATE。 不支持外表。 expression不支持使用子查询表达式。
  • 语法格式 [ WITH [ RECURSIVE ] with_query [, ...] ] INSERT [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] { DEFAULT VALUES | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | query } [ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] }] [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ];
  • 注意事项 只有拥有表INSERT权限的用户,才可以向表中插入数据。用户被授予INSERT ANY TABLE权限,相当于用户对除系统模式之外的任何模式具有USAGE权限,并且拥有这些模式下表的INSERT权限。 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 如果使用ON DUPLICATE KEY UPDATE,用户必须要有该表的INSERT、UPDATE权限,UPDATE子句中列的SELECT权限。 如果使用query子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 生成列不能被直接写入。在INSERT命令中不能为生成列指定值,但是可以指定关键字DEFAULT。 当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的INSERT语句中(不包含外表的场景下),对目标表中CHAR和VARCHAR类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。
  • 参数说明 GRANT的权限分类如下所示。 SELECT 允许对指定的表、视图、序列执行SELECT命令,UPDATE或DELETE时也需要对应字段上的SELECT权限。 INSERT 允许对指定的表执行INSERT命令。 UPDATE 允许对声明的表中任意字段执行UPDATE命令,UPDATE命令也需要SELECT权限来查询出哪些行需要更新。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限。 DELETE 允许执行DELETE命令删除指定表中的数据,DELETE命令也需要SELECT权限来查询出哪些行需要删除。 TRUNCATE 允许执行TRUNCATE语句删除指定表中的所有记录。 REFERENCES 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限。 TRIGGER 允许在指定的表上创建触发器。 CREATE 对于数据库,允许在数据库里创建新的模式。 对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限。 对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。 CONNECT 允许用户连接到指定的数据库。 EXECUTE 允许使用指定的函数,以及利用这些函数实现的操作符。 USAGE 对于过程语言,允许用户在创建函数的时候指定过程语言。 对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名称。 对于序列,USAGE允许使用nextval函数。 ALTER 允许用户修改指定对象的属性,但不包括修改对象的所有者和修改对象所在的模式。 DROP 允许用户删除指定的对象。 COMMENT 允许用户定义或修改指定对象的注释。 INDEX 允许用户在指定表上创建索引,并管理指定表上的索引,还允许用户对指定表执行REINDEX和CLUSTER操作。 VACUUM 允许用户对指定的表执行ANALYZE和VACUUM操作。 ALL PRIVILEGES 一次性给指定用户/角色赋予所有可赋予的权限。只有系统管理员有权执行GRANT ALL PRIVILEGES。 GRANT的参数说明如下所示。 role_name 已存在用户名称。 table_name 已存在表名称。 column_name 已存在字段名称。 schema_name 已存在模式名称。 database_name 已存在数据库名称。 function_name 已存在函数名称。 procedure_name 已存在存储过程名称。 sequence_name 已存在序列名称。 domain_name 已存在域类型名称。 fdw_name 已存在外部数据包名称。 lang_name 已存在语言名称。 type_name 已存在类型名称。 argmode 参数模式。 取值范围:字符串,要符合标识符命名规范。 arg_name 参数名称。 取值范围:字符串,要符合标识符命名规范。 arg_type 参数类型。 取值范围:字符串,要符合标识符命名规范。 loid 包含本页的大对象的标识符。 取值范围:字符串,要符合标识符命名规范。 tablespace_name 表空间名称。 client_master_key 客户端加密主密钥的名称。 取值范围:字符串,要符合标识符命名规范。 column_encryption_key 列加密密钥的名称。 取值范围:字符串,要符合标识符命名规范。 directory_name 目录名称。 取值范围:字符串,要符合标识符命名规范。 WITH GRANT OPTION 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。 非对象所有者给其他用户授予对象权限时,命令按照以下规则执行: 如果用户没有该对象上指定的权限,命令立即失败。 如果用户有该对象上的部分权限,则GRANT命令只授予他有授权选项的权限。 如果用户没有可用的授权选项,GRANT ALL PRIVILEGES形式将发出一个警告信息,其他命令形式将发出在命令中提到的且没有授权选项的相关警告信息。 数据库系统管理员可以访问所有对象,而不会受对象的权限设置影响。这个特点类似Unix系统的root的权限。和root一样,除了必要的情况外,建议不要总是以系统管理员身份进行操作。
  • 语法格式 将表或视图的访问权限赋予指定的用户或角色。 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将表中字段的访问权限赋予指定的用户或角色。 GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将序列的访问权限赋予指定的用户或角色,LARGE字段属性可选,赋权语句不区分序列是否为LARGE。 GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { [ [ LARGE ] SEQUENCE ] sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将数据库的访问权限赋予指定的用户或角色。 GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将域的访问权限赋予指定的用户或角色。 GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持赋予域的访问权限。 将客户端加密主密钥CMK的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON CLIENT_MASTER_KEY client_master_key [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将列加密密钥CEK的访问权限赋予指定的用户或角色。 1 2 3 4 GRANT { { USAGE | DROP } [, ...] | ALL [ PRIVILEGES ] } ON COLUMN_ENCRYPTION_KEY column_encryption_key [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部数据源的访问权限赋予给指定的用户或角色。 GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将外部服务器的访问权限赋予给指定的用户或角色。 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将函数的访问权限赋予给指定的用户或角色。 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将存储过程的访问权限赋予给指定的用户或角色。 1 2 3 4 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将过程语言的访问权限赋予给指定的用户或角色。 GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将大对象的访问权限赋予指定的用户或角色。 GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持大对象。 将模式的访问权限赋予指定的用户或角色。 GRANT { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将模式中的表或者视图对象授权给其他用户时,需要将表或视图所属的模式的USAGE权限同时授予该用户,若没有该权限,则只能看到这些对象的名称,并不能实际进行对象访问。 同名模式下创建表的权限无法通过此语法赋予,可以通过将角色的权限赋予其他用户或角色的语法,赋予同名模式下创建表的权限。 将表空间的访问权限赋予指定的用户或角色。 GRANT { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 将类型的访问权限赋予指定的用户或角色。 GRANT { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]; 本版本暂时不支持赋予类型的访问权限。 将directory对象的权限赋予指定的角色。 1 2 3 4 GRANT { { READ | WRITE | ALTER | DROP } [, ...] | ALL [PRIVILEGES] } ON DIRECTORY directory_name [, ...] TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将package对象的权限赋予指定的角色。 1 2 3 4 5 GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] } ON { PACKAGE package_name [, ...] | ALL PACKAGES IN SCHEMA schema_name [, ...] } TO { [GROUP] role_name | PUBLIC } [, ...] [WITH GRANT OPTION]; 将角色的权限赋予其他用户或角色的语法。 GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]; 将sysadmin权限赋予指定的角色。 GRANT ALL { PRIVILEGES | PRIVILEGE } TO role_name;
  • 功能描述 对角色和用户进行授权操作。 使用GRANT命令进行用户授权包括以下场景: 将系统权限授权给角色或用户 系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN、INHERIT、REPLICATION、VCADMIN和 LOG IN等。 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 将数据库对象授权给角色或用户 将数据库对象(表、视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户; GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。 关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。 如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC,这是GaussDB特有的属性。 GaussDB会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。另外可参考安全加固指南的权限控制章节,对PUBLIC用户组的权限进行限制。这些初始的默认权限可以使用ALTER DEFAULT PRIVILEGES命令修改。 对象的所有者缺省具有该对象上的所有权限,出于安全考虑所有者可以舍弃部分权限,但ALTER、DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限属于所有者固有的权限,隐式拥有。 将角色或用户的权限授权给其他角色或用户 将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。 当声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。 数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。 将ANY权限授予给角色或用户 将ANY权限授予特定的角色和用户,ANY权限的取值范围参见语法格式。当声明了WITH ADMIN OPTION,被授权的用户可以将该ANY权限再次授予其他角色/用户,或从其他角色/用户处回收该ANY权限。ANY权限可以通过角色被继承,但不能赋予PUBLIC。初始用户和三权分立关闭时的系统管理员用户可以给任何角色/用户授予或撤销ANY权限。 目前支持以下ANY权限:CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、SELECT ANY TABLE、INSERT ANY TABLE、UPDATE ANY TABLE、DELETE ANY TABLE、CREATE ANY SEQUENCE、CREATE ANY INDEX、CREATE ANY FUNCTION、EXECUTE ANY FUNCTION、 CREATE ANY PACKAGE、EXECUTE ANY PACKAGE、CREATE ANY TYPE、ALTER ANY TYPE、DROP ANY TYPE、ALTER ANY SEQUENCE、DROP ANY SEQUENCE、SELECT ANY SEQUENCE、ALTER ANY INDEX、DROP ANY INDEX、CREATE ANY SYNONYM、DROP ANY SYNONYM、CREATE ANY TRIGGER、ALTER ANY TRIGGER、DROP ANY TRIGGER。详细的ANY权限范围描述参考表1
  • 注意事项 不允许将ANY权限授予PUBLIC,也不允许从PUBLIC回收ANY权限。 ANY权限属于数据库内的权限,只对授予该权限的数据库内的对象有效,例如SELECT ANY TABLE只允许用户查看当前数据库内的所有用户表数据,对其他数据库内的用户表无查看权限。 ANY权限与原有的权限相互无影响。 如果用户被授予CREATE ANY TABLE权限,在同名schema下创建表的属主是该schema的属主,用户对表进行其他操作时,需要授予相应的操作权限。与此类似的还有CREATE ANY FUNCTION、CREATE ANY PACKAGE、CREATE ANY TYPE、CREATE ANY SEQUENCE和CREATE ANY INDEX,在同名模式下创建的对象的属主是同名模式的属主;而对于CREATE ANY TRIGGER和CREATE ANY SYNONYM,在同名模式下创建的对象的属主为创建者。 需要谨慎授予用户CREATE ANY FUNCTION或CREATE ANY PACKAGE的权限,以免其他用户利用DEFINER类型的函数或PACKAGE进行权限提升。 通过GRANT授予用于使用表的权限时,如果用户使用不当,可能通过ALTER语法在表的默认值、约束增加表达式,通过创建索引在INDEX上增加表达式等操作,导致权限被利用的风险。 通过GRANT授予用户使用TRIGGER的权限时,如果用户使用不当,可能通过WHEN条件创建表达式,当触发器被触发时,存在权限被利用的风险。 给用户赋权时,需要特别注意定义者函数/PACKAGE,定义者函数/PACKAGE会使用函数/PACKAGE的owner权限执行,若赋权不当(包括GRANT ROLE TO ROLE),则存在权限被利用风险。
  • 示例 --创建一个schema。 gaussdb=# CREATE SCHEMA tpcds; --创建表tpcds.customer_address。 gaussdb=# CREATE TABLE tpcds.customer_address ( ca_address_sk INTEGER NOT NULL, ca_address_id CHARACTER(16) NOT NULL, ca_street_number INTEGER , ca_street_name CHARACTER (20) ); --向表中插入多条记录。 gaussdb=# INSERT INTO tpcds.customer_address VALUES (1, 'AAAAAAAABAAAAAAA', '18', 'Jackson'),(2, 'AAAAAAAACAAAAAAA', '362', 'Washington 6th'),(3, 'AAAAAAAADAAAAAAA', '585', 'Dogwood Washington'); --SELECT语句,用一个游标读取一个表。开始一个事务。 gaussdb=# START TRANSACTION; --建立一个名为cursor1的游标。 gaussdb=# CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1; --抓取头3行到游标cursor1里。 gaussdb=# FETCH FORWARD 3 FROM cursor1; ca_address_sk | ca_address_id | ca_street_number | ca_street_name ---------------+------------------+------------------+-------------------- 1 | AAAAAAAABAAAAAAA | 18 | Jackson 2 | AAAAAAAACAAAAAAA | 362 | Washington 6th 3 | AAAAAAAADAAAAAAA | 585 | Dogwood Washington (3 rows) --关闭游标并提交事务。 gaussdb=# CLOSE cursor1; --结束一个事务。 gaussdb=# END; --VALUES子句,用一个游标读取VALUES子句中的内容。开始一个事务。 gaussdb=# START TRANSACTION; --建立一个名为cursor2的游标。 gaussdb=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1; --抓取头2行到游标cursor2里。 gaussdb=# FETCH FORWARD 2 FROM cursor2; column1 | column2 ---------+--------- 0 | 3 1 | 2 (2 rows) --关闭游标并提交事务。 gaussdb=# CLOSE cursor2; --结束一个事务。 gaussdb=# END; --WITH HOLD游标的使用,开启事务。 gaussdb=# START TRANSACTION; --创建一个with hold游标。 gaussdb=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM tpcds.customer_address ORDER BY 1; --抓取头2行到游标cursor1里。 gaussdb=# FETCH FORWARD 2 FROM cursor1; ca_address_sk | ca_address_id | ca_street_number | ca_street_name ---------------+------------------+------------------+-------------------- 1 | AAAAAAAABAAAAAAA | 18 | Jackson 2 | AAAAAAAACAAAAAAA | 362 | Washington 6th (2 rows) --结束事务。 gaussdb=# END; --抓取下一行到游标cursor1里。 gaussdb=# FETCH FORWARD 1 FROM cursor1; ca_address_sk | ca_address_id | ca_street_number | ca_street_name ---------------+------------------+------------------+-------------------- 3 | AAAAAAAADAAAAAAA | 585 | Dogwood Washington (1 row) --关闭游标。 gaussdb=# CLOSE cursor1; --删除表tpcds.customer_address。 gaussdb=# DROP TABLE tpcds.customer_address; --删除SCHEMA。 gaussdb=# DROP SCHEMA tpcds CASCADE;
  • 参数说明 direction 定义抓取数据的方向。 取值范围: NEXT(缺省值) 从当前关联位置开始,抓取下一行。 PRIOR 从当前关联位置开始,抓取上一行。 FIRST 抓取查询的第一行(和ABSOLUTE 1相同)。 LAST 抓取查询的最后一行(和ABSOLUTE -1相同)。 ABSOLUTE count 抓取查询中第count行。 ABSOLUTE抓取不会比用相对位移移动到需要的数据行更快,因为下层的实现必须遍历所有中间的行。 count取值范围:有符号的整数 count为正数,就从查询结果的第一行开始,抓取第count行。 count为负数,就从查询结果末尾抓取第abs(count)行。 count为0时,定位在第一行之前。 RELATIVE count 从当前关联位置开始,抓取随后或前面的第count行。 取值范围:有符号的整数 count为正数就抓取当前关联位置之后的第count行。 count为负数就抓取当前关联位置之前的第abs(count)行。 如果当前行没有数据的话,RELATIVE 0返回空。 count 抓取随后的count行(和FORWARD count一样)。 ALL 从当前关联位置开始,抓取所有剩余的行(和FORWARD ALL一样)。 FORWARD 抓取下一行(和NEXT一样)。 FORWARD count 从当前关联位置开始,抓取随后或前面的count行。 FORWARD ALL 从当前关联位置开始,抓取所有剩余行。 BACKWARD 从当前关联位置开始,抓取前面一行(和PRIOR一样) 。 BACKWARD count 从当前关联位置开始,抓取前面的count行(向后扫描)。 取值范围:有符号的整数 count为正数就抓取当前关联位置之前的count行。 count为负数就抓取当前关联位置之后的abs(count)行。 如果有数据的话,BACKWARD 0重新抓取当前行。 BACKWARD ALL 从当前关联位置开始,抓取所有前面的行(向后扫描) 。 { FROM | IN } cursor_name 使用关键字FROM或IN指定游标名称。 取值范围:已创建的游标的名称。
  • 注意事项 如果游标定义了NO SCROLL,则不允许使用例如FETCH BACKWARD之类的反向抓取。 NEXT,PRIOR,FIRST,LAST,ABSOLUTE,RELATIVE形式在恰当地移动游标之后抓取一条记录。如果后面没有数据行,就返回一个空的结果,此时游标就会停在查询结果的最后一行之后(向后查询时)或者第一行之前(向前查询时)。 FORWARD和BACKWARD形式在向前或者向后移动的过程中抓取指定的行数,然后把游标定位在最后返回的行上;或者,如果count大于可用的行数,则在所有行之后(向后查询时)或者之前(向前查询时)。 RELATIVE 0,FORWARD 0,BACKWARD 0都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚抓取过的行。除非游标定位在第一行之前或者最后一行之后,否则这个动作都应该成功。而当游标定位在第一行之前或者最后一行之后,不返回任何行。
  • 语法格式 FETCH [ direction { FROM | IN } ] cursor_name; 其中direction子句为可选参数。 NEXT | PRIOR | FIRST | LAST | ABSOLUTE count | RELATIVE count | count | ALL | FORWARD | FORWARD count | FORWARD ALL | BACKWARD | BACKWARD count | BACKWARD ALL
  • 功能描述 FETCH通过已创建的游标来检索数据。 每个游标都有一个供FETCH使用的关联位置。游标的关联位置可以在查询结果的第一行之前,或者在结果中的任意行,或者在结果的最后一行之后: 游标刚创建完之后,关联位置在第一行之前。 在抓取了一些移动行之后,关联位置在检索到的最后一行上。 如果FETCH抓取完了所有可用行,它就停在最后一行后面,或者在反向抓取的情况下是停在第一行前面。 FETCH ALL或FETCH BACKWARD ALL总是把游标的关联位置放在最后一行或者在第一行前面。
  • 参数说明 EXPLAIN PLAN 其中的PLAN选项表示需要将计划信息存储于PLAN_TABLE中,存储成功将返回“EXPLAIN SUCCESS”。 STATEMENT_ID 用户可通过STATEMENT_ID对查询设置标签,输入的标签信息也将存储于PLAN_TABLE中。 name 查询标签。 取值范围:字符串 用户在执行EXPLAIN PLAN时,如果没有设置STATEMENT_ID,则默认为空值。同时,用户可输入的STATEMENT_ID最大长度为30个字节,超过长度将会产生报错。
  • 功能描述 显示SQL语句的执行计划。 执行计划将显示SQL语句所引用的表会采用什么样的扫描方式,如:简单的顺序扫描、索引扫描等。如果引用了多个表,执行计划还会显示用到的JOIN算法。 执行计划的最关键的部分是语句的预计执行开销,是指计划生成器估算执行该语句将花费多长的时间。 若指定了ANALYZE选项,则该语句会被执行,然后根据实际的运行结果显示统计数据,包括每个计划节点内时间总开销(毫秒为单位)和实际返回的总行数。这对于判断计划生成器的估计值是否接近实际非常有用。
  • 参数说明 statement 指定要分析的SQL语句。 ANALYZE boolean | ANALYSE boolean 显示实际运行时间和其他统计数据。当两个参数同时使用时,在option中排在后面的一个生效。 取值范围: TRUE(缺省值):显示实际运行时间和其他统计数据。 FALSE:不显示。 VERBOSE boolean 显示有关计划的额外信息。 取值范围: TRUE(缺省值):显示额外信息。 FALSE:不显示。 COSTS boolean 包括每个规划节点的估计总成本,以及估计的行数和每行的宽度。 取值范围: TRUE(缺省值):显示估计总成本和宽度。 FALSE:不显示。 CPU boolean 打印CPU的使用情况的信息。 取值范围: TRUE(缺省值):显示CPU的使用情况。 FALSE:不显示。 DETAIL boolean 打印数据库节点上的信息。 取值范围: TRUE(缺省值):打印数据库节点的信息。 FALSE:不打印。 BUFFERS boolean 包括缓冲区的使用情况的信息。需要结合ANALYZE或ANALYSE选项一起使用。 取值范围: TRUE:显示缓冲区的使用情况。 FALSE(缺省值):不显示。 TIMING boolean 包括实际的启动时间和花费在输出节点上的时间信息。需要结合ANALYZE或ANALYSE选项一起使用。 取值范围: TRUE(缺省值):显示启动时间和花费在输出节点上的时间信息。 FALSE:不显示。 PLAN boolean 是否将执行计划存储在PLAN_TABLE中。当该选项开启时,会将执行计划存储在PLAN_TABLE中,不打印到当前屏幕,因此该选项为on时,不能与其他选项同时使用。 取值范围: ON(缺省值):将执行计划存储在plan_table中,不打印到当前屏幕。执行成功返回EXPLAIN SUCCESS。 OFF:不存储执行计划,将执行计划打印到当前屏幕。 BLOCKNAME boolean 是否显示计划的每个操作所处于的查询块。当该选项开启时,会将每个操作所处于的查询块的名字输出在Query Block列上,方便用户获取查询块名字,并使用Hint修改执行计划: TRUE(缺省值):显示计划时,将每个操作所处于的查询块的名字输出在新增列Query Block列上。该选项需要在pretty 模式下使用。见指定Hint所处于的查询块Queryblock。 FALSE:不对计划显示产生影响。 FORMAT 指定输出格式。 取值范围:TEXT,XML,JSON和YAML。 默认值:TEXT。 PERFORMANCE 使用此选项时,即打印执行中的所有相关信息。下述为部分信息描述: ex c/r:代表平均每行使用cpu周期数,等于(ex cyc)/(ex row)。 ex row:执行行数。 ex cyc:代表使用的cpu周期数。 inc cyc:代表包含子节点使用的总cpu周期数。 shared hit:代表算子的share buffer命中情况。 loops:算子循环执行次数。 total_calls:生成元素总数。 remote query poll time stream gather:算子用于侦听各DN数据到达CN的网络poll时间。 deserialize time:反序列化所需时间。 estimated time:估计时间。 OPTEVAL boolean 是否显示SCAN算子(当前仅支持seqscan、indexscan、indexonlyscan、bitmapheapscan)的代价淘汰明细,当开启此开关的时候,会在执行计划中显示一个名字为Cost Evaluation Info (identified by plan id)的计划块,该选项仅仅可以和costs、verbose、format三个选项共存。此计划块中的具体参数明细,请参考示例2。 取值范围: TRUE:显示SCAN算子的代价淘汰明细。 FALSE(缺省值):不显示。
共100000条