华为云用户手册

  • pg_listening_channels() 描述:会话正在侦听的信道名称。 返回值类型:setof text 示例: 1 2 3 4 gaussdb=# SELECT pg_listening_channels(); pg_listening_channels ----------------------- (0 rows) 备注:pg_listening_channels返回当前会话正在侦听的一组信道名称。
  • pg_postmaster_start_time() 描述:服务器启动时间。pg_postmaster_start_time返回服务器启动时的timestamp with time zone。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT pg_postmaster_start_time(); pg_postmaster_start_time ------------------------------ 2017-08-30 16:02:54.99854+08 (1 row)
  • pg_get_ruledef(rule_oid) 描述:获取规则的CREATE RULE命令。 返回值类型:text 示例: gaussdb=# SELECT * FROM pg_get_ruledef(24828); pg_get_ruledef ------------------------------------------------------------------- CREATE RULE t1_ins AS ON INSERT TO t1 DO INSTEAD INSERT INTO t2 (id) VALUES (new.id); (1 row)
  • version() 描述:版本信息。version返回一个描述服务器版本信息的字符串。 返回值类型:text 示例: gaussdb=# SELECT version(); version ------------------------------------------------------------------------------------------------------------------------------------------------------------- gaussdb ( GaussDB Kernel XXX.X.XXX build fab4f5ea) compiled at 2021-10-24 11:58:22 commit 3086 last mr 6592 release (1 row)
  • pv_session_memory_detail() 描述:返回会话的内存使用情况,以MemoryContext节点来统计。多租场景下,non-PDB调用该函数时返回全局统计信息,PDB调用该函数时仅返回该PDB的统计信息。 返回值类型:record 表1 返回值说明 名称 类型 描述 sessid text 关闭线程池(enable_thread_pool = off)时该字段表示线程启动时间+session标识(字符串信息为timestamp.sessionid)。 开启线程池(enable_thread_pool = on)时,内存上下文是线程级别的,则对应的该字段表示线程启动时间+线程标识(字符串信息为timestamp.threadid),内存上下文是session级别的,则对应的该字段表示线程启动时间+session标识(字符串信息为timestamp.sessionid)。 threadid bigint 会话绑定的线程标识。 contextname text 内存上下文名称。 level smallint 当前上下文在整体内存上下文中的层级。 parent text 父内存上下文名称。 totalsize bigint 当前内存上下文的内存总数,单位Byte。 freesize bigint 当前内存上下文中已释放的内存总数,单位Byte。 usedsize bigint 当前内存上下文中已使用的内存总数,单位Byte;“TempSmallContextGroup”内存上下文中该字段含义为统计计数。
  • database() 描述:返回当前的schema的名称。 参数:无 返回值类型:name 示例: 1 2 3 4 5 gaussdb=# SELECT database(); database ---------- public (1 row) 此函数仅当sql_compatibility = 'B',设置参数 b_format_version = '5.7'和参数b_format_dev_version = 's1'时生效。
  • inet_server_port() 描述:连接的本地端口。inet_server_port返回接收当前连接的端口号。如果是通过Unix-domain socket连接的,则所有这些函数都返回NULL。 此函数只有在远程连接模式下有效。 返回值类型:int 示例: 1 2 3 4 5 gaussdb=# SELECT inet_server_port(); inet_server_port ------------------ 8000 (1 row)
  • USERENV() 描述:返回当前时刻与上下文命名空间'namespace'关联的参数'parameter'的值,该函数功能与SYS_CONTEXT()在第一个入参为'userenv'时功能一致。 当前支持的入参: 'current_edition_name'、'current_schema'、'current_sql'、'current_user'、'current_userid'、'database_role'、'ip_address'、'is_apply_server'、'isdba'、'nls_currency'、'nls_date_format'、'nls_date_language'、'server_host'、'service_name'、'session_user'、'session_userid'、'db_name'、'db_unique_name'、'instance'、'instance_name'、'current_edition_id'、'current_schemaid'、'lang'、'language'、'sid' 当前不支持的入参: 'action'、'is_application_root'、'is_application_pdb'、'audited_cursorid'、'authenticated_identity'、'authentication_data'、'authentication_method'、'cdb_domain'、'cdb_name'、'client_identifier'、'con_id'、'con_name'、'current_sql_length'、'db_domain'、'db_supplemental_log_level'、'dblink_info'、'drain_status'、'entryid'、'enterprise_identity'、'fg_job_id'、'global_uid'、'identification_type'、'is_dg_rolling_upgrade'、'ldap_server_type'、'module'、'network_protocol'、'nls_calendar'、'nls_sort'、'nls_territory'、'oracle_home'、'os_user'、'platform_slash'、'policy_invoker'、'proxy_enterprise_identity'、'proxy_user'、'proxy_userid'、'scheduler_job'、'session_edition_id'、'session_edition_name'、'sessionid'、'statementid'、'terminal'、'unified_audit_sessionid'、'session_default_collation'、'client_info'、'bg_job_id'、'client_program_name'、'current_bind'、'global_context_memory'、'host'、'current_sqln' 返回值类型:text 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 SELECT USERENV('sid'); userenv --------- 955 (1 row) SELECT USERENV('instance'); userenv --------- 14524 (1 row) SELECT USERENV('action'); userenv --------- (1 row) SELECT USERENV('actijj'); ERROR: unrecognized configuration parameter "actijj" CONTEXT: PL/pgSQL function userenv(text) line 114 at RETURN referenced column: userenv 当入参为当前不支持的入参时,则返回NULL;当入参为非法入参时报错。
  • current_user 描述:当前执行环境下的用户名。 返回值类型:name 示例: 1 2 3 4 5 gaussdb=# SELECT current_user; current_user -------------- omm (1 row) 备注:current_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过SET ROLE改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。
  • inet_server_addr() 描述:连接的本地地址。inet_server_addr返回服务器接收当前连接用的IP地址。 此函数只有在远程连接模式下有效。 返回值类型:inet 示例: 1 2 3 4 5 gaussdb=# SELECT inet_server_addr(); inet_server_addr ------------------ 10.10.0.13 (1 row)
  • current_schema[()] 描述:当前模式的名称。 返回值类型:name 示例: 1 2 3 4 5 gaussdb=# SELECT current_schema(); current_schema ---------------- public (1 row) 备注:current_schema返回在搜索路径中第一个顺位有效的模式名。(如果搜索路径为空则返回NULL,没有有效的模式名也返回NULL)。如果创建表或者其他命名对象时没有声明目标模式,则将使用这些对象的模式。
  • current_schemas(Boolean) 描述:搜索路径中的模式名称。 返回值类型:name[] 示例: 1 2 3 4 5 gaussdb=# SELECT current_schemas(true); current_schemas --------------------- {pg_catalog,public} (1 row) 备注: current_schemas(Boolean)返回搜索路径中所有模式名称的数组。布尔选项决定像pg_catalog这样隐含包含的系统模式是否包含在返回的搜索路径中。 搜索路径可以通过运行时设置更改。命令是: 1 SET search_path TO schema [, schema, ...]
  • pg_current_sessionid() 描述:当前执行环境下的会话ID。 返回值类型:text 示例: 1 2 3 4 5 gaussdb=# SELECT pg_current_sessionid(); pg_current_sessionid ---------------------------- 1579228402.140190434944768 (1 row) 备注:pg_current_sessionid()是用于获取当前执行环境下的会话ID。其组成结构为:时间戳.会话ID,当线程池模式开启(enable_thread_pool=on)时,会话ID为SessionID;而线程池模式关闭时,会话ID为ThreadID。
  • SYS_CONTEXT() 描述:返回当前时刻与上下文命名空间'namespace'关联的参数'parameter'的值,该函数功能在第一个入参为'userenv'时与USERENV()功能一致。 当前支持的第二个入参参数: 'current_edition_name'、'current_schema'、'current_sql'、'current_user'、'current_userid'、'database_role'、'ip_address'、'is_apply_server'、'isdba'、'nls_currency'、'nls_date_format'、'nls_date_language'、'server_host'、'service_name'、'session_user'、'session_userid'、'db_name'、'db_unique_name'、'instance'、'instance_name'、'current_edition_id'、'current_schemaid'、'lang'、'language'、'sid' 返回值类型:text 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT SYS_CONTEXT('userenv','NLS_CURRENCY'); sys_context ------------- $ (1 row) SELECT SYS_CONTEXT('userenv','NLS_DATE_FORMAT'); sys_context --------------- ISO, MDY (1 row) SELECT SYS_CONTEXT('userenv','NLS_DATE_LANGUAGE'); sys_context ------------- en_US.UTF-8 (1 row)
  • TIMESTAMPDIFF(unit , timestamp_expr1, timestamp_expr2) 描述:timestampdiff函数计算两个时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式返回结果。等效于timestamp_diff(text, timestamp, timestamp)。 参数: timestamp_expr1以及timestamp_expr2的类型为时间类型表达式、text、datetime、date或time等类型。 unit表示的是两个参数差的单位。按照指定形式对结果进行返回。 返回值类型:bigint 该函数仅在B模式数据库中有效。 timestampdiff在sql_compatibility = 'B',且参数b_format_version值为5.7、b_format_dev_version值为s1时,调用的函数实际上注册为b_timestampdiff;在B模式数据库中且未开启GUC参数时,调用的函数注册为timestamp_diff,可以用“\df b_timestampdiff”等指令查询函数的详细入参与返回值信息。 参数unit的取值范围如下所示。 year 年份。 1 2 3 4 5 gaussdb=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 2 (1 row)
  • obj_description(object_oid, catalog_name) 描述:获取一个数据库对象的注释。 返回类型:text 备注:带有两个参数的obj_description返回一个数据库对象的注释,该对象是通过其OID和其所属的系统表名称声明。比如,obj_description(123456,'pg_class')将返回OID为123456的表的注释。只带一个参数的obj_description只要求对象OID。 obj_description不能用于表字段,因为字段没有自己的OID。
  • 内置函数 HLL(HyperLogLog)有一系列内置函数用于内部对数据进行处理,一般情况下用户不需要熟知这些函数的使用,具体如表1 内置函数所示。 表1 内置函数 函数名称 功能描述 hll_in 以string格式接收hll数据。 hll_out 以string格式发送hll数据。 hll_recv 以bytea格式接收hll数据。 hll_send 以bytea格式发送hll数据。 hll_trans_in 以string格式接收hll_trans_type数据。 hll_trans_out 以string格式发送hll_trans_type数据。 hll_trans_recv 以bytea形式接收hll_trans_type数据。 hll_trans_send 以bytea形式发送hll_trans_type数据。 hll_typmod_in 接收typmod类型数据。 hll_typmod_out 发送typmod类型数据。 hll_hashval_in 接收hll_hashval类型数据。 hll_hashval_out 发送hll_hashval类型数据。 hll_add_trans0 类似于hll_add所提供的功能,初始化时无指定入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans1 类似于hll_add所提供的功能,初始化时指定一个入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans2 类似于hll_add所提供的功能,初始化时指定两个入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans3 类似于hll_add所提供的功能,初始化时指定三个入参,通常在聚合运算的第一阶段DN上使用。 hll_add_trans4 类似于hll_add所提供的功能,初始化时指定四个入参,通常在聚合运算的第一阶段DN上使用。 hll_union_trans 类似hll_union所提供的功能,在聚合运算的第一阶段DN上使用。 hll_union_collect 类似于hll_union所提供的功能,在聚合运算第二阶段DN上使用,汇总各个DN上的结果。 hll_pack 在聚合运算第三阶段DN上使用,把自定义hll_trans_type类型最后转换成hll类型。 hll 用于hll类型转换成hll类型,根据输入参数会设定指定参数。 hll_hashval 用于bigint类型转换成hll_hashval类型。 hll_hashval_int4 用于int4类型转换成hll_hashval类型。 父主题: HLL函数和操作符
  • bpcharlikebpchar(BPCHAR, BPCHAR) 描述:判断第一个入参BPCHAR字符串是否LIKE第二个入参BPCHAR字符串。用于新增BPCHAR类型和BPCHAR类型的LIKE操作符,解决BPCHAR类型和BPCHAR类型数据比较无法返回正确结果集问题。启用“~~”操作符需在GUC参数behavior_compat_options的取值中包含enable_bpcharlikebpchar_compare配置项。 返回值类型:BOOL。 取值范围: t:表示两个BPCHAR类型参数匹配。 f:表示两个BPCHAR类型参数不匹配。 示例: 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 gaussdb=# SELECT bpcharlikebpchar('455'::BPCHAR(10), '455 '::BPCHAR); bpcharlikebpchar ------------------ f (1 row) gaussdb=# SELECT bpcharlikebpchar('455 '::BPCHAR(10), '455 '::BPCHAR(10)); bpcharlikebpchar ------------------ t (1 row) gaussdb=# SELECT bpcharlikebpchar('455 '::BPCHAR(10), '455'::BPCHAR(10)); bpcharlikebpchar ------------------ t (1 row) gaussdb=# SELECT bpcharlikebpchar('455 '::BPCHAR(10), '455'::BPCHAR(11)); bpcharlikebpchar ------------------ f (1 row) gaussdb=# CREATE TABLE op_test ( col BPCHAR(2) DEFAULT NULL ); CREATE TABLE gaussdb=# CREATE INDEX op_index ON op_test(col); CREATE INDEX gaussdb=# INSERT INTO op_test VALUES ('a'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('1'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('11'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('12'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('sd'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('aa'); INSERT 0 1 gaussdb=# SHOW behavior_compat_options; behavior_compat_options ------------------------- (1 row) --当behavior_compat_options不包含enable_bpcharlikebpchar_compare时,则未启用最新bpcharlikebpchar操作符,其bpchar匹配bpchar返回结果集非预期(正常应返回全部数据)。 gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM op_test WHERE col LIKE col::BPCHAR ORDER BY col; QUERY PLAN -------------------------------- Seq Scan on op_test Filter: (col ~~ (col)::text) (2 rows) gaussdb=# SELECT * FROM op_test WHERE col LIKE col::BPCHAR ORDER BY col; col ----- 11 12 aa sd (4 rows) gaussdb=# SET behavior_compat_options = 'enable_bpcharlikebpchar_compare'; SET gaussdb=# SHOW behavior_compat_options; behavior_compat_options --------------------------------- enable_bpcharlikebpchar_compare (1 row) --开启参数后,将启用最新bpcharlikebpchar操作符,其匹配时返回行为符合预期行为。 gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM op_test WHERE col LIKE col::BPCHAR ORDER BY col; QUERY PLAN -------------------------------- Seq Scan on op_test Filter: (col ~~ col) (2 rows) gaussdb=# SELECT * FROM op_test WHERE col LIKE col::BPCHAR ORDER BY col; col ----- 1 11 12 a aa sd (6 rows) gaussdb=# DROP TABLE op_test; DROP TABLE 仅在数据库兼容性参数SQL_COMPATIBILITY为A时,设置GUC参数behavior_compat_options中含有enable_bpcharlikebpchar_compare字段可以使用bpcharlikebpchar。 启用该特性,会影响BPCHAR类型进行LIKE模式匹配时的结果集与执行计划。 SET behavior_compat_options=''; 表示关闭该特性,SET behavior_compat_options='enable_bpcharlikebpchar_compare';表示开启该特性。 开启新特性后,定长匹配定长(bpchar匹配bpchar),需要指定左右两侧参数长度相同;模式匹配时,注意模式列长度与强制转换长度相同,避免过长后填补空格导致结果与预期存在差异。
  • bpcharnlikebpchar(BPCHAR, BPCHAR) 描述:判断第一个入参BPCHAR字符串是否NOT LIKE第二个入参BPCHAR字符串。用于新增BPCHAR类型和BPCHAR类型的NOT LIKE操作符。启用“!~~”操作符需在GUC参数behavior_compat_options的取值中包含enable_bpcharlikebpchar_compare配置项。 返回值类型:BOOL。 取值范围: t:表示两个BPCHAR类型参数匹配。 f:表示两个BPCHAR类型参数不匹配。 示例: 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 gaussdb=# SELECT bpcharnlikebpchar('455 '::BPCHAR(10), '455'::BPCHAR(11)); bpcharnlikebpchar ------------------- t (1 row) gaussdb=# SELECT bpcharnlikebpchar('455 '::BPCHAR(10), '455'::BPCHAR(10)); bpcharnlikebpchar ------------------- f (1 row) gaussdb=# SELECT bpcharnlikebpchar('455 '::BPCHAR(10), '455 '::BPCHAR); bpcharnlikebpchar ------------------- t (1 row) gaussdb=# CREATE TABLE op_test ( col BPCHAR(2) DEFAULT NULL ); CREATE TABLE gaussdb=# CREATE INDEX op_index ON op_test(col); CREATE INDEX gaussdb=# INSERT INTO op_test VALUES ('a'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('1'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('11'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('12'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('sd'); INSERT 0 1 gaussdb=# INSERT INTO op_test VALUES ('aa'); INSERT 0 1 gaussdb=# SHOW behavior_compat_options; behavior_compat_options ------------------------- (1 row) --当behavior_compat_options不包含enable_bpcharlikebpchar_compare时,则未启用最新bpcharnlikebpchar操作符,其BPCHAR匹配BPCHAR返回结果集非预期(正常应返回0条数据)。 gaussdb=# SELECT * FROM op_test WHERE col NOT LIKE col::BPCHAR ORDER BY col; col ----- 1 a (2 rows) gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM op_test WHERE col NOT LIKE col::BPCHAR ORDER BY col; QUERY PLAN ------------------------------------------- Index Only Scan using op_index on op_test Filter: (col !~~ (col)::text) (2 rows) gaussdb=# SET behavior_compat_options = 'enable_bpcharlikebpchar_compare'; SET gaussdb=# SHOW behavior_compat_options; behavior_compat_options --------------------------------- enable_bpcharlikebpchar_compare (1 row) --开启参数后,将启用最新bpcharnlikebpchar操作符,其匹配时返回行为符合预期行为。 gaussdb=# SELECT * FROM op_test WHERE col NOT LIKE col::BPCHAR ORDER BY col; col ----- (0 rows) gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM op_test WHERE col NOT LIKE col::BPCHAR ORDER BY col; QUERY PLAN ------------------------------------------- Index Only Scan using op_index on op_test Filter: (col !~~ col) (2 rows) gaussdb=# DROP TABLE op_test; DROP TABLE 仅在数据库兼容性参数SQL_COMPATIBILITY为A时,设置GUC参数behavior_compat_options中含有enable_bpcharlikebpchar_compare字段可以使用bpcharlikebpchar。 启用该特性,会影响BPCHAR类型进行NOT LIKE模式匹配时的结果集与执行计划。 SET behavior_compat_options=''; 表示关闭该特性,SET behavior_compat_options='enable_bpcharlikebpchar_compare';表示开启该特性。 开启新特性后,定长匹配定长(bpchar匹配bpchar),需要指定左右两侧参数长度相同;模式匹配时,注意模式列长度与强制转换长度相同,避免过长后填补空格导致结果与预期存在差异。
  • 背景信息 GaussDB数据库 支持的分区表为范围分区表、列表分区表和哈希分区表。 范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。 列表分区表:将数据中包含的键值分别存储在不同的分区中,依次将数据映射到每一个分区,分区中包含的键值由创建分区表时指定。 哈希分区表:将数据根据内部哈希算法依次映射到每一个分区中,包含的分区个数由创建分区表时指定。 分区表和普通表相比具有以下优点: 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 均衡I/O:可以把不同的分区映射到不同的磁盘以平衡I/O,改善整个系统性能。 普通表若要转成分区表,需要新建分区表,然后把普通表中的数据导入到新建的分区表中。因此在初始设计表时,请根据业务提前规划是否使用分区表。
  • transaction_deferrable 参数说明:指定是否允许一个只读串行事务延迟执行,使其不会执行失败。该参数设置为on时,当一个只读事务发现读取的元组正在被其他事务修改,则延迟该只读事务直到其他事务修改完成。该参数为预留参数,该版本不生效。与该参数类似的还有一个default_transaction_deferrable,设置它来指定一个事务是否允许延迟。 该参数属于USERSET类型参数,请参考表2中对应设置方法进行设置。 取值范围:布尔型 on表示允许执行。 off表示不允许执行。 默认值:off
  • enable_gtm_free 参数说明:大并发场景下同一时刻存在活跃事务较多,GTM下发的快照变大且快照请求变多的情况下,瓶颈卡在GTM与CN通讯的网络上。为消除该瓶颈,引入GTM-FREE模式。取消CN和GTM的交互,取消CN下发GTM获取的事务信息给DN。CN只向各个DN发送query,各个DN由本地产生快照及xid等信息,开启该参数支持分布式事务读最终一致性,即分布式事务只有写外部一致性,不具有读外部一致性。 该参数属于POSTMASTER类型参数,请参考表2中对应设置方法进行设置。 业务使用GTM-Free模式时,建议将application_type设置成perfect_sharding_type,以便及时发现可能导致数据不一致的SQL语句。否则,系统不会拦截可能导致数据不一致的语句,造成数据不一致。 取值范围:布尔型 on表示开启GTM-FREE模式,集群状态为读最终一致性。 off表示非GTM-FREE模式。 默认值:off
  • enable_twophase_commit 参数说明:当前云数据库主要解决SDS替换问题,采用模式为GTM Free,为防止业务滥用导致不可靠问题,提供guc参数开关enable_twophase_commit禁用分布式写事务,该参数属于USERSET类型参数,请参考表2中对应设置方法进行设置。 取值范围:布尔型 on表示开启GTM-FREE模式下,允许业务进行分布式两阶段写事务。 off表示开启GTM-FREE模式下,禁止业务进行分布式两阶段写事务。 默认值:on
  • application_type 参数说明:此参数仅在enable_gtm_free为on时有效。此参数用来说明用户的业务类型。该参数属于USERSET类型参数,请参考表2中对应设置方法进行设置。此参数不允许使用gs_guc设置,只允许以下列两种方式设置: 使用gsql等客户端在session级别设置。 使用jdbc连接数据库时,给连接字符串指定ApplicationType参数。 取值范围:枚举类型 not_perfect_sharding_type表示跨节点的业务。取此值时,允许执行跨节点的语句。 perfect_sharding_type表示单节点的业务。取此值时,如果SQL语句需要多个节点参与,会直接报错。对应的SQL语句会同时打印到系统日志中。 取此值时,使用/*+ multinode */ hint可以显示允许SQL语句在多个节点执行。multinode hint可以加到select、insert、update、delete、merge关键字之后。
  • enable_defer_calculate_snapshot 参数说明:延迟计算快照的xmin和oldestxmin,执行1000个事务或者间隔1s才触发计算,设置为on时可以在高负载场景下减少计算快照的开销,但是会导致oldestxmin推进较慢,影响垃圾元组回收,设置为off时xmin和oldestxmin可以实时推进,但是会增加计算快照时的开销。 该参数属于SIGHUP类型参数,请参考表2中对应设置方法进行设置。 取值范围:布尔型。 on表示延迟计算快照xmin和oldestxmin。 off表示实时计算快照xmin和oldestxmin。 默认值:on。
  • pgxc_node_name 参数说明:指定节点名称。 该参数属于POSTMASTER类型参数,请参考表2中对应设置方法进行设置。 在备机请求主机进行日志复制时,如果application_name参数没有被设置,那么pgxc_node_name参数会被用来作为备机在主机上的流复制槽名字。该流复制槽的命名方式为 "该参数值_备机ip_备机port"。其中,备机ip和备机port取自replconninfo参数中指定的备机ip和端口号。该流复制槽最大长度为61个字符,如果拼接后的字符串超过该长度,则会使用截断后的pgxc_node_name进行拼接,以保证流复制槽名字长度小于等于61个字符。 此参数修改后会导致连接集群失败,不建议进行修改。 取值范围:字符串。 默认值:当前节点名称。
  • transaction_isolation 参数说明:设置当前事务的隔离级别。 该参数属于USERSET类型参数,请参考表2中对应设置方法进行设置。 取值范围:字符串,只识别以下字符串,大小写空格敏感: serializable:GaussDB中等价于REPEATABLE READ。 read committed:只能读取已提交的事务的数据(缺省),不能读取到未提交的数据。 repeatable read:仅能读取事务开始之前提交的数据,不能读取未提交的数据以及在事务执行期间由其它并发事务提交的修改。 read uncommitted:读未提交,可以读取任何时刻的数据。 default:设置为default_transaction_isolation所设隔离级别。 默认值:read committed
  • 示例 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 --创建一个兼容性为ORA的数据库。 gaussdb=# CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA'; CREATE DATABASE --切换数据库 gaussdb=# \c ora_compatible_db --定义函数为SQL查询。 gaussdb=# CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; --利用参数名用 plpgsql 自增一个整数。 gaussdb=# CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql; 。 --返回一个包含多个输出参数的记录。 gaussdb=# CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text) AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ LANGUAGE SQL; gaussdb=# SELECT * FROM func_dup_sql(42); --计算两个整数的和,并返回结果。如果输入为null,则返回null。 gaussdb=# CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer AS BEGIN RETURN num1 + num2; END; / --修改函数add的执行规则为IMMUTABLE,即参数不变时返回相同结果。 gaussdb=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE; --将函数add的名称修改为add_two_number。 gaussdb=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number; --将函数add的属者改为omm。 gaussdb=# ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO omm; --删除函数。 gaussdb=# DROP FUNCTION add_two_number; gaussdb=# DROP FUNCTION func_increment_sql; gaussdb=# DROP FUNCTION func_dup_sql; gaussdb=# DROP FUNCTION func_increment_plsql; gaussdb=# DROP FUNCTION func_add_sql; --不打开参数set behavior_compat_options = 'proc_outparam_override'时,被匿名块或存储过程直接调用的函数的OUT,并且RETURN值会被当做OUT出参的第一个值导致调用失败。 gaussdb=# CREATE TYPE rec AS(c1 int, c2 int); gaussdb=# CREATE OR REPLACE FUNCTION func(a in out rec, b in out int) return int AS BEGIN a.c1:=100; a.c2:=200; b:=300; return 1; END; / DECLARE r rec; b int; BEGIN func(r,b); --不支持。 END; / ERROR: cannot assign non-composite value to a row variable CONTEXT: PL/SQL function inline_code_block line 4 at SQL statement gaussdb=# CREATE OR REPLACE FUNCTION func_001(a in out date, b in out date) --#add in & inout #default value RETURN integer AS BEGIN raise info '%', a; raise info '%', b; RETURN 1; END; / gaussdb=# DECLARE date1 date := '2022-02-02'; date2 date := '2022-02-02'; BEGIN func_001(date1, date2); END; / INFO: 2022-02-02 00:00:00 CONTEXT: PL/SQL function inline_code_block line 5 at SQL statement INFO: 2022-02-02 00:00:00 CONTEXT: PL/SQL function inline_code_block line 5 at SQL statement ERROR: invalid input syntax for type timestamp: "1" CONTEXT: PL/SQL function inline_code_block line 5 at SQL statement gaussdb=# CREATE OR REPLACE FUNCTION func_001(a in out INT, b in out date) --#add in & inout #default value RETURN INT AS BEGIN raise info '%', a; raise info '%', b; RETURN a; END; / gaussdb=# DECLARE date1 int := 1; date2 date := '2022-02-02'; BEGIN func_001(date1, date2); END; / INFO: 1 CONTEXT: PL/SQL function inline_code_block line 5 at SQL statement INFO: 2022-02-02 00:00:00 CONTEXT: PL/SQL function inline_code_block line 5 at SQL statement ANONYMOUS BLOCK EXECUTE
  • 语法格式 兼容PostgreSQL风格的创建自定义函数语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] LANGUAGE lang_name [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | WINDOW | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} | {fenced | not fenced} | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT }} ][...] { AS 'definition' | AS 'obj_file', 'link_symbol' }; 兼容ORA模式数据库风格的创建自定义函数的语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) RETURN rettype [ DETERMINISTIC ] [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | {FENCED | NOT FENCED} | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER } | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT | LANGUAGE lang_name ][...] { IS | AS } plsql_body /
  • 注意事项 如果创建函数时参数或返回值带有精度,不进行精度检测。 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。 在创建函数时,函数内部通过SET语句设置current_schema和search_path无效。执行完函数后的search_path和current_schema与执行函数前的search_path和current_schema保持一致。 如果函数参数中带有出参,想要出参生效,必须打开guc参数 set behavior_compat_options = 'proc_outparam_override'; SELECT、CALL调用函数时,必须要在出参位置提供实参进行调用,否则函数调用失败。 在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。 不能创建仅形参名字不同(函数名和参数列表类型都一样)的重载函数。 不能创建与存储过程拥有相同名称和参数列表的函数。 不支持形参仅在自定义ref cursor类型和sys_refcursor类型不同的重载。 不支持仅返回的数据类型不同的函数重载。 不支持仅默认值不同的函数重载。 重载的函数在调用时变量需要明确具体的类型。 在函数内部使用未声明的变量,函数被调用时会报错。 SELECT调用可以指定不同参数来进行同名函数调用。 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。 在普通集群模式下,暂不支持将返回值、参数以及变量设置为建在非系统默认安装Node Group的表,sql function内部语句暂不支持对建在非系统默认安装Node Group的表操作。 新创建的函数默认会给PUBLIC授予执行权限(详见GRANT)。用户默认继承PUBLIC角色权限,因此其他用户也会有函数的执行权限并可以查看函数的定义,另外执行函数时还需要具备函数所在schema的USAGE权限。用户在创建函数时可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。开启数据库对象隔离属性后,普通用户只能查看有权限执行的函数定义。 函数定义时如果指定为IMMUTABLE和SHIPPABLE类型,应该尽量避免函数中存在INSERT,UPDATE,DELETE,MERGE和DDL操作,因为上述操作应该由CN判断对应的执行节点,否则执行结果可能产生错误。如果在声明为IMMUTABLE和SHIPPABLE类型的函数中下推执行了DDL,可能会导致各节点数据库对象不一致。修复此类问题可以在CN上创建VOLATILE PL/SQL函数,函数定义中使用execute语句动态执行用于修复系统对象的DDL,再使用EXECUTE DIRECT ON语法在指定的DN上执行修复函数调用,从而解决引入的问题。 在函数内部调用其它无参数的函数时,可以省略括号,直接使用函数名进行调用。 不打开参数set behavior_compat_options = 'proc_outparam_override'时,被匿名块或存储过程直接调用的函数的OUT,并且RETURN值会被当做OUT出参的第一个值导致调用失败,想正确使用OUT、IN OUT出参,需打开参数set behavior_compat_options = 'proc_outparam_override',见示例。 在函数内部调用其他有出参的函数,如果在赋值表达式中调用时,需要打开guc参数 set behavior_compat_options = 'proc_outparam_override' ,并提前定义与出参类型相同的变量,然后将变量作为出参调用带有出参的其他函数,出参才能生效。否则,被调函数的出参会被忽略。 在打开GUC参数proc_outparam_override后,函数返回值为setof类型时,out出参不会生效。 兼容Oracle风格的函数支持参数注释的查看与导出、导入。 兼容Oracle风格的函数支持介于IS/AS与plsql_body之间的注释的查看与导出、导入。 被授予CREATE ANY FUNCTION权限的用户,可以在用户模式下创建/替换函数。 函数默认为SECURITY INVOKER权限,如果想将默认行为改为SECURITY DEFINER权限,需要设置guc参数behavior_compat_options='plsql_security_definer'。
共100000条
提示

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