华为云用户手册

  • 示例 清理表数据 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 --创建表reason。 gaussdb=# CREATE TABLE reason (r_reason_sk int,r_reason_id varchar(16),r_reason_desc varchar(100)); --向表中插入多条记录。 gaussdb=# INSERT INTO reason values(1,'AAAAAAAABAAAAAAA','reason 1'), (5,'AAAAAAAABAAAAAAA','reason 2'), (15,'AAAAAAAABAAAAAAA','reason 3'), (25,'AAAAAAAABAAAAAAA','reason 4'), (35,'AAAAAAAABAAAAAAA','reason 5'), (45,'AAAAAAAACAAAAAAA','reason 6'); --查看表的信息,大小约为16kB gaussdb=# \d+ List of relations Schema | Name | Type | Owner | Size | Storage | Description --------+--------+-------+-------+-------+----------------------------------+------------- public | reason | table | omm | 16 kB | {orientation=row,compression=no} | (1 row) --使用DELETE语句不带WHERE条件,清空表的数据,并查看表的大小。 gaussdb=# DELETE FROM reason; gaussdb=# \d+ List of relations Schema | Name | Type | Owner | Size | Storage | Description --------+--------+-------+-------+-------+----------------------------------+------------- public | reason | table | omm | 16 kB | {orientation=row,compression=no} | (1 row) --使用TRUNCATE清空表reason,并查看表的大小 gaussdb=# TRUNCATE TABLE reason; gaussdb=# \d+ List of relations Schema | Name | Type | Owner | Size | Storage | Description --------+--------+-------+-------+---------+----------------------------------+------------- public | reason | table | omm | 0 bytes | {orientation=row,compression=no} | (1 row) --删除表。 gaussdb=# DROP TABLE reason; 清理分区表数据。 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 --创建分区表。 gaussdb=# CREATE TABLE reason_p( r_reason_sk integer, r_reason_id character(16), r_reason_desc character(100) )PARTITION BY RANGE (r_reason_sk)( partition p_05_before values less than (05), partition p_15 values less than (15), partition p_25 values less than (25), partition p_35 values less than (35), partition p_45_after values less than (MAXVALUE) ); --插入数据。 gaussdb=# INSERT INTO reason_p values(1,'AAAAAAAABAAAAAAA','reason 1'), (5,'AAAAAAAABAAAAAAA','reason 2'), (15,'AAAAAAAABAAAAAAA','reason 3'), (25,'AAAAAAAABAAAAAAA','reason 4'), (35,'AAAAAAAABAAAAAAA','reason 5'), (45,'AAAAAAAACAAAAAAA','reason 6'); --清空分区p_05_before。 gaussdb=# ALTER TABLE reason_p TRUNCATE PARTITION p_05_before UPDATE GLOBAL INDEX; --清空分区表。 gaussdb=# TRUNCATE TABLE reason_p; --删除表reason_p。 gaussdb=# DROP TABLE reason_p;
  • 语法格式 清理表数据。 1 2 TRUNCATE [ TABLE ] [ ONLY ] {table_name [ * ]} [, ... ] [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ] [ PURGE ]; 清理表分区的数据。 1 2 3 4 5 ALTER TABLE [ IF EXISTS ] { [ ONLY ] table_name | table_name * | ONLY ( table_name ) } TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) } [ UPDATE GLOBAL INDEX ];
  • 注意事项 TRUNCATE TABLE在功能上与不带WHERE子句DELETE语句相同:二者均删除表中的全部行。 TRUNCATE TABLE比DELETE速度快且使用系统和事务日志资源少: DELETE语句每次删除一行,并在事务日志中为所删除每行记录一项。 TRUNCATE TABLE通过释放存储表数据所用数据页来删除数据,并且只在事务日志中记录页的释放。 TRUNCATE、DELETE和DROP三者的差异如下: TRUNCATE TABLE:删除内容,释放空间,但不删除定义。 DELETE TABLE:删除内容,不删除定义,不释放空间。 DROP TABLE:删除内容和定义,释放空间。
  • 参数说明 ONLY 如果声明ONLY,只有指定的表会被清空。如果没有声明ONLY,这个表以及其所有子表(若有)会被清空。 table_name 目标表的名称(可以有模式修饰)。 取值范围:已存在的表名。 CONTINUE IDENTITY 不改变序列的值。这是缺省值。 CASCADE | RESTRICT CASCADE:级联清空所有由于CASCADE而被添加到组中的表。 RESTRICT(缺省值):如果其他表在该表上有外键(分布式场景暂不支持)引用则拒绝清空。 PURGE 默认将表数据放入回收站中,PURGE直接清理。 partition_name 目标分区表的分区名。 取值范围:已存在的分区名。 partition_value 指定的分区键值。 通过PARTITION FOR子句指定的这一组值,可以唯一确定一个分区。 取值范围:需要进行删除数据分区的分区键的取值范围。 使用PARTITION FOR子句时,partition_value所在的整个分区会被清空。
  • GS_GLOBAL_ARCHIVE_STATUS GS_GLOBAL_ARCHIVE_STATUS视图描述CN和所有分片的归档进度,获取分片名称(node_name)、归档位置(restart_lsn)、实际进行归档的主/备机名称(archive_node)和当前日志位置(current_xlog_location)。查询此视图需要数据库开启归档功能,并从CN节点进行查询,需要monitor admin和sysadmin权限。具体字段信息如表1所示。 表1 GS_GLOBAL_ARCHIVE_STATUS字段 名称 类型 描述 node_name text 分片名称。 restart_lsn text 归档位置。 archive_node text 实际进行归档的主/备机名称。 current_xlog_location text 当前日志位置。 父主题: 其他系统视图
  • 语法格式 1 CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [EXPIRED] | DISABLE }; 其中角色信息设置子句option语法为: 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 {SYSADMIN | NOSYSADMIN} | {MONADMIN | NOMONADMIN} | {OPRADMIN | NOOPRADMIN} | {POLADMIN | NOPOLADMIN} | {AUDITADMIN | NOAUDITADMIN} | {CREATEDB | NOCREATEDB} | {USEFT | NOUSEFT} | {CREATEROLE | NOCREATEROLE} | {INHERIT | NOINHERIT} | { LOG IN | NOLOGIN} | {REPLICATION | NOREPLICATION} | {PERSISTENCE | NOPERSISTENCE} | CONNECTION LIMIT connlimit | VALID BEGIN 'timestamp' | VALID UNTIL 'timestamp' | RESOURCE POOL 'respool' | USER GROUP 'groupuser' | PERM SPACE 'spacelimit' | TEMP SPACE 'tmpspacelimit' | SPILL SPACE 'spillspacelimit' | NODE GROUP logic_cluster_name | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] | ADMIN role_name [, ...] | USER role_name [, ...] | SYSID uid | DEFAULT TABLESPACE tablespace_name | PROFILE DEFAULT | PROFILE profile_name | PGUSER
  • 参数说明 OR REPLACE 可选。如果视图已存在,则重新定义。 TEMP | TEMPORARY 可选。创建一个临时视图。在当前会话结束时会自动删除掉视图。如果视图引用的任何表是临时表,视图将被创建为临时视图(不管SQL中有没有指定TEMP|TEMPORARY)。 view_name 要创建的视图名称。可以用模式修饰。 取值范围:字符串,符合标识符命名规范。 column_name 可选的名称列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。 取值范围:字符串,符合标识符命名规范。 view_option_name [= view_option_value] 该子句为视图指定一个可选的参数。 目前view_option_name支持的参数仅有security_barrier和check_option。 security_barrier:当VIEW视图提供行级安全时,应使用该参数。取值范围:Boolean类型(true、false)。 check_option:控制更新视图的行为。取值范围:CASCADED、LOCAL。 query 为视图提供行和列的SELECT或VALUES语句。 若query包含指定分区表分区的子句,创建视图会将所指定分区的OID硬编码到系统表中。如果使用导致指定分区的OID发生变更的分区DDL语法,如DROP/SPLIT/MERGE该分区,则会导致视图不可用。需要重新创建视图。
  • 功能描述 创建一个视图。视图与基本表不同,是一个虚拟的表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。 将经常使用的数据定义为视图,可以将复杂的查询SQL语句进行封装。简化操作。 安全性,用户只能查询视图定义的数据。隐藏基表字段,保护数据库的数据结构。 简化用户权限的管理,只授予用户使用视图的权限。
  • 语法格式 1 2 3 4 CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ] [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ] AS query [ WITH [ CASCADED | LOCAL ] CHECK OPTION | WITH READ ONLY ]; 创建视图时使用WITH(security_barrier)可以创建一个相对安全的视图,避免攻击者利用低成本函数的RAISE语句打印出基表数据。 当视图创建后,不允许使用REPLACE修改本视图当中的列名,也不允许删除列。
  • GS_STATIC_THREADPOOL_CTRL_STATUS GS_STATIC_THREADPOOL_CTRL_STATUS返回当前实例线程池相关静态线程的统计信息。线程池开启状态下,CN线程池支持该视图查询。连接DN查询返回空行;线程池关闭下返回空行;参数static_thread_pool_num设置为0或小于线程池group数时静态线程池默认值为0。查询该视图需要PUBLIC权限。 表1 GS_STATIC_THREADPOOL_CTRL_STATUS字段 名称 类型 描述 node_name text 实例名。 group_id integer 线程池group组id。 worker_info text 描述当前group组线程池运行中的动态的统计信息。包括如下信息: default、default_s:线程数量。动态线程池默认值,静态线程池默认值。 expect、expect_s:线程数量。动态线程池预期值,静态线程池预期值。 actual:实际运行的线程数量,包括动态池线程和静态池线程。 static threads limit:当前group组配置的静态池线程数。 has static threads:当前group组是否创建静态池。默认为0,表示没有创建。 idle static threads:空闲的静态池线程个数。 wait session num:等待的会话数。 父主题: 通信
  • 安全策略管理员 安全策略管理员是指具有POLADMIN属性的账户,具有创建资源标签、脱敏策略和统一审计策略的权限。 要创建新的安全策略管理员,请以系统管理员用户身份连接数据库,并使用带POLADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER poladmin WITH POLADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe POLADMIN; ALTER USER时,要求用户已存在。
  • 系统管理员 系统管理员是指具有SYSADMIN属性的账户,默认安装情况下具有与对象所有者相同的权限,但不包括dbe_perf模式的对象权限。 要创建新的系统管理员,请以初始用户或者系统管理员用户身份连接数据库,并使用带SYSADMIN选项的CREATE USER语句或ALTER USER语句进行设置。 1 gaussdb=# CREATE USER sysadmin WITH SYSADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe SYSADMIN; ALTER USER时,要求用户已存在。
  • 审计管理员 审计管理员是指具有AUDITADMIN属性的账户,具有查看和删除审计日志的权限。 要创建新的审计管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库。三权分立打开时,只能以初始用户身份连接数据库,并使用带AUDITADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER auditadmin WITH AUDITADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe AUDITADMIN; ALTER USER时,要求用户已存在。
  • 运维管理员 运维管理员是指具有OPRADMIN属性的账户,具有使用Roach工具执行备份恢复的权限。 要创建新的运维管理员,请以初始用户身份连接数据库,并使用带OPRADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER opradmin WITH OPRADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe OPRADMIN; ALTER USER时,要求用户已存在。
  • 安全管理员 安全管理员是指具有CREATEROLE属性的账户,具有创建、修改、删除用户或角色的权限,和授予或者撤销任何非系统管理员、内置角色、永久用户、运维管理员的权限。 要创建新的安全管理员,三权分立关闭时,请以系统管理员或者安全管理员身份连接数据库。三权分立打开时,请以安全管理员身份连接数据库,并使用带CREATEROLE选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER createrole WITH CREATEROLE password "********"; 或者 1 gaussdb=# ALTER USER joe CREATEROLE; ALTER USER时,要求用户已存在。
  • 监控管理员 监控管理员是指具有MONADMIN属性的账户,具有查看dbe_perf模式下视图和函数的权限,亦可以对dbe_perf模式的对象权限进行授予或收回。 要创建新的监控管理员,请以系统管理员身份连接数据库,并使用带MONADMIN选项的CREATE USER语句或 ALTER USER语句进行设置。 1 gaussdb=# CREATE USER monadmin WITH MONADMIN password "********"; 或者 1 gaussdb=# ALTER USER joe MONADMIN; ALTER USER时,要求用户已存在。
  • 初始用户 集群安装过程中自动生成的账户称为初始用户。初始用户也是系统管理员、安全管理员、审计管理员、监控管理员、运维管理员和安全策略管理员,拥有系统的最高权限,能够执行所有的操作。如果安装时不设置初始用户名称,则该账户与进行集群安装的操作系统用户同名。如果在安装集群时不设置初始用户的密码,安装完成后密码为空,在执行其他操作前需要通过gsql客户端修改初始用户的密码。如果初始用户密码为空,则除修改密码外,无法执行其他SQL操作以及升级、扩容、节点替换等操作。 初始用户的oid为10,可以通过gs_roles视图查询。 初始用户会绕过所有权限检查。建议仅将初始用户作为DBA管理用途,而非业务应用。
  • PG_TS_DICT PG_TS_DICT系统表包含定义文本搜索字典的记录。字典取决于文本搜索模板,该模板声明所有需要的实现函数;字典本身提供模板支持的用户可设置的参数的值。 这种分工允许字典通过非权限用户创建。参数由文本字符串dictinitoption指定,参数的格式和意义取决于模板。 表1 PG_TS_DICT字段 名称 类型 引用 描述 oid oid - 行标识符(隐含字段,必须明确选择)。 dictname name - 文本搜索字典名。 dictnamespace oid PG_NAMESPACE.oid 包含字典的名称空间的OID。 dictowner oid PG_AUTHID.oid 字典的所有者。 dicttemplate oid PG_TS_TEMPLATE.oid 字典的文本搜索模板的OID。 dictinitoption text - 该模板的初始化选项字符串。 父主题: 其他系统表
  • ecpg预处理以及编译执行 准备嵌入式SQL-C源程序,以.pgc为后缀名,ecpg负责将其转换成可被编译器编译的C语言程序。 生成的C语言程序被gcc编译器编译为可执行文件,运行该可执行文件实现客户端程序访问数据库。示例请参见常用示例章节。 ecpg预处理以及编译处理过程 预处理:ecpg -I $GAUSSHOME/include -o test.c test.pgc ecpg预处理的参数选项如下: ecpg [OPTION]... 其中OPTION参数选项如下: -o OUTFILE:预处理嵌入式SQL-C程序将结果写入OUTFILE,OUTFILE为C语言文件。 -I DIRECTORY:头文件的搜索路径。 -c:预处理嵌入式SQL-C程序自动生成C语言文件。 --version:查看ecpg当前版本。 -C MODE:指定预处理兼容模式,“ORA”为O兼容。 -r OPTION:指定运行时的行为。OPTION可以是:no_indicator、prepare、questionmarks或with_hold。 no_indicator:使用特殊值来表示空值。 prepare:在使用语句之前先prepare所有语句。 questionmarks:允许使用问号作为占位符。 with_hold:对于未指定HOLD关键字创建的游标,当指定该选项后,游标行为默认为WITH HOLD(该功能需要ecpg和内核版本一致)。 编译:gcc -I $GAUSSHOME/include/ecpg -I $GAUSSHOME/include -I $GAUSSHOME/include/gaussdb/server/ -L $GAUSSHOME/lib -lecpg -lrt -lpq -lpgtypes -lpthread test_ecpg.c -o test_ecpg 执行:./test ecpg作为编译预处理工具,若在预处理或编译过程中出现找不到头文件或者函数实现的报错信息,可以根据需要指定头文件,或者链接动态库。 ecpg需要gcc、ld等编译预处理工具,建议gcc使用7.3.0版本。 使用ecpg开发应用程序所依赖的其他动态库和头文件,常见的位于$GAUSSHOME/include/libpq, $GAUSSHOME/include。 编译过程中常见的动态库依赖:-lpq、-lpq_ce、-lpthread。若开发过程中需要使用libpq通信库,则需要连接-lpq和-lpq_ce。若开发过程中需要使用多线程连接,则需要连接-lpthread。 父主题: 基于ecpg开发
  • 定时任务管理 创建测试表。 1 gaussdb=# CREATE TABLE test(id int, time date); 当结果显示为如下信息,则表示创建成功。 1 CREATE TABLE 创建自定义存储过程。 1 2 3 4 5 6 7 8 9 gaussdb=# CREATE OR REPLACE PROCEDURE PRC_JOB_1() AS N_NUM integer :=1; BEGIN FOR I IN 1..1000 LOOP INSERT INTO test VALUES(I,SYSDATE); END LOOP; END; / 当结果显示为如下信息,则表示创建成功。 1 CREATE PROCEDURE 创建任务。 新创建的任务(未指定job_id)表示每隔1分钟执行一次存储过程PRC_JOB_1。 1 2 3 4 5 gaussdb=# CALL dbe_task.submit('CALL public.prc_job_1(); ', sysdate, 'interval ''1 minute''', :a); id ----- 1 (1 row) 指定job_id创建任务,其中job_id可用范围为1~32767。 1 2 3 4 5 gaussdb=# CALL dbe_task.id_submit(1,'call public.prc_job_1(); ', sysdate, 'interval ''1 minute'''); id_submit ---------- (1 row) 通过视图查看当前用户已创建的任务信息。 1 2 3 4 5 gaussdb=# SELECT job,dbname,start_date,last_date,this_date,next_date,broken,status,interval,failures,what FROM my_jobs; job | dbname | start_date | last_date | this_date | next_date | broken | status | interval | failures | what -----+--------+---------------------+----------------------------+----------------------------+---------------------+--------+--------+---------------------+----------+--------------------------- 1 | testdb | 2017-07-18 11:38:03 | 2017-07-18 13:53:03.607838 | 2017-07-18 13:53:03.607838 | 2017-07-18 13:54:03 | n | s | interval '1 minute' | 0 | call public.prc_job_1(); (1 row) 停止任务。 1 2 3 4 5 gaussdb=# CALL dbe_task.finish(1,true); finish -------- (1 row) 启动任务。 1 2 3 4 5 gaussdb=# CALL dbe_task.finish(1,false); finish -------- (1 row) 修改任务属性。 修改JOB的next_time参数信息。 1 2 3 4 5 6 --修改Job1的next_time为1小时以后开始执行。 gaussdb=# CALL dbe_task.next_time(1, sysdate+1.0/24); next_time ----------- (1 row) 修改JOB的interval参数信息。 1 2 3 4 5 6 --修改Job1的interval为每隔1小时执行一次。 gaussdb=# CALL dbe_task.interval(1,'sysdate + 1.0/24'); interval ---------- (1 row) 修改JOB的what参数信息。 1 2 3 4 5 6 --修改Job1的what为执行SQL语句“INSERT INTO public.test VALUES(333, sysdate+5);”。 gaussdb=# CALL dbe_task.content(1,'INSERT INTO public.test VALUES(333, sysdate+5);'); content ------ (1 row) 同时修改JOB的next_date、interval、what等多个参数信息。 1 2 3 4 5 gaussdb=# CALL dbe_task.update(1, 'CALL public.prc_job_1();', sysdate, 'interval ''1 minute'''); update -------- (1 row) 查看JOB执行情况。 当JOB自动执行时,如果JOB执行失败(即job_status状态值为'f')时,请联系管理员查看gs_log的运行日志来查看JOB的失败信息。 日志信息如下所示,从失败信息(detail error msg)中可以查看失败的具体错误。 LOG: Execute Job Detail: job_id: 1 what: call public.test(); start_date: 2017-07-19 23:30:47.401818 job_status: failed detail error msg: relation "test" does not exist end_date: 2017-07-19 23:30:47.401818 next_run_date: 2017-07-19 23:30:56.855827 删除JOB。 1 2 3 4 5 gaussdb=# CALL dbe_task.cancel(1); cancel -------- (1 row) JOB的权限控制。 当创建一个JOB时,该JOB会和创建该JOB的数据库和用户绑定(即:pg_job系统表新增的JOB记录中的dbname和log_user)。 DBA用户、系统管理员或该JOB的创建用户,可通过高级包接口remove、change、next_data、what、interval删除或修改JOB的参数信息。否则,会提示当前用户没有权限操作该JOB。 如果当前数据库是该JOB创建所属的数据库,那么连接到当前数据库上可以通过高级包接口cancel、update、next_data、content、interval删除或修改JOB的参数信息。 当删除JOB所属的数据库时,系统会关联删除该数据库从属的JOB记录。 当删除JOB所属的用户时,系统会关联删除该用户从属的JOB记录。 JOB的并发控制管理。 用户可以通过配置GUC参数job_queue_processes调整并发同时执行的JOB数目。 当job_queue_processes为0时,表示不启用定时任务功能,任何JOB都不会被执行。 当job_queue_processes为大于0时,表示启用定时任务功能且系统能够并发处理的最大任务数。 由于并行运行的任务数太多会消耗更多的系统资源,因此需要设置系统并发处理的任务数,当前并发的任务数达到job_queue_processes时,且此时又有任务到期,那么这些任务本次得不到执行而延期到下一轮询周期。因此,建议用户需要根据每个任务的执行时长合理的设置任务的时间间隔(即submit接口中的interval参数),来避免由于任务执行时间太长而导致下个轮询周期无法正常执行。 注:对于不使用JOB的集群中,用户可以通过在集群安装初始化完成后,通过设置job_queue_processes为0来关闭JOB功能,减少系统资源的消耗。
  • 背景信息 当客户在使用数据库过程中,如果白天执行一些耗时比较长的任务(例如:统计数据汇总之类或从其他数据库同步数据的任务),会对正常的业务有性能影响,所以客户经常选择在晚上执行,无形中增加了客户的工作量。因此 GaussDB Kernel数据库兼容ORA数据库中定时任务的功能,可以由客户创建定时任务,当任务时间点到达后可以自动触发任务的执行,从而可以减少客户运维的工作量。 GaussDB Kernel数据库兼容ORA定时任务功能主要通过DBE_SCHEDULER和DBE_TASK高级包提供的接口,可以实现定时任务的创建、任务到期自动执行、任务删除和修改任务属性(包括:任务id、任务的关闭开启、任务的触发时间、触发时间间隔和任务内容等)。推荐使用DBE_SCHEDULER接口,保证高可用性、高可靠性,并且支持更灵活的任务调度。接口说明、迁移指导示例请参见DBE_SCHEDULER章节。 PG_JOB系统表中next_run_date字段标识定时任务实际开始执行的时间,而不是计划任务开始的时间。 当前定时任务计算开始执行的时间依赖于上一次任务的实际执行时间,在不指定freq时会导致执行时间有较短时间的偏差。 1 2 3 4 5 gaussdb=# SELECT start_date, next_run_date, interval FROM pg_job WHERE job_name = 'job1'; start_date | next_run_date | interval ---------------------------+----------------------------+-------------------- 2024-12-03 15:24:11.94422 | 2024-12-03 15:26:12.197623 | interval'1 minute' (1 row)
  • 带索引的集合类型 该集合类型将下标和对应成员值以键值对的方式存储在HASH表中,对该类型变量的所有操作实际就是对HASH表的操作。用户无需自行扩展或释放存储空间,仅需通过赋值或delete方式进行存储和删除成员。集合相关操作、说明如下: 类型定义 索引集合类型定义需同时指定成员类型data_type和下标类型indexby_type,其中下标类型仅支持INTEGER和VARCHAR。 变量声明和初始化 索引集合类型声明后存在3种初始化场景:未初始化、初始化为空、初始化指定下标和成员值。其中未初始化和初始化为空场景对变量的效果一致。未初始化或初始化为空后变量不为NULL,后续都可以对变量直接进行赋值。初始化指定下标和成员值场景会将指定的下标和成员值以键值对的形式保存到变量中。 变量赋值 索引集合类型变量赋值分为2种:成员赋值和整体赋值。成员赋值可通过指定下标方式对某个成员赋值,若该成员不存在则直接赋值,若存在则刷新该成员值。整体赋值则会将被赋值变量中原有成员都清空后重新保存新的成员值。整体赋值场景不能给变量赋NULL值,否则报错。 变量取值 通过指定下标方式可获取变量中对应下标的成员值,若通过下标找不到该成员则会返回no data found的错误信息。 使用约束 仅支持在兼容ORA模式下(参数sql_compatibility值为ORA)创建带索引集合类型。 支持在匿名块、存储过程、自定义函数、package中定义带索引集合类型,其作用域各不相同。不支持在schema中定义带索引集合类型。 NOT NULL只支持语法不支持功能。 当data_type为VARCHAR、NUMERIC等可以定义长度和精度的类型时,要校验集合的元素长度或者将元素转换成对应的精度,需要开启tableof_elem_constraints参数(设置behavior_compat_options参数值为tableof_elem_constraints)。 data_type为数组类型时,数组类型的元素长度校验或精度转换也受参数tableof_elem_constraints是否开启影响。 通过数组类型转换成的集合类型的值不支持对元素长度校验或精度转换。 data_type可以为基础数据类型,或存储过程内定义的record类型、集合类型和数组类型,不支持ref cursor类型。 indexby_type仅支持INTEGER和VARCHAR。 indexby_type为VARCHAR时,开启参数tableof_elem_constraints后在对带索引集合类型赋值时会校验index值的长度,校验行为不受char_coerce_compat参数是否开启影响,index长度大于定义长度则报错;不开启参数tableof_elem_constraints则不会对索引值进行长度校验。 未初始化的带索引集合类型变量非NULL。 带索引集合类型变量不能赋NULL值,否则报错。 带索引集合类型变量作为入参不能赋NULL值或''。 不同的带索引集合类型的变量不能相互赋值。即使成员类型和下标类型相同,但集合类型名称不同,也是不同的集合类型。如 TYPE t1 IS TABLE OF int index by int; 和 TYPE t2 IS TABLE OF int index by int; 定义的两个集合类型,t1和t2是不同的集合类型,以其定义的变量不支持相互赋值(作为成员类型时该约束不保证生效,赋值逻辑受父类型影响)。 带索引集合类型不支持关系运算和算数运算操作。 SELECT ... bulk collect INTO 方式赋值带索引集合类型变量时,只支持下标为INTEGER类型的集合类型,下标为VARCHAR类型集合不支持。 支持带索引集合类型变量作为函数的参数和返回值,此时要求参数或者返回值的类型是在package中定义的集合类型。 带索引的集合作为函数入参时,可以传入对应子元素类型相同的数组类型作为入参,不支持多维数组,不支持索引类型为VARCHAR(过时的方法,不建议使用该功能。可执行“SET behavior_compat_options = 'disable_rewrite_nesttable';”禁用)。 类型构造器目前仅支持集合类型,其参数个数的上限与用户自定义函数参数个数上限相同。对于带索引的集合类型,构造器在使用时索引的值仅支持为常量。 不支持对XML类型数据操作。 集合类型以及嵌套集合的类型不支持作为表中的一列来创建表。 集合类型的构造器不支持浮点数以及表达式作为下标。 在匿名块中定义的集合类型,匿名块执行ROLLBACK或发生EXCEPTION后,集合类型将无法继续使用。 设置GUC参数enable_recordtype_check_strict为on后,若成员是record类型,且record类型有列具有not null属性或default属性,在存储过程或PACKAGE编译时会报错。 不支持在DML语句中访问非Schema中定义的集合类型的元素。
  • GLOBAL_OS_THREADS 提供整个集群中所有正常节点下的线程状态信息,如表1所示。 表1 GLOBAL_OS_THREADS字段 名称 类型 描述 node_name text 当前节点的名称。 pid bigint 当前节点进程中正在运行的线程号。 lwpid integer 与pid对应的轻量级线程号。 thread_name text 与pid对应的线程名称。 creation_time timestamp with time zone 与pid对应的线程创建的时间。 dbid oid 线程所属的数据库id。 父主题: OS
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 --创建表test,并向表中插入20条数据。 gaussdb=# CREATE TABLE test(c1 int, c2 int); gaussdb=# INSERT INTO test VALUES (generate_series(1,20),generate_series(1,20)); --开始一个事务,建立一个名为cursor1的游标。 gaussdb=# START TRANSACTION; gaussdb=# CURSOR cursor1 FOR SELECT * FROM test ORDER BY 1; --指定游标从关联位置开始检索3行数据。 gaussdb=# FETCH FORWARD 3 FROM cursor1; c1 | c2 ----+---- 1 | 1 2 | 2 3 | 3 (3 rows) --关闭游标并提交事务。 gaussdb=# CLOSE cursor1; gaussdb=# END; --删除表。 gaussdb=# DROP TABLE test;
  • RATIO_TO_REPORT(column_name) 描述:计算某一列的值占其所属分组中所有值总和的比例。 参数:数值类型,或任意可以隐式转换成数值类型的类型。 返回值类型:入参为float4和float8,返回值类型与入参一致;其余入参类型返回numeric类型。 RATIO_TO_REPORT(column_name)与OVER()一起使用时,OVER()中入参只支持PARTITION BY和NULL。 示例1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 gaussdb=# CREATE TABLE ratio_to_report_t1(a int, b int); gaussdb=# INSERT INTO ratio_to_report_t1 VALUES(1,1),(1,1),(1, 2),(1, 3),(2, 4),(2, 5),(3,6); gaussdb=# SELECT a,b,RATIO_TO_REPORT(b) OVER(PARTITION BY a) FROM ratio_to_report_t1; a | b | ratio_to_report ---+---+------------------------ 1 | 1 | .14285714285714285714 1 | 1 | .14285714285714285714 1 | 2 | .28571428571428571429 1 | 3 | .42857142857142857143 2 | 4 | .44444444444444444444 2 | 5 | .55555555555555555556 3 | 6 | 1.00000000000000000000 (7 rows) gaussdb=# DROP TABLE ratio_to_report_t1; 示例2:与其它函数嵌套使用。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 gaussdb=# CREATE TABLE ratio_to_report_t1(a int, b int); gaussdb=# INSERT INTO ratio_to_report_t1 VALUES(1,1),(1,1),(1, 2),(1, 3),(2, 4),(2, 5),(3,6); gaussdb=# SELECT a,b,TO_CHAR(RATIO_TO_REPORT(b) OVER(PARTITION BY a), '$999eeee') FROM ratio_to_report_t1; a | b | to_char ---+---+--------- 1 | 1 | 1e-01 1 | 1 | 1e-01 1 | 2 | 3e-01 1 | 3 | 4e-01 2 | 4 | 4e-01 2 | 5 | 6e-01 3 | 6 | 1e+00 (7 rows) gaussdb=# DROP TABLE ratio_to_report_t1; 示例3:存储过程调用。 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 ratio_to_report_t1(a int, b int); gaussdb=# INSERT INTO ratio_to_report_t1 VALUES(1,1),(1,1),(1, 2),(1, 3),(2, 4),(2, 5),(3,6); gaussdb=# CREATE OR REPLACE PROCEDURE ratio_to_report_proc IS CURSOR cur_1 IS SELECT a,b,RATIO_TO_REPORT(b) OVER(PARTITION BY a) FROM ratio_to_report_t1; BEGIN FOR cur IN cur_1 LOOP RAISE INFO '%', cur.ratio_to_report; END LOOP; END; / gaussdb=# CALL RATIO_TO_REPORT_PROC(); INFO: .14285714285714285714 INFO: .14285714285714285714 INFO: .28571428571428571429 INFO: .42857142857142857143 INFO: .44444444444444444444 INFO: .55555555555555555556 INFO: 1.00000000000000000000 ratio_to_report_proc ---------------------- (1 row) gaussdb=# DROP PROCEDURE ratio_to_report_proc; gaussdb=# DROP TABLE ratio_to_report_t1;
  • KEEP( DENSE_RANK { FIRST | LAST } ORDER BY expr) 描述:将查询结果的数据行按指定规则进行排序,返回第一组或者最后一组的值,可用于聚集函数或窗口函数。 语法: aggregate_function KEEP ( DENSE_RANK { FIRST | LAST } ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [, expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ]]...) OVER ( [query_partition_clause] ) ] 返回值类型:在aggregate_function中指定列的数据类型。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 gaussdb=# CREATE TABLE keep_t1(a int, b int, c int, d int); gaussdb=# INSERT INTO keep_t1 values(2, 111, 333, 10), (2, 11, 33, 10), (2, 11, 3, 1), (1, 22, 55, 10), (1, 2, 5, 100); gaussdb=# SELECT MIN(d) KEEP(DENSE_RANK FIRST ORDER BY b) OVER (PARTITION BY a) MIN_FIRST, MIN(b) KEEP(DENSE_RANK LAST ORDER BY b) OVER (PARTITION BY a) MIN_LAST, MAX(b) KEEP(DENSE_RANK FIRST ORDER BY b) OVER (PARTITION BY a) MAX_FIRST, MAX(b) KEEP(DENSE_RANK LAST ORDER BY b) OVER (PARTITION BY a) MAX_LAST FROM keep_t1; min_first | min_last | max_first | max_last -----------+----------+-----------+---------- 100 | 22 | 2 | 22 100 | 22 | 2 | 22 1 | 111 | 11 | 111 1 | 111 | 11 | 111 1 | 111 | 11 | 111 (5 rows) gaussdb=# DROP TABLE keep_t1;
  • 注意事项 如果游标定义了NO SCROLL,则不允许使用例如FETCH BACKWARD之类的反向抓取。 NEXT、PRIOR、FIRST、LAST和ABSOLUTE和RELATIVE形式在恰当地移动游标之后抓取一条记录。如果后面没有数据行,就返回一个空的结果,此时游标就会停在查询结果的最后一行之后(向后查询时)或者第一行之前(向前查询时)。 FORWARD和BACKWARD形式在向前或者向后移动的过程中抓取指定的行数,然后把游标定位在最后返回的行上;如果count大于可用的行数,则会把游标定位在所有行之后(向后查询时)或者之前(向前查询时)。 RELATIVE 0、FORWARD 0和BACKWARD 0都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚抓取过的行。除非游标定位在第一行之前或者最后一行之后,否则这个动作都应该成功。而当游标定位在第一行之前或者最后一行之后,不返回任何行。 当FETCH的游标上涉及非系统表时,不支持BACKWARD、PRIOR、FIRST等涉及反向获取操作。
  • NTH_VALUE(value any, nth integer) 描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。 返回值类型:与参数数据类型相同。 语法: NTH_VALUE(value any, nth integer) NTH_VALUE(value any, nth integer) IGNORE|RESPECT NULLS IGNORE|RESPECT NULLS:表示是否要忽略NULL值。其中RESPECT NULLS是缺省值。若开启IGNORE NULLS选项,会在每个组从前向后查找非NULL值,直到查询到第nth个非NULL值时进行返回;如果查找到当前组的结尾都没有nth个非NULL值,则返回NULL。 示例1:不开启IGNORE NULLS,默认不忽略NULL值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 gaussdb=# CREATE TABLE nth_value_t1(a int, b int); gaussdb=# INSERT INTO nth_value_t1 VALUES(1, NULL),(1, NULL),(1, NULL),(1,1),(1,1),(1, 2),(1, 3),(2, 4),(2, 5),(3,6); gaussdb=# SELECT a,b,NTH_VALUE(b, 2) OVER(PARTITION BY a ORDER BY b) FROM nth_value_t1; a | b | nth_value ---+---+----------- 1 | 1 | 1 1 | 1 | 1 1 | 2 | 1 1 | 3 | 1 1 | | 1 1 | | 1 1 | | 1 2 | 4 | 2 | 5 | 5 3 | 6 | (10 rows) gaussdb=# DROP TABLE nth_value_t1; 示例2:开启IGNORE NULLS。 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 gaussdb=# CREATE TABLE nth_value_t1(a int, b int); gaussdb=# INSERT INTO nth_value_t1 VALUES(1, NULL),(1, NULL),(1, NULL),(1,1),(1,1),(1, 2),(1, 3),(2, 4),(2, 5),(3,6); gaussdb=# SELECT a,b,NTH_VALUE(b, 2) IGNORE NULLS OVER(PARTITION BY a ORDER BY b DESC) FROM nth_value_t1; a | b | nth_value ---+---+----------- 1 | | 1 | | 1 | | 1 | 3 | 1 | 2 | 2 1 | 1 | 2 1 | 1 | 2 2 | 5 | 2 | 4 | 4 3 | 6 | (10 rows) -- 对比不加 ignore nulls SELECT a,b,NTH_VALUE(b, 2) OVER(PARTITION BY a ORDER BY b DESC) FROM nth_value_t1; a | b | nth_value ---+---+----------- 1 | | 1 | | 1 | | 1 | 3 | 1 | 2 | 1 | 1 | 1 | 1 | 2 | 5 | 2 | 4 | 4 3 | 6 | (10 rows) gaussdb=# DROP TABLE nth_value_t1;
  • 功能描述 FETCH通过已创建的游标来检索数据。 每个游标都有一个供FETCH使用的关联位置。游标的关联位置可以在查询结果的第一行之前,或者在结果中的任意行,或者在结果的最后一行之后: 游标刚创建完之后,关联位置在第一行之前。 在抓取了一些移动行之后,关联位置在检索到的最后一行上。 如果FETCH抓取完了所有可用行,它就停在最后一行后面,或者在反向抓取的情况下是停在第一行前面。 FETCH ALL或FETCH BACKWARD ALL总是把游标的关联位置放在最后一行或者在第一行前面。
  • 语法格式 FETCH [ direction { FROM | IN } ] cursor_name; 其中direction子句为可选参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 NEXT | PRIOR | FIRST | LAST | ABSOLUTE count | RELATIVE count | count | ALL | FORWARD | FORWARD count | FORWARD ALL | BACKWARD | BACKWARD count | BACKWARD ALL
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全