华为云用户手册

  • 示例 显示用字母t和f输出Boolean值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 --创建表。 gaussdb=# CREATE TABLE bool_type_t1 ( BT_COL1 BOOLEAN, BT_COL2 TEXT )DISTRIBUTE BY HASH(BT_COL2); --插入数据。 gaussdb=# INSERT INTO bool_type_t1 VALUES (TRUE, 'sic est'); gaussdb=# INSERT INTO bool_type_t1 VALUES (FALSE, 'non est'); --查看数据。 gaussdb=# SELECT * FROM bool_type_t1; bt_col1 | bt_col2 ---------+--------- t | sic est f | non est (2 rows) gaussdb=# SELECT * FROM bool_type_t1 WHERE bt_col1 = 't'; bt_col1 | bt_col2 ---------+--------- t | sic est (1 row) --删除表。 gaussdb=# DROP TABLE bool_type_t1;
  • 原型 1 2 3 4 5 6 SQLRETURN SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT Col_or_Param_Num, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_IndPtr);
  • 参数 表1 SQLGetData参数 关键字 参数说明 StatementHandle 语句句柄,通过SQLAllocHandle获得。 Col_or_Param_Num 要返回数据的列号。结果集的列按增序从1开始编号。书签列的列号为0。 TargetType TargetValuePtr缓冲中的C数据类型的类型标识符。若TargetType为SQL_ARD_TYPE,驱动使用ARD中SQL_DESC_CONCISE_TYPE字段的类型标识符。若为SQL_C_DEFAULT,驱动根据源的SQL数据类型选择缺省的数据类型。 TargetValuePtr 输出参数:指向返回数据所在缓冲区的指针。 BufferLength TargetValuePtr所指向缓冲区的长度。 StrLen_or_IndPtr 输出参数:指向缓冲区的指针,在此缓冲区中返回长度或标识符的值。
  • 语法格式 重命名表空间的语法。 1 2 ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name; 设置表空间所有者的语法。 1 2 ALTER TABLESPACE tablespace_name OWNER TO new_owner; 设置表空间属性的语法。 1 2 ALTER TABLESPACE tablespace_name SET ( { tablespace_option = value } [, ... ] ); 重置表空间属性的语法。 1 2 ALTER TABLESPACE tablespace_name RESET ( { tablespace_option } [, ... ] ); 设置表空间限额的语法。 1 2 ALTER TABLESPACE tablespace_name RESIZE MAXSIZE { UNLIMITED | 'space_size'};
  • 示例 重命名表空间。 --创建表空间。 gaussdb=# CREATE TABLESPACE tbs_data1 RELATIVE LOCATION 'tablespace1/tbs_data1'; --重命名表空间。 gaussdb=# ALTER TABLESPACE tbs_data1 RENAME TO tbs_data2; --查询。 gaussdb=# \db tbs_data2 List of tablespaces Name | Owner | Location -----------+-------+----------------------- tbs_data2 | omm | tablespace1/tbs_data1 设置表空间所有者。 示例: --创建用户。 gaussdb=# CREATE USER test PASSWORD '********'; --修改表空间所有者。 gaussdb=# ALTER TABLESPACE tbs_data2 OWNER TO test; --查看。 gaussdb=# \db tbs_data2 List of tablespaces Name | Owner | Location -----------+-------+----------------------- tbs_data2 | test | tablespace1/tbs_data1 (1 row) 设置表空间属性。 示例: --修改seq_page_cost的值。 gaussdb=# ALTER TABLESPACE tbs_data2 SET (seq_page_cost = 10); --查看。 gaussdb=# SELECT * FROM pg_tablespace WHERE spcname = 'tbs_data2'; spcname | spcowner | spcacl | spcoptions | spcmaxsize | relative -----------+----------+--------+--------------------+------------+---------- tbs_data2 | 16778 | | {seq_page_cost=10} | | t (1 row) 重置表空间属性。 --将seq_page_cost参数的值重置为缺省值。 gaussdb=# ALTER TABLESPACE tbs_data2 RESET (seq_page_cost); --查看。 gaussdb=# SELECT * FROM pg_tablespace WHERE spcname = 'tbs_data2'; spcname | spcowner | spcacl | spcoptions | spcmaxsize | relative -----------+----------+--------+------------+------------+---------- tbs_data2 | 16778 | | | | t (1 row) 设置表空间限额。 示例: --设置表空间最大使用的空间。 gaussdb=# ALTER TABLESPACE tbs_data2 RESIZE MAXSIZE '10G'; --查看。 gaussdb=# SELECT * FROM pg_tablespace WHERE spcname = 'tbs_data2'; spcname | spcowner | spcacl | spcoptions | spcmaxsize | relative -----------+----------+--------+------------+------------+---------- tbs_data2 | 16778 | | | 10485760 K | t (1 row) --删除表空间。 gaussdb=# DROP TABLESPACE tbs_data2; --删除用户。 gaussdb=# DROP USER test;
  • 参数说明 tablespace_name 要修改的表空间。 取值范围:已存在的表空间名。 new_tablespace_name 表空间的新名称,新名称不能以"PG_"开头。 取值范围:字符串,符合标识符命名规范。 new_owner 表空间的新所有者。 取值范围:已存在的用户名。 tablespace_option 设置或者重置表空间的参数。 取值范围: seq_page_cost:设置优化器计算一次顺序获取磁盘页面的开销。缺省为1.0。 random_page_cost:设置优化器计算一次非顺序获取磁盘页面的开销。缺省为4.0。 random_page_cost是相对于seq_page_cost的取值,等于或者小于seq_page_cost时毫无意义。 默认值为4.0的前提条件是,优化器采用索引来扫描表数据,并且表数据在cache中命中率可以90%左右。 如果表数据空间要比物理内存小,那么减小该值到一个适当水平;相反地,如果表数据在cache中命中率要低于90%,那么适当增大该值。 如果采用了类似于SSD的随机访问代价较小的存储器,可以适当减小该值,以反映真正的随机扫描代价。 value的取值范围:浮点类型的正数。 RESIZE MAXSIZE 重新设置表空间限额的数值。 取值范围: UNLIMITED,该表空间不设置限额。 由space_size来确定,其格式参考CREATE TABLESPACE。 若调整后的限额值比当前表空间实际使用的值要小,调整操作可以执行成功,后续用户需要将该表空间的使用值降低到新限额值之下,才能继续往该表空间中写入数据。
  • 注意事项 只有表空间的所有者或者被赋予了表空间ALTER权限的用户有权限执行ALTER TABLESPACE命令,系统管理员默认拥有此权限。但要修改表空间的所有者,当前用户必须是该表空间的所有者或系统管理员,且该用户是new_owner角色的成员。 对行存表的ALTER TABLESPACE操作不支持在事务块中执行。 要修改表空间的所有者A为B,则A必须是B的直接或者间接成员。 如果new_owner与old_owner一致,此处不再校验当前执行操作的用户是否具有修改权限,而直接显示ALTER成功。
  • 规格约束 事务 使用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参数、聚集函数、窗口函数、以及返回set函数。 PLSQL_BODY内通过DATABASE LINK调用远程数据库的存储过程或函数不支持OUT/INOUT参数、重载函数、聚集函数、窗口函数、以及返回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连接。 谓词下推约束 仅支持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子句 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对远端表操作时,会创建一个单节点的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中。
  • 背景信息 在SQL语言中,每个数据都与一个决定其行为和用法的数据类型相关。GaussDB提供一个可扩展的数据类型系统,该系统比其它SQL实现更具通用性和灵活性。因此,GaussDB中大多数类型转换是由通用规则来管理的,这种做法允许使用混合类型的表达式。 GaussDB扫描/分析器只将词法元素分解成五个基本种类:整数、浮点数、字符串、标识符和关键字。大多数非数字类型首先表现为字符串。SQL语言的定义允许将常量字符串声明为具体的类型。例如: 1 2 3 4 5 gaussdb=# SELECT text 'Origin' AS "label", point '(0,0)' AS "value"; label | value --------+------- Origin | (0,0) (1 row) 示例中有两个文本常量,类型分别为text和point。如果没有为字符串文本声明类型,则该文本首先被定义成一个unknown类型。 在GaussDB分析器里,有四种基本的SQL结构需要独立的类型转换规则: 函数调用 多数SQL类型系统是建立在一套丰富的函数上的。函数调用可以有一个或多个参数。因为SQL允许函数重载,所以不能通过函数名直接找到要调用的函数,分析器必须根据函数提供的参数类型选择正确的函数。 操作符 SQL允许在表达式上使用前缀或后缀(单目)操作符,也允许表达式内部使用双目操作符(两个参数)。像函数一样,操作符也可以被重载,因此操作符的选择也和函数一样取决于参数类型。 值存储 INSERT和UPDATE语句将表达式结果存入表中。语句中的表达式类型必须和目标字段的类型一致或者可以转换为一致。 UNION,CASE和相关构造 因为联合SELECT语句中的所有查询结果必须在一列里显示出来,所以每个SELECT子句中的元素类型必须相互匹配并转换成一个统一类型。类似地,一个CASE构造的结果表达式必须转换成统一的类型,这样整个case表达式会有一个统一的输出类型。同样的要求也存在于ARRAY构造以及GREATEST和LEAST函数中。 系统表pg_cast存储了有关数据类型之间的转换关系以及如何执行这些转换的信息。详细信息请参见PG_CAST。 语义分析阶段会决定表达式的返回值类型并选择适当的转换行为。数据类型的基本类型分类,包括:Boolean,numeric,string,bitstring,datetime,timespan,geometric和network。每种类型都有一种或多种首选类型用于解决类型选择的问题。根据首选类型和可用的隐含转换,就可能保证有歧义的表达式(那些有多个候选解析方案的)得到有效的方式解决。 所有类型转换规则都是建立在下面几个基本原则上的: 隐含转换决不能有奇怪的或不可预见的输出。 如果一个查询不需要隐含的类型转换,分析器和执行器不应该进行更多的额外操作。任何一个类型匹配、格式清晰的查询不应该在分析器里耗费更多的时间,也不应该向查询中引入任何不必要的隐含类型转换调用。 如果一个查询在调用某个函数时需要进行隐式转换,当用户定义了一个有正确参数的函数后,解释器应该选择使用新函数。 XML类型数据不支持隐式类型转换,包括字符串和XML类型之间的隐式转换。
  • 示例 重命名索引。 --创建test1表并为其创建索引。 gaussdb=# CREATE TABLE test1(col1 int, col2 int); gaussdb=# CREATE INDEX aa ON test1(col1); --将索引aa重命名为idx_test1_col1。 gaussdb=# ALTER INDEX aa RENAME TO idx_test1_col1; --查询test1表上的索引信息。 gaussdb=# SELECT tablename,indexname,tablespace FROM pg_indexes WHERE tablename = 'test1'; tablename | indexname | tablespace -----------+----------------+------------ test1 | idx_test1_col1 | (1 row) 修改索引所属表空间。 --创建表空间tbs_index1。 gaussdb=# CREATE TABLESPACE tbs_index1 RELATIVE LOCATION 'tablespace1/tbs_index1'; --修改索引idx_test1_col1的所属表空间为tbs_index1。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 SET TABLESPACE tbs_index1; --查询test1表上的索引信息。 gaussdb=# SELECT tablename,indexname,tablespace FROM pg_indexes WHERE tablename = 'test1'; tablename | indexname | tablespace -----------+----------------+------------ test1 | idx_test1_col1 | tbs_index1 (1 row) 修改与重置索引存储参数。 --查看索引idx_test1_col1详细信息。 gaussdb=# \di idx_test1_col1 List of relations Schema | Name | Type | Owner | Table | Storage --------+----------------+-------+-------+-------+--------- public | idx_test1_col1 | index | omm | test1 | (1 row) --修改索引idx_test1_col1 的填充因子。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 SET (FILLFACTOR = 70); --查看索引idx_test1_col1详细信息。 gaussdb=# \di idx_test1_col1 List of relations Schema | Name | Type | Owner | Table | Storage --------+----------------+-------+-------+-------+----------------- public | idx_test1_col1 | index | omm | test1 | {fillfactor=70} (1 row) --重置索引idx_test1_col1 的存储参数。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 RESET (FILLFACTOR); --查看索引idx_test1_col1详细信息。 gaussdb=# \di idx_test1_col1 List of relations Schema | Name | Type | Owner | Table | Storage --------+----------------+-------+-------+-------+--------- public | idx_test1_col1 | index | omm | test1 | (1 row) 修改索引可用性。 --设置索引idx_test1_col1不可用。 gaussdb=# ALTER INDEX IF EXISTS idx_test1_col1 UNUSABLE; --查看索引idx_test1_col1的可用性。 gaussdb=# SELECT indisusable FROM pg_index WHERE indexrelid = 'idx_test1_col1'::regclass; indisusable ------------- f (1 row) --重建索引idx_test1_col1。 gaussdb=# ALTER INDEX idx_test1_col1 REBUILD; --查看索引idx_test1_col1的可用性。 gaussdb=# SELECT indisusable FROM pg_index WHERE indexrelid = 'idx_test1_col1'::regclass; indisusable ------------- t (1 row) --删除。 gaussdb=# DROP INDEX idx_test1_col1; gaussdb=# DROP TABLE test1; gaussdb=# DROP TABLESPACE tbs_index1; 重命名索引分区。 --创建分区表test2。 gaussdb=# CREATE TABLE test2(col1 int, col2 int) PARTITION BY RANGE (col1)( PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200) ); --创建分区索引。 gaussdb=# CREATE INDEX idx_test2_col1 ON test2(col1) LOCAL( PARTITION p1, PARTITION p2 ); --重命名索引分区。 gaussdb=# ALTER INDEX idx_test2_col1 RENAME PARTITION p1 TO p1_test2_idx; gaussdb=# ALTER INDEX idx_test2_col1 RENAME PARTITION p2 TO p2_test2_idx; --查询索引idx_test2_col1分区的名称。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_test2_col1'::regclass; relname -------------- p1_test2_idx p2_test2_idx (2 rows) 修改索引分区的所属表空间。 --创建表空间tbs_index2与tbs_index3。 gaussdb=# CREATE TABLESPACE tbs_index2 RELATIVE LOCATION 'tablespace1/tbs_index2'; gaussdb=# CREATE TABLESPACE tbs_index3 RELATIVE LOCATION 'tablespace1/tbs_index3'; --修改索引idx_test2_col1分区的所属表空间。 gaussdb=# ALTER INDEX idx_test2_col1 MOVE PARTITION p1_test2_idx TABLESPACE tbs_index2; gaussdb=# ALTER INDEX idx_test2_col1 MOVE PARTITION p2_test2_idx TABLESPACE tbs_index3; --查询索引idx_test2_col1分区的所属表空间。 gaussdb=# SELECT t1.relname index_name, t2.spcname tablespace_name FROM pg_partition t1, pg_tablespace t2 WHERE t1.parentid = 'idx_test2_col1'::regclass AND t1.reltablespace = t2.oid; index_name | tablespace_name --------------+----------------- p1_test2_idx | tbs_index2 p2_test2_idx | tbs_index3 (2 rows) --删除。 gaussdb=# DROP INDEX idx_test2_col1; gaussdb=# DROP TABLE test2; gaussdb=# DROP TABLESPACE tbs_index2; gaussdb=# DROP TABLESPACE tbs_index3;
  • 参数说明 index_name 要修改的索引名。 IF EXISTS 如果指定的索引不存在,则发出一个notice而不是error。 RENAME TO new_name 只改变索引的名称。对存储的数据没有影响。 new_name 新的索引名。 取值范围:字符串,且符合标识符命名规范。 SET TABLESPACE tablespace_name 改变索引的表空间为指定表空间,并且把索引相关的数据文件移动到新的表空间里。 tablespace_name 表空间的名称。 取值范围:已存在的表空间。 SET ( {storage_parameter = value} [, ... ] ) 改变索引的一个或多个索引方法特定的存储参数。需要注意的是索引内容不会被这个命令立即修改,根据参数的不同,可能需要使用REINDEX重建索引来获得期望的效果。 storage_parameter 索引方法特定的参数名。ACTIVE_PAGES表示索引的页面数量,可能比实际的物理文件页面少,可以用于优化器调优。目前只对ustore的分区表local索引生效,且会被vacuum、analyze更新(包括auto vacuum)。不建议用户手动设置该参数,该参数在分布式下无效。对GSI执行ALTER时,对INTERNAL_MASK、APPEND_MODE_INTERNAL、WAIT_CLEAN_GPI、PARTITION_DDL_FLAG、COLLATECROSSBUCKET和DEDUPLICATION参数不支持,行为同UBtree,支持FILLFACTOR、INDEXSPLIT参数,ACTIVE_PAGES和WAIT_CLEAN_CBI 不适用于GSI。 value 索引方法特定的存储参数的新值。根据参数的不同,这可能是一个数字或单词。 RESET ( { storage_parameter } [, ...] ) 重置索引的一个或多个索引方法特定的存储参数为缺省值。与SET一样,可能需要使用REINDEX来完全更新索引。 [ MODIFY PARTITION index_partition_name ] UNUSABLE 用于设置表或者索引分区上的索引不可用。 REBUILD [ PARTITION index_partition_name ] 用于重建表或者索引分区上的索引。重建索引时,若索引带有lpi_parallel_method选项,取值为PARTITION且表的parallel_workers选项大于0时,不支持对该索引并行重建;无该选项或选项取值为AUTO时,并行重建时会默认走页面级并行重建索引。详见LPI_PARALLEL_METHOD。 RENAME PARTITION index_partition_name TO new_index_partition_name 用于重命名索引分区。 MOVE PARTITION index_partition_name TABLESPACE new_tablespace 用于修改索引分区的所属表空间。 new_index_partition_name 新索引分区名。 index_partition_name 索引分区名。 new_tablespace 新表空间。 GSIVALID 用于CREATE GLOBAL INDEX CONCURRENTLY功能内部调用,修改分布式全局二级索引状态。 GSIUSABLE 此语法主要用于VACUUM FULL功能内部调用,修改分布式全局二级索引状态。 VISIBLE 用于设置索引状态为可见。 INVISIBLE 用于设置索引状态为不可见。
  • 语法格式 重命名表索引的名称。 1 2 ALTER INDEX [ IF EXISTS ] index_name RENAME TO new_name; 修改表索引的所属空间。 1 2 ALTER INDEX [ IF EXISTS ] index_name SET TABLESPACE tablespace_name; 修改表索引的存储参数。 1 2 ALTER INDEX [ IF EXISTS ] index_name SET ( {storage_parameter = value} [, ... ] ); 重置表索引的存储参数。 1 2 ALTER INDEX [ IF EXISTS ] index_name RESET ( storage_parameter [, ... ] ); 设置表索引或索引分区不可用。 1 2 ALTER INDEX [ IF EXISTS ] index_name [ MODIFY PARTITION index_partition_name ] UNUSABLE; 重建表索引或索引分区。 1 2 ALTER INDEX index_name REBUILD [ PARTITION index_partition_name ]; 重命名索引分区。 1 2 ALTER INDEX [ IF EXISTS ] index_name RENAME PARTITION index_partition_name TO new_index_partition_name; 修改索引分区的所属表空间。 1 2 ALTER INDEX [ IF EXISTS ] index_name MOVE PARTITION index_partition_name TABLESPACE new_tablespace; 设置分布式全局二级索引就绪。 ALTER INDEX [ IF EXISTS ] index_name GSIVALID; 此语法主要用于CREATE GLOBAL INDEX CONCURRENTLY功能内部调用,修改全局二级索引状态,用户不建议使用,否则可能导致索引数据与表数据不一致。如需启用UNVALID状态的GSI,建议使用REINDEX INDEX语法重新创建GSI。 设置分布式全局二级索引可用。 ALTER INDEX [ IF EXISTS ] index_name GSIUSABLE; 此语法主要用于VACUUM FULL功能内部调用,修改全局二级索引状态,用户不建议使用,否则可能导致索引数据与表数据不一致。如需启用UNUSABLE状态的GSI,建议使用REINDEX INDEX语法重新创建GSI。 用于设置索引状态为可见。 ALTER INDEX [ IF EXISTS ] index_name VISIBLE; 此语法仅支持在ORA兼容性数据库下(即sql_compatibility = 'ORA')设置,在其他数据库兼容模式下不支持。 当disable_keyword_options参数设置为“visible”时,VISIBLE关键字不支持使用。 升级未提交阶段,不支持使用此语法。 用于设置索引状态为不可见。 ALTER INDEX [ IF EXISTS ] index_name INVISIBLE; 此语法仅支持在ORA兼容性数据库下(即sql_compatibility = 'ORA')设置,在其他数据库兼容模式下不支持。 当disable_keyword_options参数设置为“invisible”时,INVISIBLE关键字不支持使用。 升级未提交阶段,不支持使用此语法。 备机读场景下,设置索引状态为不可见后,查询语句的执行计划可能会发生变化,备机查询性能可能会受到影响。
  • 示例 插入一条数据 示例: --建表。 gaussdb=# CREATE TABLE test_t1(col1 INT,col2 VARCHAR); --插入数据。 gaussdb=# INSERT INTO test_t1 (col1, col2) VALUES (1,'AB'); --只给表中部分列添加值。 gaussdb=# INSERT INTO test_t1 (col1) VALUES (2); --VALUES关键字左边没有括号,右边括号里面必须严格按照表结构的顺序给所有的字段添加值。 gaussdb=# INSERT INTO test_t1 VALUES (3,'AC'); --查询表。 gaussdb=# SELECT * FROM test_t1; col1 | col2 ------+------ 1 | AB 2 | 3 | AC (3 rows) --删除。 gaussdb=# DROP TABLE test_t1; 插入多条数据 示例: --建表。 gaussdb=# CREATE TABLE test_t2(col1 INT,col2 VARCHAR); gaussdb=# CREATE TABLE test_t3(col1 INT,col2 VARCHAR); --插入多条数据。 gaussdb=# INSERT INTO test_t2 (col1, col2) VALUES (10,'AA'),(20,'BB'),(30,'CC'); --查询。 gaussdb=# SELECT * FROM test_t2; col1 | col2 ------+------ 10 | AA 20 | BB 30 | CC (3 rows) --把test_t2中的数据插入到test_t3中。 gaussdb=# INSERT INTO test_t3 SELECT * FROM test_t2; --查询。 gaussdb=# SELECT * FROM test_t3; col1 | col2 ------+------ 10 | AA 20 | BB 30 | CC (3 rows) --删除。 gaussdb=# DROP TABLE test_t2; DROP TABLE test_t3; ON DUPLICATE KEY UPDATE 示例: --建表。 gaussdb=# CREATE TABLE test_t4 (id INT PRIMARY KEY, info VARCHAR(10)); gaussdb=# INSERT INTO test_t4 VALUES (1, 'AA'), (2,'BB'), (3, 'CC'); --使用ON DUPLICATE KEY UPDATE关键字。 gaussdb=# INSERT INTO test_t4 VALUES (3, 'DD'), (4, 'EE') ON DUPLICATE KEY UPDATE info = VALUES(info); --查询。 gaussdb=# SELECT * FROM test_t4; id | info ----+------ 1 | AA 2 | BB 4 | EE 3 | DD --删除。 gaussdb=# DROP TABLE test_t4; INSERT IGNORE 示例1:破坏NOT NULL约束 --建表。 gaussdb=# CREATE TABLE test_t5(f1 INT NOT NULL); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t5 VALUES(NULL); WARNING: null value in column "f1" violates not-null constraint DETAIL: Failing row contains (null). INSERT 0 1 --查询表。 gaussdb=# SELECT * FROM test_t5; f1 ---- 0 (1 row) --删除表。 gaussdb=# DROP TABLE test_t5; DROP TABLE 示例2:唯一键冲突 --建表。 gaussdb=# CREATE TABLE test_t6(f1 INT PRIMARY KEY); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_t6_pkey" for table "test_t6" CREATE TABLE --插入数据。 gaussdb=# INSERT INTO test_t6 VALUES(1); INSERT 0 1 --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t6 VALUES(1); INSERT 0 0 --查询表。 gaussdb=# SELECT * FROM test_t6; f1 ---- 1 (1 row) --删除表。 gaussdb=# DROP TABLE test_t6; DROP TABLE 示例3:插入的值没有找到对应的分区 --建表。 gaussdb=# CREATE TABLE test_t7(f1 INT, f2 INT) PARTITION BY LIST(f1) (PARTITION p0 VALUES(1, 4, 7), PARTITION p1 VALUES (2, 5, 8)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t7 VALUES(3, 5); INSERT 0 0 --查询表。 gaussdb=# SELECT * FROM test_t7; f1 | f2 ----+---- (0 rows) --删除表。 gaussdb=# DROP TABLE test_t7; DROP TABLE 示例4:指定分区插入时,插入的数据与指定的分区不匹配 --建表。 gaussdb=# CREATE TABLE test_t8(f1 INT NOT NULL, f2 TEXT, f3 INT) PARTITION BY RANGE(f1)(PARTITION p0 VALUES LESS THAN(5), PARTITION p1 VALUES LESS THAN(10), PARTITION p2 VALUES LESS THAN(15), PARTITION p3 VALUES LESS THAN(MAXVALUE)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t8 PARTITION(p2) VALUES(20, 'Jan', 1); INSERT 0 0 --查询表。 gaussdb=# SELECT * FROM test_t8; f1 | f2 | f3 ----+----+---- (0 rows) --删除表。 gaussdb=# DROP TABLE test_t8; DROP TABLE 示例5:子查询返回多行 --建表。 gaussdb=# CREATE TABLE test_t9(f1 INT, f2 INT); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --插入数据。 gaussdb=# INSERT INTO test_t9 VALUES(1, 1), (2, 2), (3, 3); INSERT 0 3 --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t9 VALUES((SELECT f1 FROM test_t9), 0); WARNING: more than one row returned by a subquery used as an expression CONTEXT: referenced column: f1 INSERT 0 1 --查询表。 gaussdb=# SELECT * FROM test_t9 WHERE f2 = 0; f1 | f2 ----+---- | 0 (1 row) --删除表。 gaussdb=# DROP TABLE test_t9; DROP TABLE 示例6:数据过长 --建表。 gaussdb=# CREATE TABLE test_t10(f1 VARCHAR(5)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t10 VALUES('aaaaaaaaa'); WARNING: value too long for type character varying(5) CONTEXT: referenced column: f1 INSERT 0 1 --查询表。 gaussdb=# SELECT * FROM test_t10; f1 ------- aaaaa (1 row) --删除表。 gaussdb=# DROP TABLE test_t10; DROP TABLE 示例7:时间函数溢出 --建表。 gaussdb=# CREATE TABLE test_t11(f1 DATETIME); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f1' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t11 VALUES(date_sub('2000-01-01', INTERVAL 2001 YEAR)); WARNING: Datetime function: datetime field overflow CONTEXT: referenced column: f1 INSERT 0 1 --查询表。 gaussdb=# SELECT * FROM test_t11; f1 ---- (1 row) --删除表。 gaussdb=# DROP TABLE test_t11; DROP TABLE 示例8:被0除 --建表。 gaussdb=# CREATE TABLE test_t12(f1 INT); CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t12 VALUES(1/0); WARNING: division by zero CONTEXT: referenced column: f1 INSERT 0 1 --查询表。 gaussdb=# SELECT * FROM test_t12; f1 ---- (1 row) --删除表。 gaussdb=# DROP TABLE test_t12; DROP TABLE 示例9:值不正确 --建表。 gaussdb=# CREATE TABLE test_t13(f0 INT, f1 FLOAT); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'f0' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE --使用IGNORE关键字。 gaussdb=# INSERT IGNORE INTO test_t13 VALUES(1, '1.11aaa'); WARNING: invalid input syntax for type real: "1.11aaa" LINE 1: INSERT IGNORE INTO test_t13 VALUES(1, '1.11aaa'); ^ CONTEXT: referenced column: f1 INSERT 0 1 --查询表。 gaussdb=# SELECT * FROM test_t13; f0 | f1 ----+------ 1 | 1.11 (1 row) --删除表。 gaussdb=# DROP TABLE test_t13; DROP TABLE WITH [ RECURSIVE ] with_query [, ...] 示例: --成绩表。 gaussdb=# CREATE TABLE grade ( sid INT, course VARCHAR(20), score FLOAT ); --学生表。 gaussdb=# CREATE TABLE student( sid INT PRIMARY KEY, class INT, name VARCHAR(50), sex INT CHECK (sex = 0 or sex = 1) ); --插入数据。 gaussdb=# WITH student_sid AS ( INSERT INTO student ( sid, CLASS, NAME, sex ) VALUES ( 1, 1, 'scott', 1 ) RETURNING sid ) INSERT INTO grade ( sid, course, score ) VALUE ( ( SELECT sid FROM student_sid ), 'match', '96' ), ( ( SELECT sid FROM student_sid ), 'chinese', '82' ), ( ( SELECT sid FROM student_sid ), 'english', '86' ); --查询数据。 gaussdb=# SELECT * FROM student; sid | class | name | sex -----+-------+-------+----- 1 | 1 | scott | 1 (1 row) gaussdb=# SELECT * FROM grade; sid | course | score -----+---------+------- 1 | match | 96 1 | chinese | 82 1 | english | 86 (3 rows) --删除。 gaussdb=# DROP TABLE student; gaussdb=# DROP TABLE grade;
  • 优化建议 VALUES 通过INSERT语句批量插入数据时,建议将多条记录合并入一条语句中执行插入,以提高数据加载性能。 例如: INSERT INTO sections VALUES (30, 'Administration', 31, 1900),(40, 'Development', 35, 2000), (50, 'Development' , 60 , 2001); 如果INSERT多VALUES语句中VALUES的值分布在一个DN上,GaussDB可以把语句下推到对应DN执行。目前只支持VALUES中值为常量,简单表达式和可下推函数(pg_proc中字段provolatile为'i')。如果表中列带有DEFAULT值,只支持DEFAULT值为常量,简单表达式。单VALUES不能下推单DN的语句,多VALUES同样不支持下推。
  • 语法格式 1 2 3 4 5 6 7 [ WITH [ RECURSIVE ] with_query [, ...] ] INSERT [/*+ plan_hint */] [ IGNORE ] INTO table_name [ { [alias_name] [ ( column_name [, ...] ) ] } | { [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] } ] { DEFAULT VALUES | { VALUES | VALUE } {( { expression | DEFAULT } [, ...] ) }[, ...] | query } [ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] } ] [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ];
  • 注意事项 表的所有者、拥有表INSERT权限的用户或拥有INSERT ANY TABLE权限的用户,可向表中插入数据,三权分立关闭时的系统管理员默认拥有此权限。 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 如果使用ON DUPLICATE KEY UPDATE,用户必须要有该表的INSERT、UPDATE权限,UPDATE子句中列的SELECT权限。 如果使用query子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 如果使用query子句插入来自查询动态数据脱敏列的数据,插入的结果即为脱敏后的值,无法被还原。 当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的INSERT语句中(不包含外表的场景下),对目标表中CHAR和VARCHAR类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 --查询当前集群的节点名称。 gaussdb=# SELECT node_name,oid FROM pgxc_node WHERE node_type IN ('C','D') ORDER BY 1; node_name | oid -------------------+------- cn_5001 | 15517 cn_5002 | 16387 cn_5003 | 16391 dn_6001_6002_6003 | 16384 dn_6004_6005_6006 | 16388 dn_6007_6008_6009 | 16392 (6 rows) --创建以range分布的表,并插入数据。 gaussdb=# CREATE TABLE tbl_range( id INT, name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY RANGE(id)( SLICE s1 VALUES LESS THAN (100) DATANODE dn_6001_6002_6003, SLICE s2 VALUES LESS THAN (200) DATANODE dn_6004_6005_6006, SLICE s3 VALUES LESS THAN (MAXVALUE) DATANODE dn_6007_6008_6009 ); gaussdb=# INSERT INTO tbl_range VALUES (52,'Bob','Beijing','China'), (100,'Ben','Shanghai','China'), (150,'Scott','Guangzhou','China'), (300,'Jordan','Beijing','China'); --查询该表分布在dn_6007_6008_6009节点上的数据。 gaussdb=# EXECUTE DIRECT ON(dn_6007_6008_6009) 'SELECT * FROM tbl_range'; id | name | province | country -----+--------+----------+--------- 300 | Jordan | Beijing | China (1 row) --删除表tbl_range。 gaussdb=# DROP TABLE tbl_range;
  • 注意事项 当enable_nonsysadmin_execute_direct=off时,只有系统管理员和监控管理员才能执行EXECUTE DIRECT。 为了各个节点上数据的一致性,SQL语句仅支持SELECT,不允许执行事务语句、DDL、DML。 使用此类型语句在指定的DN执行stddev聚集计算时,返回结果集是以三元数组形式返回,如{3, 8, 30},表示count结果为3,sum结果为8,平方和为30。使用此类型语句在指定的DN执行AVG聚集计算时,返回结果集以二元组形式返回,如{4,2},表示count结果为4,sum结果为2。 当指定多个节点时,不支持agg函数,当query中包含agg函数时,会返回“EXECUTE DIRECT on multinode not support agg functions.” 由于CN节点不存储用户表数据,不允许指定CN节点执行用户表上的SELECT查询。 不允许执行嵌套的EXECUTE DIRECT语句,即执行的SQL语句不能同样是EXECUTE DIRECT语句,此时可直接执行最内层EXECUTE DIRECT语句代替。 agg函数查询结果与直接在CN上查询不一致,会返回多个信息,不支持array_avg函数。 参数为nodeoid或者nodeoid list时,仅支持分布式下参数enable_direct_standby_datanodes成功设置时才生效。实现到指定DN节点查询,不支持无效或重复nodeoid,以及不支持nodeoid和nodename混合使用。
  • 注意事项 在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单步调试。 其余注意事项同存储过程及函数一致。
  • 语法格式 创建子存储过程语法格式: 1 2 3 4 5 6 7 8 PROCEDURE procedure_name [ (parameters) ] [{IMMUTABLE | STABLE | VOLATILE } | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }] { IS | AS } [ declarations ] BEGIN plsql_body END; 创建子函数语法: 1 2 3 4 5 6 7 8 FUNCTION function_name [ (parameters) ] RETURN rettype [{IMMUTABLE | STABLE | VOLATILE } | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }] { IS | AS } [ declarations ] BEGIN plsql_body END; 在declarations部分可再定义下层的嵌套子程序。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 -- 创建一个存储过程 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 procedure this is subpragram ANONYMOUS BLOCK EXECUTE
  • 参数说明 function_name 要修改的函数名称。 取值范围:已存在的函数名。 argmode 标识该参数是输入、输出参数。 取值范围: IN:声明入参。 OUT:声明出参。 INOUT:声明出入参。 VARIADIC:声明数组类型的参数。 argname 参数名称。 取值范围:字符串,符合标识符命名规范。 argtype 参数类型。 取值范围:有效的类型,请参考数据类型。 CALLED ON NULL INPUT 表明该函数的某些参数是NULL的时候可以按照正常的方式调用。缺省时与指定此参数的作用相同。 RETURNS NULL ON NULL INPUT STRICT STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,则如果存在NULL参数时不会执行该函数,而只是自动假设一个NULL结果。 RETURNS NULL ON NULL INPUT和STRICT的功能相同。 IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,不会做任何优化。 SHIPPABLE NOT SHIPPABLE 表示该函数是否可以下推到DN上执行。 对于IMMUTABLE类型的函数,函数始终可以下推到DN上执行。 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。 LEAKPROOF 表示该函数没有副作用,指出参数只包括返回值。LEAKPROOF只能由系统管理员设置。 EXTERNAL (可选)目的是和SQL兼容,这个特性适合于所有函数,而不仅是外部函数 SECURITY INVOKER AUTHID CURRENT_USER 表明该函数将以调用它的用户的权限执行。缺省时与指定此参数的作用相同。 SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。 SECURITY DEFINER AUTHID DEFINER 声明该函数将以创建它的用户的权限执行。 AUTHID DEFINER和SECURITY DEFINER的功能相同。 COST execution_cost 用来估计函数的执行成本。 execution_cost以cpu_operator_cost为单位。 取值范围:正数。 ROWS result_rows 估计函数返回的行数。用于函数返回的是一个集合。 取值范围:正数,默认值是1000行。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串。 DEFAULT OFF RESET 用户指定的值:需要满足修改参数的取值限制。 FROM CURRENT 取当前会话中的值设置为configuration_parameter的值。 new_name 函数的新名称。要修改函数的所属模式,必须拥有新模式的CREATE权限。 取值范围:字符串,符合标识符命名规范。 new_owner 函数的新所有者。要修改函数的所有者,新所有者必须拥有该函数所属模式的CREATE权限。需要注意注意的是:仅有初始化用户才可以将函数的owner设置为初始化用户。 取值范围:已存在的用户角色。 new_schema 函数的新模式。 取值范围:已存在的模式。
  • 示例 修改函数示例: --创建函数。 gaussdb=# CREATE OR REPLACE FUNCTION test_func(a int) RETURN int IS proc_var int; BEGIN proc_var := a; return 1; END; / --将函数test_func(a int)的名称修改为test_func_tk(a int)。 gaussdb=# ALTER FUNCTION test_func(a int) RENAME TO test_func_tk; --创建jim用户。 gaussdb=# CREATE USER jim PASSWORD '********'; --新建模式test。 gaussdb=# CREATE SCHEMA test; --将函数的所有者改为jim。 gaussdb=# ALTER FUNCTION test_func_tk(a int) OWNER TO jim; --将函数模式改为test。 gaussdb=# ALTER FUNCTION test_func_tk(a int) SET SCHEMA test; --删除函数。 gaussdb=# DROP FUNCTION test.test_func_tk(a int); --删除jim用户。 gaussdb=# DROP USER jim; --删除SCHEMA。 gaussdb=# DROP SCHEMA test;
  • 语法格式 修改自定义函数的附加参数。 1 2 ALTER FUNCTION function_name ( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) action [ ... ] [ RESTRICT ]; 其中附加参数action子句语法为: 1 2 3 4 5 6 7 8 9 10 11 {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT} | {IMMUTABLE | STABLE | VOLATILE} | {SHIPPABLE | NOT SHIPPABLE} | {NOT FENCED | FENCED} | [ NOT ] LEAKPROOF | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER } | AUTHID { DEFINER | CURRENT_USER } | COST execution_cost | ROWS result_rows | SET configuration_parameter { { TO | = } { value | DEFAULT }| FROM CURRENT} | RESET {configuration_parameter | ALL} 修改自定义函数的名称。 1 2 ALTER FUNCTION function_name ( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) RENAME TO new_name; 修改自定义函数的所有者。 1 2 ALTER FUNCTION function_name ( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) OWNER TO new_owner; 修改自定义函数的模式。 1 2 ALTER FUNCTION function_name ( [ { [ argname ] [ argmode ] argtype} [, ...] ] ) SET SCHEMA new_schema;
  • 注意事项 只有函数的所有者或者被授予了函数ALTER权限的用户才能执行ALTER FUNCTION命令,系统管理员默认拥有该权限。针对所要修改属性的不同,对其还有以下权限约束: 如果函数中涉及对临时表相关的操作,则无法使用ALTER FUNCTION。 修改函数的所有者或修改函数的模式,当前用户必须是该函数的所有者或者系统管理员,且该用户是新所有者角色的成员。 只有系统管理员和初始化用户可以将function的schema修改成public。
  • 示例 gaussdb=# DECLARE v_num integer default NULL; BEGIN IF v_num IS NOT NULL THEN raise info 'v_num is NULL'; ELSE NULL; -- 不需要处理任何数据。 END IF; END; / ANONYMOUS BLOCK EXECUTE
  • 接口介绍 根据输入的参数,返回目标数据块中行的最后修改时间等信息,用于直观浏览每一行被判定为冷、热行的依据。该接口属于运维类接口,不做可见性判断,即传入的ctid为已删除的行时,该接口依然会返回当前行在页面上最新的状态。 表1 DBE_HEAT_MAP 接口名称 描述 ROW_HEAT_MAP 根据对象所属Schema、数据对象名称、数据对象分区名及ctid获取行的最后修改时间等信息。 DBE_HEAT_MAP.ROW_HEAT_MAP 根据对象所属Schema、数据对象名称、数据对象分区名及ctid获取行的最后修改时间等信息,原型为: 1 2 3 4 5 DBE_HEAT_MAP.ROW_HEAT_MAP( owner IN VARCHAR2, segment_name IN VARCHAR2, partition_name IN VARCHAR2 DEFAULT NULL, ctid IN TEXT); 表2 DBE_HEAT_MAP.ROW_HEAT_MAP接口参数说明 参数 描述 owner 数据对象所属Schema。 segment_name 数据对象名称。 partition_name 数据对象分区名,可选参数,默认为NULL。 ctid 数据行ID。 DBE_HEAT_MAP.ROW_HEAT_MAP 接口只支持 分布式数据库 中数据节点(DN),其他节点暂不支持。
  • 备份原理 图1 全量备份示意图 全量备份:第一次的全量备份后,无论数据是否变化,第二次备份和第三次备份都会将所有的数据全部进行备份。 图2 差量备份示意图 差量备份:第一次的全量备份之后,第二次备份只会备份数据变化的数据,第三次备份会备份第一次全量备份后数据变化的数据。 图3 增量备份示意图 增量备份:第一次的全量备份之后,第二次备份只会备份数据变化的数据,第三次备份只会备份第二次备份后数据变化的数据。
  • 使用示例 新建脚本文件。 新建一个test_jaydebeapi.py文件,写入代码如下: #!/usr/bin/env python3.x # -*- coding: UTF-8 -*- encoding = "utf8" import jaydebeapi def test_jaydebeapi(): #需要配置的参数 url = 'jdbc:opengauss://***.***.***.***:20000/test' user = '***' password = '******' driver = 'com.huawei.opengauss.jdbc.Driver' jarFile = './opengaussjdbc.jar' conn = jaydebeapi.connect(driver, url, [user, password], jarFile) cur = conn.cursor() #创建表students sql = 'create table students (id int, name varchar(20))' cur.execute(sql) #往students表中插入三组数据 sql = "insert into students values(1,'xiaoming'),(2,'xiaohong'),(3,'xiaolan')" cur.execute(sql) #查询students表中的所有数据 sql = 'select * from students' cur.execute(sql) ans = cur.fetchall() print(ans) #更新students表中的数据 sql = 'update students set name = \'xiaolv\' where id = 1' cur.execute(sql) #再次查询students表中的所有数据 sql = 'select * from students' cur.execute(sql) ans = cur.fetchall() print(ans) #删除表students sql = 'drop table students' cur.execute(sql) cur.close() conn.close() test_jaydebeapi() 配置代码中的参数: #连接url,设置数据库服务器IP、端口、数据库名 url = 'jdbc:opengauss://***.***.***.***:20000/test' #设置用户名 user = '***' #设置密码 password = '******' #JDBC驱动类路径 driver = 'com.huawei.opengauss.jdbc.Driver' #JDBC驱动jar包路径(默认放在与test_jaydebeapi.py文件同目录下) jarFile = './opengaussjdbc.jar' 执行程序。 使用以下命令执行test_jaydebeapi.py文件: python ./test_jaydebeapi.py 预期结果。 成功连接 GaussDB数据库 ,并返回两次查询结果,如下所示: 图1 返回两次查询结果
共100000条