华为云用户手册

  • 参数说明 configuration_parameter 运行时参数的名称。 取值范围:可以使用SHOW ALL命令查看运行时参数。 部分通过SHOW ALL查看的参数不能通过SET设置,如max_datanodes。 CURRENT_SCHEMA 当前模式。 TIME ZONE 时区。 TRANSACTION ISOLATION LEVEL 事务的隔离级别。 SESSION AUTHORIZATION 当前会话的用户标识符。 ALL 所有运行时参数。
  • 优化建议 create index 约束限制: 普通表的索引支持最大列数为32列;分区表的GLOBAL索引支持最大列数为31列。 单个索引大小不能超过索引页面大小(8k),其中B-tree、UBtree索引不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 分区表创建GLOBAL索引时,存在以下约束条件: 不支持表达式索引、部分索引。 仅支持Btree索引。 在相同属性列上,分区LOCAL索引与GLOBAL索引不能共存。 如果ALTER语句不带有UPDATE GLOBAL INDEX,那么原有的GLOBAL索引将失效,查询时将使用其他索引进行查询;如果ALTER语句带有UPDATE GLOBAL INDEX,原有的GLOBAL索引仍然有效,并且索引功能正确。
  • 示例 普通索引 --创建tbl_test1表。gaussdb=# CREATE TABLE tbl_test1( id int, --用户id name varchar(50), --用户姓名 postcode char(6) --邮编);--创建表空间tbs_index1。gaussdb=# CREATE TABLESPACE tbs_index1 RELATIVE LOCATION 'test_tablespace/tbs_index1';--为表tbl_test1创建索引idx_test1指定表空间。gaussdb=# CREATE INDEX idx_test1 ON tbl_test1(name) TABLESPACE tbs_index1;--查询索引idx_test1信息。gaussdb=# SELECT indexname,tablename,tablespace FROM pg_indexes WHERE indexname = 'idx_test1'; indexname | tablename | tablespace -----------+-----------+------------ idx_test1 | tbl_test1 | tbs_index1(1 row)--删除索引。gaussdb=# DROP INDEX idx_test1;--删除表空间。gaussdb=# DROP TABLESPACE tbs_index1; 唯一索引 --为表tbl_test1创建唯一索引idx_test2。gaussdb=# CREATE UNIQUE INDEX idx_test2 ON tbl_test1(id);--查询索引信息。gaussdb=# \d tbl_test1 Table "public.tbl_test1" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | name | character varying(50) | postcode | character(6) | Indexes: "idx_test2" UNIQUE, btree (id) TABLESPACE pg_default--删除索引。gaussdb=# DROP INDEX idx_test2; 表达式索引 --为表tbl_test1创建一个表达式索引。gaussdb=# CREATE INDEX idx_test3 ON tbl_test1(substr(postcode,2));--查询索引信息。gaussdb=# \d tbl_test1 Table "public.tbl_test1" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | name | character varying(50) | postcode | character(7) | Indexes: "idx_test3" btree (substr(postcode::text, 2)) TABLESPACE pg_default--删除索引。gaussdb=# DROP INDEX idx_test3; 部分索引 --为表tbl_test1中id不为为空的数据建立索引。gaussdb=# CREATE INDEX idx_test4 ON tbl_test1(id) WHERE id IS NOT NULL;--删除索引。gaussdb=# DROP INDEX idx_test4;--删除表。gaussdb=# DROP TABLE tbl_test1; 分区索引 --建表。gaussdb=# CREATE TABLE student(id int, name varchar(20)) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION pmax VALUES LESS THAN (MAXVALUE));--创建LOCAL分区索引不指定索引分区的名称。gaussdb=# CREATE INDEX idx_student1 ON student(id) LOCAL;--查看索引分区信息,LOCAL索引分区数和表的分区数一致。gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student1'::regclass; relname ------------- p1_id_idx pmax_id_idx(2 rows)--删除LOCAL分区索引。gaussdb=# DROP INDEX idx_student1;--创建GLOBAL索引。gaussdb=# CREATE INDEX idx_student2 ON student(name) GLOBAL;--查看索引分区信息,GLOBAL索引分区数和表的分区数不一致。gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student2'::regclass; relname ---------(0 rows)--删除GLOBAL分区索引。gaussdb=# DROP INDEX idx_student2; --创建LOCAL表达式索引,不指定索引分区的名称。gaussdb=# CREATE INDEX idx_student3 ON student(lower(name)) LOCAL;--查看索引分区信息,LOCAL索引分区数和表的分区数一致。gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student3'::regclass; relname ------------- p1_id_idx pmax_id_idx(2 rows)--删除LOCAL分区表达式索引。gaussdb=# DROP INDEX idx_student3;--创建GLOBAL表达式索引。gaussdb=# CREATE INDEX idx_student4 ON student(lower(name)) GLOBAL;--查看索引分区信息,GLOBAL表达式索引分区数和表的分区数不一致。gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student4'::regclass; relname ---------(0 rows)--删除GLOBAL分区表达式索引。gaussdb=# DROP INDEX idx_student4;--删除表。gaussdb=# DROP TABLE student;
  • 语法格式 在表上创建索引。 12345678 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ IF NOT EXISTS ] [ [schema_name.] index_name ] ON table_name [ USING method ] ({ { column_name [ ( length ) ] | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ INCLUDE ( column_name [, ...] ) ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] { [ COMMENT 'string' ] [ ... ] } [ { VISIBLE | INVISIBLE } ] [ WHERE predicate ]; 在分区表上创建索引。 1 2 3 4 5 6 7 8 910111213 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schema_name.] index_name ] ON table_name [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ LOCAL [ ( { PARTITION index_partition_name [ FOR { partition_name | ( partition_value [, ...] ) } ] [ TABLESPACE index_partition_tablespace ] [ ( [SUBPARTITION index_subpartition_name] [ FOR { partition_name | ( partition_value [, ...] ) } ] [ TABLESPACE index_partition_tablespace ] [, ...] ) ] [, ...] } ) ] | GLOBAL ] [ INCLUDE ( column_name [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] { [ COMMENT 'string' ] [ ... ] } [ { VISIBLE | INVISIBLE } ];
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如:select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如当索引带GLOBAL/LOCAL关键字或者创建索引为GLOBAL索引时不支持创建部分索引。需要注意分区表上创建索引会根据如下规则进行判断:如果创建索引时申明了GLOBAL/LOCAL关键字,则创建对应类型的索引;如果创建索引指定分区名,则创建LOCAL索引;如果是unique索引,索引需包含分区键,此时创建LOCAL索引;否则默认创建GLOBAL索引。
  • 注意事项 基表为HASH分布时,若创建不包含基表分布键的主键或唯一索引,需要使用全局二级索引(CREATE GLOBAL INDEX),若创建包含基表分布键的主键或唯一索引,需要使用普通索引(CREATE INDEX),单DN部署形式下,使用全局二级索引或者普通索引均可创建成功;当基表为除HASH分布以外的其他分布形式时,主键或唯一索引只能使用普通索引(CREATE INDEX),即索引键必须包含基表分布键。 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 分区表索引分为LOCAL索引与GLOBAL索引,LOCAL索引与某个具体分区绑定,而GLOBAL索引则对应整个分区表。 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。 禁止其他用户在初始用户的表上创建包含用户自定义函数的表达式索引。 如果基表是HASH/RANGE/LIST分布,则创建唯一索引时必须包含基表的分布键,且不能含有表达式。 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。 不支持XML类型数据作为普通索引、UNIQUE索引、GLOBAL索引、LOCAL索引、部分索引。 在线创建索引的类型只支持btree索引和ubtree索引。索引创建形式只支持非分区表普通索引及分区表GLOBAL索引、LOCAL索引,不支持PCR ubtree索引、二级分区与GSI。在线并行创建索引只支持Astore及Ustore的普通索引、GLOBAL索引、LOCAL索引。 CREATE INDEX创建索引可能会改变表的访问方式从而导致查询执行计划改变。 当创建索引的SQL语句过长(长度大于等于5250字符)时,会上报一条WARNING,建议缩短创建索引语句的长度。 创建索引的SQL语句过长时,可能会在备份恢复索引时发生失败。由于备份恢复创建索引语句由gs_dump导出,gs_dump在导出索引定义时会对函数名、条件、列名进行添加引号、括号和列的类型的操作,原SQL语句会变得更长,进而导致该语句对应的pg_index元组不能存到一个页面上,造成创建索引失败。
  • 示例 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233 --开启事务。gaussdb=# START TRANSACTION;--设置保存点my_savepoint。gaussdb=# SAVEPOINT my_savepoint;--回滚至保存点my_savepoint。gaussdb=# ROLLBACK TO SAVEPOINT my_savepoint;--游标位置不受保存点回滚的影响。gaussdb=# DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;--设置保存点foo。gaussdb=# SAVEPOINT foo;--读取一条数据,为第一条数据。gaussdb=# FETCH 1 FROM foo; ?column? ---------- 1--回滚至保存点foo。gaussdb=# ROLLBACK TO SAVEPOINT foo;--读取一条数据,为第二条数据。gaussdb=# FETCH 1 FROM foo; ?column? ---------- 2--释放保存点。gaussdb=# RELEASE SAVEPOINT my_savepoint;--结束事务。gaussdb=# COMMIT;
  • 注意事项 不能回滚到一个未定义的保存点,语法上会报错。 在保存点方面,游标有一些非事务性的行为。任何在保存点里打开的游标都会在回滚掉这个保存点之后关闭。如果一个前面打开了的游标在保存点里面,并且游标被一个FETCH命令影响,而这个保存点稍后回滚了,那么这个游标的位置仍然在FETCH让它指向的位置(也就是FETCH不会被回滚)。关闭一个游标的行为也不会被回滚给撤消掉。如果一个游标的操作导致事务回滚,那么这个游标就会置于不可执行状态,所以,尽管一个事务可以用ROLLBACK TO SAVEPOINT重新恢复,但是游标不能再使用了。 使用ROLLBACK TO SAVEPOINT回滚到一个保存点。使用RELEASE SAVEPOINT删除一个保存点,但是保留该保存点建立后执行的命令的效果。
  • 语法格式 重建普通索引。 1 REINDEX { INDEX | [INTERNAL] TABLE | DATABASE | SYSTEM } [ CONCURRENTLY ] name [ FORCE ]; 重建索引并进行类型转换。 1 REINDEX [ ( option [, ...] ) ] { INDEX } [ CONCURRENTLY ] name [ FORCE ]; 重建索引分区。 12 REINDEX { INDEX | [INTERNAL] TABLE } name PARTITION partition_name [ FORCE ];
  • 参数说明 INDEX 重新建立指定的索引。 TABLE 重新建立指定表的所有索引,如果表有从属的“TOAST”表,则这个表也会重建索引。如果表上有索引已经被alter unusable失效,则这个索引无法被重新创建。当指定CONCURRENTLY选项时,暂不支持重建从属“TOAST”表上的索引。 DATABASE 重建当前数据库里的所有索引。当指定CONCURRENTLY选项时,暂不支持重建数据库中表的从属“TOAST”表上的索引。 SYSTEM 在当前数据库上重建所有系统表上的索引。不会处理在用户表上的索引。 option 当前仅支持CROSSBUCKET一种option,且值只能为ON或OFF,用来控制hash bucket表的索引是否在REINDEX过程中转换为跨bucket索引(cross-bucket-index,CBI)或bucket本地索引(local-bucket-index,LBI)索引。此项转换仅支持分布式hash bucket表的索引,不支持GSI索引,当前版本仅标记了扩容流程的Session可以使用在线索引类型转换。 CONCURRENTLY 以不阻塞DML的方式重建索引(加ShareUpdateExclusiveLock锁)。重建索引时,一般会阻塞其他语句对该索引所依赖表的访问。指定此关键字,可以实现重建过程中不阻塞DML。不支持在线重建系统表上的索引。不支持REINDEX INTERNAL TABLE CONCURRENTLY和REINDEX SYSTEM CONCURRENTLY,不支持REINDEX INVALID INDEX CONCURRENTLY。当执行REINDEX DATABASE CONCURRENTLY时,在线重建当前数据库中用户表上的所有索引(不会处理系统表上的索引)。REINDEX CONCURRENTLY不可以在事务内执行。在线重建索引只支持B-tree索引和UB-tree索引,只支持普通索引、GLOBAL索引、LOCAL索引,不支持PCR ubtree索引,不支持二级分区。GSI支持通过REINDEX INDEX CONCURRENTLY在线重建,但不支持在线重建表达式GSI、部分GSI。GSI在线重建期间,应尽量避免与其他DDL并发执行,可能会出现死锁、报错等,可以重新连接客户端进行重试。在线并行重建索引只支持Astore及Ustore的普通索引、GLOBAL索引、LOCAL索引、Ustore的GSI,其他继承当前版本在线重建索引规格约束。如果在线重建索引失败,对于用户手动取消、唯一索引键值重复、资源不足、启动线程失败、锁超时等场景,为避免占用资源,系统会自动清理新索引,在系统无法自动清理失败新索引的情况下(比如数据库宕机、FATAL、PANIC),需要尽快手动清除(使用DROP INDEX语句)非法新索引及(使用DROP TABLE语句)临时表,以防占用更多资源。一般来说,非法的新索引的后缀名为_ccnew,对于GSI(全局二级索引),非法的新索引前缀为ccgsi_tmp_index_。分布式中只有data node节点会自动清理失败索引,coordinator node节点的失败索引需要手动清理。严重错误场景会导致分布式部分节点中找不到失败索引的元信息,DROP INDEX语句无法删除这些索引,需要用DROP INDEX IF EXISTS删除。REINDEX INDEX CONCURRENTLY对表加4级会话锁,且其前几个阶段与CREATE INDEX CONCURRENTLY相似,因此也可能产生卡住或死锁的问题,具体场景与CREATE INDEX CONCURRENTLY相似(比如两个会话同时对同一个索引或表进行REINDEX CONCURRENTLY操作,会引发死锁问题),详见CONCURRENTLY章节。 重建索引时指定此关键字,Astore需要执行先后两次对全表的扫描来完成build,第一次扫描时创建新索引,不阻塞读写操作,第二次扫描时合并更新第一次扫描到目前为止发生的变更;Ustore需完成一次全表扫描,在扫描过程中并发DML产生的数据会被插入到以“index_oid_cctmp”命名的临时表中,扫描结束后合并临时表到以“_ccnew{n}”为后缀名(对于全局二级索引,以“ccgsi_tmp_index_”为前缀名)的新索引中并删除临时表,交换新旧索引,旧索引标记为死亡,启用新索引,重建索引完成。 name 需要重建索引的索引、表、数据库的名称。表和索引可以有模式修饰。 REINDEX DATABASE和SYSTEM只能重建当前数据库的索引,所以name必须和当前数据库名称相同。 FORCE 废弃选项,仅为保持前向兼容,故继续保留。 partition_name 需要重建索引的索引的名称或者表的名称。 取值范围: 如果前面是REINDEX INDEX,则这里应该指定索引的名称; 如果前面是REINDEX TABLE,则这里应该指定表的名称; REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。 REINDEX、REINDEX CONCURRENTLY不支持单独操作toast表或toast索引。
  • 示例 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940 --创建表tbl_test,并插入数据。gaussdb=# CREATE TABLE tbl_test(c1 int,c2 varchar);gaussdb=# INSERT INTO tbl_test VALUES (1, 'AAAAAAA'),(5, 'AAAAAAB'),(10, 'AAAAAAC');--创建索引,并查看索引大小gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(c1);gaussdb=# SELECT pg_size_pretty(pg_total_relation_size('idx_test_c1')) AS size; size -------- 176 kB(1 row)--插入一万条数据,然后删除数据,发现索引变大。gaussdb=# INSERT INTO tbl_test VALUES (generate_series(1,10000),'test');gaussdb=# DELETE FROM tbl_test WHERE c2 = 'test';gaussdb=# SELECT pg_size_pretty(pg_total_relation_size('idx_test_c1')) AS size; size -------- 504 kB(1 row)--重建一个单独索引之后,查看索引信息索引大小变回初始大小。gaussdb=# REINDEX INDEX idx_test_c1;gaussdb=# SELECT pg_size_pretty(pg_total_relation_size('idx_test_c1')) AS size; size -------- 176 kB(1 row)--在线重建一个单独索引。gaussdb=# REINDEX INDEX CONCURRENTLY idx_test_c1;--重建表tbl_test上的所有索引。gaussdb=# REINDEX TABLE tbl_test;--在线重建表tbl_test上的所有索引。gaussdb=# REINDEX TABLE CONCURRENTLY tbl_test;--删除tbl_test表。gaussdb=# DROP TABLE tbl_test;
  • 注意事项 REINDEX DATABASE和SYSTEM这种形式的重建索引不能在事务块中执行。 对于全局二级索引,当前仅支持REINDEX INDEX和REINDEX TABLE。 若索引带有lpi_parallel_method选项,取值为PARTITION且表的parallel_workers选项大于0时,不支持对该索引并行重建;无该选项或选项取值为AUTO时,并行重建时会默认走页面级并行重建索引。详见LPI_PARALLEL_METHOD。 REINDEX CONCURRENTLY在线重建索引导致表上索引顺序改变时,可能会导致查询计划改变。
  • 规格约束 事务 使用DATABASE LINK的时候本地和远程事务的关系如下: 本地事务会同步控制远程事务的提交/回滚状态。 隔离级别的对应关系为: 本地隔离级别 远程隔离级别 Read Uncommitted Repeatable Read Read Committed Repeatable Read Repeatable Read Repeatable Read Serializable Serializable 本地事务提交过程中会向远端发送事务提交请求,如果远端事务提交成功后出现异常情况导致本地的事务提交失败,如连接异常,本地集群实例异常等情况,远端的事务提交无法被撤回,可能出现本地事务与远端事务不一致的情况。 本地用户对DATABASE LINK的使用权限 如果使用了public关键词,就是公有的DATABASE LINK,可以被所有用户/模式使用。 如果没有使用public关键词,就是私有的DATABASE LINK,仅能被当前用户/模式使用(包括SYSADMIN用户也无法跨SCHEMA使用DATABASE LINK)。 通过DATABASE LINK访问远程数据库对象的权限 对远程数据库对象的访问权限与DATABASE LINK绑定的远程连接用户的权限保持一致。 支持SQL范围 DATABASE LINK相关语句支持情况请参见表1。 DATABASE LINK相关表类型支持情况请参见表2。 DATABASE LINK函数调用 DATABASE LINK调用远程函数不支持自定义类型、OUT/INOUT参数、PACKAGE内函数、聚集函数、窗口函数、以及返回set函数。 PLSQL_BODY内通过DATABASE LINK调用远程数据库的存储过程或函数不支持自定义类型、OUT/INOUT参数、PACKAGE内函数、重载函数、聚集函数、窗口函数、以及返回set函数。 PLSQL_BODY内调用远程数据库的存储过程或函数时,应使用[CALL | SELECT] [ schema. ] { func_name@dblink | procedure_name@dblink } ( param_expr )语法格式调用。 PLSQL_BODY内调用远程数据库的无参存储过程或函数时,应使用[CALL | SELECT] [ schema. ] { func_name@dblink | procedure_name@dblink } ( )语法格式调用。 同义词 不支持将DATABASE LINK名创建为一个同义词的使用方法。 不支持通过DATABASE LINK调用远端数据库中指向一个DATABASE LINK对象的同义词。例如如下场景: 步骤一:在DB1上创建表TABLE1。 步骤二:在DB2上创建连接DB1的DBLINK1,并创建同义词"CREATE SYNONYM T1 FOR TABLE1@DBLINK1"。 步骤三:在DB3上创建连接DB2的DBLINK2,通过DBLINK2调用DB2上的同义词T1,"SELECT * FROM T1@DBLINK2"。 表类型约束 HASHBUCKET:不支持通过DATABASE LINK对远端Hash bucket表进行查询或DML操作。 SLICE:不支持通过DATABASE LINK对远端slice表进行查询或DML操作。 复制表:不支持通过DATABASE LINK对远端复制表进行查询或DML操作。 TEMPORARY:不支持通过DATABASE LINK对远端临时表进行查询或DML操作。 视图 目前支持对DATABASE LINK的远端表创建视图,但是当远端表本身的结构发生变化时,该视图使用时可能会发生异常。例如: 步骤一:在DB1上创建表TABLE1。 步骤二:在DB2上创建连接DB1的DBLINK,并创建视图"CREATE VIEW V1 AS SELECT * FROM TABLE1@DBLINK。 步骤三:在DB1上删除TABLE1的一列,在DB2上查询该视图会产生报错。 其他场景: DATABASE LINK表不支持TRIGGER,包括TRIGGER调用函数内使用DATABASE LINK场景、TRIGGER调用函数为DATABASE LINK函数、在DATABASE LINK上定义TRIGGER情况。 暂不支持UPSERT、MERGE语法。 不支持current cursor语法。 不支持查询表的隐藏字段。 dump与备份 不支持DATABASE LINK相关数据库对象的dump,备机不支持DATABASE LINK调用,也不支持被DATABASE LINK连接。 不支持DATABASE LINK相关数据库对象的集群备份后恢复使用。因为不同集群的密钥文件不同,在使用DATABASE LINK时需要使用集群密钥文件进行解密。 谓词下推约束 仅支持WHERE子句使用的数据类型、操作符和函数是内置的,并且使用的函数是IMMUTABLE类型。 聚集函数下推约束 仅支持单表且没有GROUP、ORDER BY、HAVING、LIMIT子句的SELECT语句,并且不支持窗口函数。 hint下推 支持针对DATABASE LINK表对象的hint条件下推,仅限scan方式的hint下推,语法格式如下: [no] tablescan|indexscan|indexonlyscan(table [index]) 并要求在一个 queryblock 中的表名或表别名不能重复。 表1 支持SQL范围 SQL类型 操作对象 支持选项说明 执行上下文 创建DATABASE LINK DATABASE LINK NA 普通事务块 修改DATABASE LINK DATABASE LINK 仅支持用户名、密码的修改 普通事务块 删除DATABASE LINK DATABASE LINK NA 普通事务块 SELECT语句 普通表、普通视图、全量物化视图 WHERE子句 DATABASE LINK表和内部表JOIN DATABASE LINK表和DATABASE LINK表JOIN 聚集函数 LIMIT子句 ORDER BY子句 GROUP BY子句、HAVING子句 UNION子句 WITH子句 START WITH子句和CONNECT BY子句 FOR UPDATE子句 Rownum使用 普通事务块、存储过程、函数、高级包、逻辑视图 INSERT语句 普通表 多VALUE插入 普通事务块、存储过程、函数、高级包 UPDATE语句 普通表 LIMIT子句 ORDER BY子句 WHERE子句 普通事务块、存储过程、函数、高级包 DELETE语句 普通表 LIMIT子句 ORDER BY子句 WHERE子句 普通事务块、存储过程、函数、高级包 LOCK TABLE语句 普通表 LOCKMODE子句 NOWAIT子句 普通事务块 表2 表类型支持情况 维度 GaussDB 表类型 DATABASE LINK支持情况 TEMP选项 临时表 不支持 全局临时表 不支持 UN LOG GED选项 非日志表 支持 存储特性 行存 Astore 支持 Ustore 不支持 分区表 不支持 二级分区表 不支持 视图 DATABASE LINK访问远程视图 支持dql,不支持dml 本地视图通过 DATABASE LINK 关联远程表 支持dql,不支持dml
  • 注意事项 DATABASE LINK特性只在ORA兼容版本下可以使用。 DATABASE LINK连接的远端数据库仅支持503.1.0及之后版本。 用户需要保证本地和远端数据库的兼容性参数DBCOMPATIBILITY和guc参数behavior_compat_options、a_format_dev_version、a_format_version取值一致。 DATABASE LINK连接开启session时会设置如下guc参数: set search_path=pg_catalog, '$user', 'public';set datestyle=ISO;set intervalstyle=postgres;set extra_float_digits=3; 其余参数为远端设置的参数,远端参数与本地参数不同时,可能会出现数据显示格式不一致等情况,使用时应尽量保证远端与本地参数相同。 使用前置准备:使用gs_guc在gs_hba.conf文件中添加白名单允许客户端连接。 示例:gs_guc reload -I all -N all -Z coordinator -Z datanode -h "host all all 192.168.11.11/32 sha256" 详细配置参数信息参考gs_guc客户端认证策略设置。 某些情况集群白名单中也需要添加DN的IP。 创建DATABASE LINK权限需要使用GRANT语法赋予,新建用户默认无权限,系统管理员拥有权限。详见GRANT相关说明。 使用DATABASE LINK对远端表操作时,会在本地创建与远端对应的SCHEMA,若本地不存在该表的元数据信息,会将元数据信息写入本地系统表中,此时会使用7级锁保证写入的一致性,持续到事务结束放锁,删除DATABASE LINK时会将相应的元数据信息删除。 使用DATABASE LINK时在本地创建的表仅用于存储远端表的元数据信息,无法通过\d或pg_get_tabledef函数查询到表结构。 如果业务中有长事务首次使用DATABASE LINK操作远端对象,会持续持锁直到事务结束,其他首次使用DATABASE LINK的事务会被阻塞。可通过一条快速执行的语句先对要使用的远端对象做查询操作使其元数据落盘来规避这种情况,如 "select * from t1@dblink where 1=2;"。另外,远端表结构发生变化时本地要更新存储的元数据信息,也会有类似情况。 在本地创建与远端对应的SCHEMA时会使用“USERNAME(私有DATABASE LINK才有)#远端SCHEMA@DBLINK名”作为SCHEMA名,名称长度上限为63。 如果本地与远端字符集不同,可能会出现无法转换的报错,报错信息为远端返回报错。当本地数据库字符编码为GB18030_2022时,发送到远端会被转换为GB18030。因此,若本地数据库的字符集为GB18030_2022时,远程数据库字符集只能是GB18030或GB18030_2022。 如果在创建DATABASE LINK对象后重新生成密钥文件,使用DATABASE LINK时将会报错。因为创建DATABASE LINK时使用的密钥文件与后续解密时使用的密钥文件不一致。 使用DATABASE LINK对远端表操作时,会创建一个单节点的NODE GROUP随机绑定一个DN。 当赋予用户创建DATABASE LINK权限时,相当于许可用户使用服务端DATABASE的IP对远端进行访问。若不希望有此效果,应不要使用GRANT对用户赋权。
  • 功能描述 在本地数据库利用DATABASE LINK与远程数据库建立连接,并通过DATABASE LINK对远程数据库进行访问。 DATABASE LINK可以分为public或private,private DATABASE LINK仅能被创建者访问,而当DATABASE LINK为public时则所有用户都能访问。 所有已创建的DATABASE LINK信息都存在本地数据库的系统视图gs_db_links中。
  • 示例 从用户joe收回角色jerry的权限。 1 2 3 4 5 6 7 8 9101112 --创建角色jerry。gaussdb=# CREATE role jerry PASSWORD 'xxxxxxxxxx';--将create any table权限授权给jerry,并允许该角色将权限授权给其他人。gaussdb=# GRANT create any table TO jerry with admin option;--创建用户joe,将角色jerry的权限授权给该用户。gaussdb=# CREATE user joe PASSWORD 'xxxxxxxxxxx';gaussdb=# GRANT jerry TO joe;--从用户joe收回角色jerry的权限。gaussdb=# REVOKE jerry FROM joe; 从用户tom收回系统权限。 12345678 --创建用户tom。gaussdb=# CREATE USER tom PASSWORD 'xxxxxxxxxx';--给tom用户授予系统权限。gaussdb=# GRANT ALL PRIVILEGES TO tom;--从用户tom收回系统权限。gaussdb=# REVOKE ALL PRIVILEGES FROM tom; 从用户joe收回对模式tpcds下表reason的SELECT权限。 1 2 3 4 5 6 7 8 9101112131415 --创建tpcds模式。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(20));--将tpcds.reason表查询权限授权给joe。gaussdb=# GRANT select ON tpcds.reason TO joe;--从用户joe收回对模式tpcds下表reason的SELECT权限。gaussdb=# REVOKE SELECT ON TABLE tpcds.reason FROM joe; 从用户joe收回对模式tpcds下函数fun1()的ALTER权限。 1 2 3 4 5 6 7 8 9101112 --创建fun1()函数。gaussdb=# CREATE or replace FUNCTION tpcds.fun1() RETURN boolean ASBEGINSELECT current_user;RETURN true;END;/--给joe用户授予对fun()的ALTER权限。gaussdb=# GRANT ALTER ON FUNCTION tpcds.fun1() TO joe;--从用户joe收回对模式tpcds下函数fun1的ALTER权限。gaussdb=# REVOKE ALTER ON FUNCTION tpcds.fun1() FROM joe; 从用户joe收回对数据库testdb的CONNECT权限。 --创建数据库testdb。gaussdb=# CREATE DATABASE testdb;--给joe用户授予连接testdb的权限。gaussdb=# GRANT connect on database testdb TO joe WITH GRANT OPTION;--从用户joe收回对数据库testdb的CONNECT权限。gaussdb=# REVOKE CONNECT ON database testdb FROM joe; 清除数据。 gaussdb=# DROP TABLE tpcds.reason;gaussdb=# DROP FUNCTION tpcds.fun1();gaussdb=# DROP SCHEMA tpcds CASCADE;gaussdb=# DROP USER joe;gaussdb=# DROP USER tom;gaussdb=# REVOKE create any table FROM jerry;gaussdb=# DROP ROLE jerry;gaussdb=# DROP DATABASE testdb;
  • 参数说明 关键字PUBLIC表示一个隐式定义的拥有所有角色的组。 权限类别和参数说明,请参见GRANT的参数说明。 任何特定角色拥有的特权包括直接授予该角色的特权、从该角色作为其成员的角色中得到的权限以及授予给PUBLIC的权限。因此,从PUBLIC收回SELECT特权并不一定会意味着所有角色都会失去在该对象上的SELECT特权,那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户收回SELECT后,如果PUBLIC仍有SELECT权限,该用户还是可以使用SELECT。 指定GRANT OPTION FOR时,只撤销对该权限授权的权力,而不撤销该权限本身。 如用户A拥有某个表的UPDATE权限,及WITH GRANT OPTION选项,同时A把这个权限赋予了用户B,则用户B持有的权限称为依赖性权限。当用户A持有的权限或者授权选项被撤销时,依赖性权限仍然存在,但如果声明了CASCADE,则所有依赖性权限都被撤销。 一个用户只能撤销由它自己直接赋予的权限。例如,如果用户A被指定授权(WITH ADMIN OPTION)选项,且把一个权限赋予了用户B,然后用户B又赋予了用户C,则用户A不能直接将C的权限撤销。但是,用户A可以撤销用户B的授权选项,并且使用CASCADE。这样,用户C的权限就会自动被撤销。另外一个例子:如果A和B都赋予了C同样的权限,则A可以撤销他自己的授权选项,但是不能撤销B的,因此C仍然拥有该权限。 如果执行REVOKE的角色持有的权限是通过多层成员关系获得的,则具体是哪一个包含的角色执行的该命令是不确定的。在这种场合下,建议的方法是使用SET ROLE成为特定角色,然后执行REVOKE,否则可能导致删除了不想删除的权限,或者是任何权限都没有删除。
  • 语法格式 回收指定表或视图上权限。 1234567 REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFEREN CES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收表上指定字段权限。 123456 REVOKE [ GRANT OPTION FOR ] { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )}[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定序列上权限。 1234567 REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE | ALTER | DROP | COMMENT }[, ...] | ALL [ PRIVILEGES ] } ON { [ SEQUENCE ] sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定数据库上权限。 123456 REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定域上权限。 12345 REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定客户端加密主密钥上的权限。 12345 REVOKE [ GRANT OPTION FOR ] { { USAGE | DROP } [, ...] | ALL [PRIVILEGES] } ON CLIENT_MASTER_KEYS client_master_keys_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定列加密密钥上的权限。 12345 REVOKE [ GRANT OPTION FOR ] { { USAGE | DROP } [, ...] | ALL [PRIVILEGES]} ON COLUMN_ENCRYPTION_KEYS column_encryption_keys_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定目录上权限。 12345 REVOKE [ GRANT OPTION FOR ] { { READ | WRITE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON DIRECTORY directory_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定外部数据源上权限。 12345 REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定外部服务器上权限。 12345 REVOKE [ GRANT OPTION FOR ] { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定函数上权限。 123456 REVOKE [ GRANT OPTION FOR ] { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定存储过程上权限。 123456 REVOKE [ GRANT OPTION FOR ] { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...] | ALL PROCEDURE IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定过程语言上权限。 12345 REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定模式上权限。 12345 REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定表空间上权限。 12345 REVOKE [ GRANT OPTION FOR ] { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定类型上权限。 12345 REVOKE [ GRANT OPTION FOR ] { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收指定子集群上权限。 12345 REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE | COMPUTE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON NODE GROUP group_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]; 回收子集群的create权限时,会默认回收usage和compute权限。 回收package对象的权限。 12345 REVOKE [ GRANT OPTION FOR ] { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] } ON PACKAGE package_name [, ...] FROM {[GROUP] role_name | PUBLIC} [, ...] [ CASCADE | RESTRICT ]; 按角色回收角色上的权限。 123 REVOKE [ ADMIN OPTION FOR ] role_name [, ...] FROM role_name [, ...] [ CASCADE | RESTRICT ]; 回收角色上的sysadmin权限。 1 REVOKE ALL { PRIVILEGES | PRIVILEGE } FROM role_name; 回收ANY权限。 12345678 REVOKE [ ADMIN OPTION FOR ] { 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 } [, ...] FROM [ GROUP ] role_name [, ...];
  • 分页查询 语法如下: SELECT query_list FROM table_name [ LIMIT { [offset,] count | ALL } ] offset :表示从第几行向后开始。 count:表示向后查询几条数据。 ALL:表示向后查询所有的数据。 --建表并插入100条数据。gaussdb=# CREATE TABLE testl(id int PRIMARY KEY, flag varchar(10));gaussdb=# INSERT INTO testl (id, flag) VALUES (generate_series(1,100),'flag'||generate_series(1,100));--查询前5条数据。gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 5; id | flag ----+------- 1 | flag1 2 | flag2 3 | flag3 4 | flag4 5 | flag5(5 rows)-- 从第20条向后查询4条数据。gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 20,4; id | flag ----+-------- 21 | flag21 22 | flag22 23 | flag23 24 | flag24(4 rows)--从第96条向后查询出所有数据。gaussdb=# SELECT * FROM testl ORDER BY 1 LIMIT 96,ALL; id | flag -----+--------- 97 | flag97 98 | flag98 99 | flag99 100 | flag100(4 rows)--删除。gaussdb=# DROP TABLE testl; 父主题: SELECT
  • 扩展函数 下表列举了GaussDB中支持的扩展函数,不作为商用特性交付,仅供参考。 分类 函数名称 描述 触发器函数 pg_get_triggerdef(trigger_oid) 为触发器获取CREATE [ CONSTRAINT ] TRIGGER命令 pg_get_triggerdef(trigger_oid, pretty_bool) 为触发器获取CREATE [ CONSTRAINT ] TRIGGER命令 父主题: 附录
  • 示例 1 2 3 4 5 6 7 8 91011121314 --设置所处的时区。gaussdb=# SET TIME ZONE 'PST8PDT';--设置模式搜索路径。 gaussdb=# SET search_path TO tpcds, public;--设置客户端编码集。gaussdb=# SET client_encoding TO utf8;--设置XML的解析方式。gaussdb=# SET XML OPTION DOCUMENT;--把日期时间风格设置为传统的 POSTGRES 风格(日在月前)。gaussdb=# SET datestyle TO postgres;
  • 参数说明 SESSION 声明的参数只对当前会话起作用。如果SESSION和LOCAL都没出现,则SESSION为缺省值。 如果在事务中执行了此命令,命令的产生影响将在事务回滚之后消失。如果该事务已提交,影响将持续到会话的结束,除非被另外一个SET命令重置参数。 LOCAL 声明的参数只在当前事务中有效。在COMMIT或ROLLBACK之后,会话级别的设置将再次生效。 不论事务是否提交,此命令的影响只持续到当前事务结束。一个特例是:在一个事务里面,既有SET命令,又有SET LOCAL命令,且SET LOCAL在SET后面,则在事务结束之前,SET LOCAL命令会起作用,但事务提交之后,则是SET命令会生效。 TIME ZONE timezone 用于指定当前会话的本地时区。 取值范围:有效的本地时区。该选项对应的运行时参数名称为TimeZone,DEFAULT缺省值为PRC。 CURRENT_SCHEMA schema CURRENT_SCHEMA用于指定当前的模式。 取值范围:已存在模式名称。 SCHEMA schema 同CURRENT_SCHEMA。此处的schema是个字符串。 例如:set schema 'public'; NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT}; 在sql_compatibility = 'MYSQL'模式下,并设置b_format_version='5.7'、b_format_dev_version='s2'时,支持指定COLLATE子句。 描述:用于设置客户端字符编码,常量字符串的字符集、字符序,及返回结果的字符集。 等价为: SET client_encoding = charset_name; SET character_set_connection = charset_name; SET collation_connection = collation_name; SET character_set_results = charset_name; 取值范围:MYSQL兼容模式下支持的字符集、字符序。暂不支持指定charset_name与数据库字符集不同。 其他场景下不支持指定COLLATE子句。 描述:用于设置客户端的字符编码。 等价为: SET client_encoding TO charset_name; 取值范围:有效的字符编码。默认编码为UTF8。 XML OPTION option 用于设置XML的解析方式。 取值范围:CONTENT(缺省)、DOCUMENT config_parameter 可设置的运行时参数的名称。可用的运行时参数可以使用SHOW ALL命令查看。 部分通过SHOW ALL查看的参数不能通过SET设置。如max_datanodes。 value config_parameter的新值。可以声明为字符串常量、标识符、数字,或者逗号分隔的列表。DEFAULT用于把这些参数设置为它们的缺省值。
  • 语法格式 设置所处的时区。 1 SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }; 设置所属的模式。 123 SET [ SESSION | LOCAL ] {CURRENT_SCHEMA { TO | = } { schema | DEFAULT } | SCHEMA 'schema'}; 设置客户端编码集。 1 SET [ SESSION | LOCAL ] NAMES {'charset_name' [COLLATE 'collation_name'] | DEFAULT}; 设置XML的解析方式。 1 SET [ SESSION | LOCAL ] XML OPTION { DOCUMENT | CONTENT }; 设置其他运行时参数。 123 SET [ SESSION | LOCAL ] {config_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }};
  • 注意事项 在ORA兼容性数据库下使用。 最大嵌套层数限制通过GUC参数max_subpro_nested_layers控制(默认值为3,取值范围0~100)。如果嵌套子程序中含有匿名块,匿名块不计算层数,但匿名块内的嵌套子程序计入到总层数。 嵌套子程序不支持重载、不支持使用SETOF。 嵌套子程序内不支持定义为自治事务,可调用含有自治事务的存储过程或函数。 子函数(FUNCTION)不支持直接调用且必须要有返回值,子存储过程(PROCEDURE)不支持在表达式中调用。 嵌套子程序不支持perform调用,动态语句中不能有嵌套子程序。 当前嵌套子程序的修饰符支持如下,其余修饰符暂不支持。 {IMMUTABLE | STABLE | VOLATILE } {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } 仅支持一个限定符引用嵌套子程序或嵌套子程序的变量。 当子函数(FUNCTION)返回值类型为函数自定义的record类型时,无法使用subfunc().col的方式访问子函数返回值的列属性,执行时会报错。 嵌套子程序的声明必须是在声明部分的最后(在其他变量、游标、类型等声明完成之后再声明嵌套子程序)。 嵌套子程序只能在声明的函数或存储过程内部调用,外部不可使用。 嵌套子程序使用不支持debugger打断点,支持step单步调试。 其余注意事项同存储过程及函数一致。
  • 语法格式 创建子存储过程语法格式: 12345678 PROCEDURE procedure_name [ (parameters) ] [{IMMUTABLE | STABLE | VOLATILE } | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }] { IS | AS } [ declarations ]BEGIN plsql_bodyEND; 创建子函数语法: 12345678 FUNCTION function_name [ (parameters) ] RETURN rettype [{IMMUTABLE | STABLE | VOLATILE } | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }] { IS | AS } [ declarations ]BEGIN plsql_bodyEND; 在declarations部分可再定义下层的嵌套子程序。 示例: 1 2 3 4 5 6 7 8 910111213141516171819202122 -- 创建一个存储过程CREATE OR REPLACE PROCEDURE proc_test() AS -- 声明并定义一个子存储过程 PROCEDURE proc_sub() IS BEGIN dbe_output.put_line('this is subpragram'); END;BEGIN dbe_output.put_line('this is a procedure'); -- 执行块内调用子存储过程 proc_sub();END;/-- 外部调用存储过程BEGIN proc_test;END;/-- 输出结果this is a procedurethis is subpragramANONYMOUS BLOCK EXECUTE
  • 变量作用域 变量的作用域表示变量在代码块中的可访问性和可用性。只有在它的作用域内,变量才有效。 变量必须在declare部分声明,即必须建立BEGIN-END块。块结构也强制变量必须先声明后使用,即变量在过程内有不同作用域、不同的生存期。 同一变量可以在不同的作用域内定义多次,内层的定义会覆盖外层的定义。 在外部块定义的变量,可以在嵌套块中使用。但外部块不能访问嵌套块中的变量。 示例 1 2 3 4 5 6 7 8 91011121314 gaussdb=# DECLARE emp_id INTEGER :=7788; --定义变量并赋值 outer_var INTEGER :=6688; --定义变量并赋值BEGIN DECLARE emp_id INTEGER :=7799; --定义变量并赋值 inner_var INTEGER :=6688; --定义变量并赋值 BEGIN dbe_output.print_line('inner emp_id ='||emp_id); --显示值为7799 dbe_output.print_line('outer_var ='||outer_var); --引用外部块的变量 END; dbe_output.print_line('outer emp_id ='||emp_id); --显示值为7788END;/
  • 变量声明 变量声明语法如图1所示。 图1 declare_variable::= 对以上语法格式的解释如下: variable_name,为变量名。 type,为变量类型。 value,是该变量的初始值(如果不给定初始值,则初始为NULL)。value也可以是表达式。 示例 123456 gaussdb=# DECLARE emp_id INTEGER := 7788; --定义变量并赋值BEGIN emp_id := 5*7784; --变量赋值END;/
  • PL/SQL语言函数 PL/SQL是一种可载入的过程语言。 用PL/SQL创建的函数可以被用在任何可以使用内建函数的地方。例如,可用于创建复杂条件的计算函数、定义操作符以及索引表达式。 SQL被大多数数据库用作查询语言。它是可移植的并且容易学习。但是每一个SQL语句必须由数据库服务器单独执行。 这意味着客户端应用对于每一个查询都要执行以下过程:发送查询到数据库服务器、等待查询被接收、接收并处理结果、进行相关计算、然后发送更多查询给服务器。如果客户端和数据库服务器不在同一台机器上,那么这个过程还会引起进程间通信并且将带来网络负担。 通过PL/SQL,可以将一整块计算和一系列查询分组在数据库服务器内部,这样就有了一种过程语言的能力并且使SQL更易用,同时能节省客户端/服务器通信开销。 客户端和服务器之间的额外往返通信被消除。 客户端不需要的中间结果不必被整理或者在服务器和客户端之间传送。 多轮的查询解析可以被避免。 PL/SQL可以使用SQL中所有的数据类型、操作符和函数,应用PL/SQL创建函数的语法为CREATE FUNCTION。 PL/SQL是一种可载入的过程语言,其应用方法与存储过程相似,但存储过程无返回值,PL/SQL语言函数有返回值。 XML类型数据支持作为自定义函数的入参、出参、自定义变量和返回值。 父主题: 用户自定义函数
  • 语法格式 查询数据: 1 2 3 4 5 6 7 8 910111213141516 [ WITH [ RECURSIVE ] with_query [, ...] ]SELECT [/*+ plan_hint */] [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ FROM from_item [, ...] ] [ WHERE condition ] [ [ START WITH condition ] CONNECT BY [NOCYCLE] condition [ ORDER SIBLINGS BY expression ] ] [ GROUP BY grouping_element [, ...] ] [ HAVING condition [, ...] ] [ WINDOW {window_name AS ( window_definition )} [, ...] ] [ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ LIMIT { [offset,] count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT | WAIT n | SKIP LOCKED ]} [...] ]; condition和expression中可以使用targetlist中表达式的别名。 只能同一层引用。 只能引用targetlist中的别名。 只能是后面的表达式引用前面的表达式。 不能包含volatile函数。 不能包含Window function函数。 不支持在JOIN ON条件中引用别名。 targetlist中有多个要应用的别名则报错。 缓存SELECT语句计划的场景下,WHERE IN候选子集不易过大,建议条件个数不要超过100,防止引发动态内存过高问题: WHERE IN候选子集过大时,生成计划的内存占用会增大。 当拼接SQL构造的WHERE IN子集不同,缓存计划的SQL模板无法复用。会生成大量不同的计划且计划无法共享 ,占用大量内存。 其中子查询with_query为: 12 with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( {select | values | insert | update | delete} ) 其中指定查询源from_item为: 1 2 3 4 5 6 7 8 91011 {[ ONLY ] table_name [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ][ TABLESAMPLE sampling_method ( argument [, ...] ) [ REPEATABLE ( seed ) ] ][ TIMECAPSULE {TIMESTAMP | CS N} expression ]|( select ) [ AS ] alias [ ( column_alias [, ...] ) ]|with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]|function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]|function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )|xmltable_clause|from_item unpivot_clause|from_item pivot_clause|from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]} 其中GROUP BY子句为: 123456 ( )| expression| ( expression [, ...] )| ROLLUP ( { expression | ( expression [, ...] ) } [, ...] )| CUBE ( { expression | ( expression [, ...] ) } [, ...] )| GROUPING SETS ( grouping_element [, ...] ) from_item中指定分区partition_clause为: 1 PARTITION { ( partition_name [, ...] ) | FOR ( partition_value [, ...] ) } 指定分区只适合分区表。 PARTITION指定多个分区名时,可以存在相同的分区名,最终分区范围取其并集。 其中设置排序方式nlssort_expression_clause为: 1 NLSSORT ( column_name, ' NLS_SORT = { SCHINESE_PINYIN_M | generic_m_ci } ' ) 第二个参数可选generic_m_ci,仅支持纯英文不区分大小写排序。 简化版查询语法,功能相当于SELECT * FROM table_name。 1 TABLE { ONLY {(table_name)| table_name} | table_name [ * ]};
  • 示例 下面列举了基本的匿名块程序: 1 2 3 4 5 6 7 8 91011121314151617181920212223 --空语句块gaussdb=# BEGIN NULL; END;/--将信息打印到控制台:gaussdb=# BEGIN dbe_output.print_line('hello world!'); END; /hello world!ANONYMOUS BLOCK EXECUTE--将变量内容打印到控制台:gaussdb=# DECLARE my_var VARCHAR2(30); BEGIN my_var :='world'; dbe_output.print_line('hello'||my_var); END; / helloworldANONYMOUS BLOCK EXECUTE
共99354条