华为云用户手册

  • 语法 语法请参见图1。 图1 call_anonymous_block::= using_clause子句的语法参见图2。 图2 using_clause-4 对以上语法格式的解释如下: 匿名块程序实施部分,以BEGIN语句开始,以END语句停顿,以一个分号结束。 USING [IN|OUT|IN OUT] bind_argument,用于指定存放传递给存储过程参数值的变量。bind_argument前的修饰符与对应参数的修饰符一致。 匿名块中间的输入输出参数使用占位符来指明,要求占位符个数与参数个数相同,并且占位符所对应参数的顺序和USING中参数的顺序一致。 目前 GaussDB (DWS)在动态语句调用匿名块时,EXCEPTION语句中暂不支持使用占位符进行输入输出参数的传递。
  • 应用示例 查看新建用户role1的初始权限: 1 2 3 4 select * from PG_DEFAULT_ACL; defaclrole | defaclnamespace | defaclobjtype | defaclacl ------------+-----------------+---------------+----------------- 16820 | 16822 | r | {role1=r/user1} 也可使用如下语句进行转换后更直观的查看: 1 SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Granter", n.nspname AS "Schema", CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' END AS "Type", pg_catalog.array_to_string(d.defaclacl, E', ') AS "Access privileges" FROM pg_catalog.pg_default_acl d LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace ORDER BY 1, 2, 3; 输出结果如下,表示通过用户user1授予用户role1对模式“user1”有读的权限。 1 2 3 4 Granter | Schema | Type | Access privileges ---------+--------+-------+------------------- user1 | user1 | table | role1=r/user1 (1 row)
  • 示例 修改现有名为hdfs_server的address: 1 ALTER SERVER hdfs_server OPTIONS ( SET address '10.10.0.110:25000,10.10.0.120:25000'); 修改现有名为hdfs_server的hdfscfgpath: 1 ALTER SERVER hdfs_server OPTIONS ( SET hdfscfgpath '/opt/bigdata/hadoop');
  • 语法格式 修改外部服务的参数。 1 2 ALTER SERVER server_name [ VERSION 'new_version' ] [ OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ] ) ]; 在OPTIONS选项里,ADD、SET和DROP指定要执行的操作,未指定时默认为ADD操作。option和value为对应操作的参数。 对于HDFS Server目前只支持SET操作,ADD/DROP操作现有版本不支持。语法中SET和DROP操作语法依然保留,以便后续扩展使用。 修改外部服务的所有者。 1 2 ALTER SERVER server_name OWNER TO new_owner; 修改外部服务的名字。 1 2 ALTER SERVER server_name RENAME TO new_name; 刷新HDFS配置文件。仅8.0.0.10及以上版本支持(8.1.0除外)。 1 ALTER SERVER server_name REFRESH OPTIONS;
  • 参数说明 server_name 所修改的server的名字。 new_version 修改后server的新版本名称。 修改server所支持的OPTIONS如下所示: address OBS服务的终端节点(Endpoint)。 HDFS集群的主备节点所在的IP地址以及端口。 对于HDFS server,address必须存在,所以ADD和DROP操作不被允许。 address目前只支持点分十进制格式的ipv4格式,且address字符串中不能出现空格,多组address以逗号作为分隔符。ip和port之间使用“:”来区分。HDFS集群中ip、port组对推荐设置两组,分别对应HDFS NameNode主备节点的address。 当server类型为 DLI 时,address为DLI服务上数据所存储的OBS address。 hdfscfgpath HDFS集群的配置文件。 若HDFS走安全模式时,hdfscfgpath是必选项,否则为可选项。 若设置hdfscfgpath时,path仅能设置一个。 fed 表示dfs_fdw连接的是HDFS为联邦模式。 取值rbf,表示HDFS为联邦rbf方式。 该参数8.1.2及以上版本支持;8.0.0基线版本下,仅8.0.0.10及以上版本支持。 encrypt 是否对数据进行加密,该参数仅支持在type为OBS时设置。默认值为off。 取值范围: on表示对数据进行加密。 off表示不对数据进行加密。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取),创建外表时AK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为OBS时设置。 dli_address DLI服务的终端节点,即endpoint。该参数仅支持type为DLI时设置。 dli_access_key DLI访问协议对应的AK值(DLI云服务界面由用户获取),创建外表时AK值会保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 dli_secret_access_key DLI访问协议对应的SK值(DLI云服务界面由用户获取),创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为DLI时设置。 region 此参数表示OBS服务的IP地址或者 域名 信息。该参数仅支持type为OBS时设置。 dbname 用于协同分析、跨集群互联互通,表示将要连接的远端集群的数据库名字。 username 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名。 password 用于协同分析、跨集群互联互通,表示将要连接的远端集群的用户名密码。 syncsrv 仅用于跨集群互联互通,表示数据同步过程中使用到的GDS服务,设置方式与GDS外表的location属性相同。该参数仅8.1.2及以上版本支持。 new_owner 修改后server的新拥有者。更改所有者,必须是外部服务器的所有者并且也是新的所有者角色的直接或者间接成员,并且必须对外部服务器的外部数据封装器有USAGE权限。 new_name 修改后server的新名字。 REFRESH OPTIONS 刷新HDFS的配置文件信息,在配置文件有变动时执行,若不执行可能会访问报错。
  • 查看GUC参数 GaussDB(DWS)的GUC参数影响数据库的系统行为,用户可根据业务场景和数据量查看并调整GUC参数取值。 查看GUC参数方式一:集群创建成功后,用户可在GaussDB(DWS) 管理控制台上查看常用的数据库参数。 查看GUC参数方式二:成功连接集群后,通过SQL命令的方式查看数据库GUC参数。 使用SHOW命令。 方式二只能查CN的GUC参数值,DN的GUC参数值可通过方式一:通过管理控制台查看。 使用如下命令查看单个参数: 1 SHOW server_version; server_version显示数据库版本信息的参数。 使用如下命令查看所有参数: 1 SHOW ALL; 使用pg_settings视图。 使用如下命令查看单个参数: 1 SELECT * FROM pg_settings WHERE NAME='server_version'; 使用如下命令查看所有参数: 1 SELECT * FROM pg_settings; 父主题: GUC参数
  • 操作步骤 创建一个名为thesaurus_astro的TZ词典。 以一个简单的天文学词典thesaurus_astro为例,其中定义了两组天文短语及其同义词如下: 1 2 supernovae stars : sn crab nebulae : crab 执行如下语句创建TZ词典: 1 2 3 4 5 6 CREATE TEXT SEARCH DICTIONARY thesaurus_astro ( TEMPLATE = thesaurus, DictFile = thesaurus_astro, Dictionary = pg_catalog.english_stem, FILEPATH = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' ); 其中,词典定义文件全名为thesaurus_astro.ths,所在目录为 "obs://bucket_name/path accesskey=ak secretkey=sk region=rg"。子词典pg_catalog.english_stem是预定义的Snowball类型的英语词干词典,用于规范化输入词,子词典自身相关配置(例如停用词等)不在此处显示。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 创建词典后,将其绑定到对应文本搜索配置中需要处理的token类型上: 1 2 3 ALTER TEXT SEARCH CONFIGURATION english ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_astro, english_stem; 使用TZ词典。 测试TZ词典。 ts_lexize函数对于测试TZ词典作用不大,因为该函数是按照单个token处理输入。可以使用plainto_tsquery、to_tsvector、to_tsquery函数测试TZ词典,这些函数能够将输入分解成多个token(to_tsquery函数需要将输入加上引号)。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT plainto_tsquery('english','supernova star'); plainto_tsquery ----------------- 'sn' (1 row) SELECT to_tsvector('english','supernova star'); to_tsvector ------------- 'sn':1 (1 row) SELECT to_tsquery('english','''supernova star'''); to_tsquery ------------ 'sn' (1 row) 其中,supernova star匹配了词典thesaurus_astro定义中的supernovae stars,这是因为在thesaurus_astro词典定义中指定了Snowball类型的子词典english_stem,该词典移除了e和s。 如果同时需要索引原始短语,只要将其同时放置在词典定义文件中对应定义的右侧即可,如下: 1 2 3 4 5 6 7 8 9 10 11 supernovae stars : sn supernovae stars ALTER TEXT SEARCH DICTIONARY thesaurus_astro ( DictFile = thesaurus_astro, FILEPATH = 'file:///home/dicts/'); SELECT plainto_tsquery('english','supernova star'); plainto_tsquery ----------------------------- 'sn' & 'supernova' & 'star' (1 row)
  • 注意事项 由于TZ词典需要识别短语,所以在处理过程中必须保存当前状态并与解析器进行交互,以决定是否处理下一个token或是结束当前识别。此外,TZ词典配置时需谨慎,如果设置TZ词典仅处理asciiword类型的token,则类似one 7的分类词典定义将不会生效,因为uint类型的token不会传给TZ词典处理。 在索引期间要用到分类词典,因此分类词典参数中的任何变化都要求重新索引。对于其他大多数类型的词典来说,类似添加或删除停用词这种修改并不需要强制重新索引。
  • width_bucket(operand double precision, b1 double precision, b2 double precision, count int) 描述:设定分组范围的最小值、最大值和分组个数,构建指定个数的大小相同的分组,返回指定字段值落入的分组编号。b1为分组范围的最小值,b2为分组范围的最大值,count为分组的个数。 返回值类型:integer 示例: 1 2 3 4 5 SELECT width_bucket(5.35, 0.024, 10.06, 5); width_bucket -------------- 3 (1 row)
  • width_bucket(operand numeric, b1 numeric, b2 numeric, count int) 描述:设定分组范围的最小值、最大值和分组个数,构建指定个数的大小相同的分组,返回指定字段值落入的分组编号。b1为分组范围的最小值,b2为分组范围的最大值,count为分组的个数。 返回值类型:integer 示例: 1 2 3 4 5 SELECT width_bucket(5.35, 0.024, 10.06, 5); width_bucket -------------- 3 (1 row)
  • log(double precision or numeric) 描述:以10为底的对数。 ORA和TD兼容模式下,表现为以10为底的对数。 MySQL兼容模式下,表现为自然对数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -- ORA兼容模式 SELECT log(100.0); log -------------------- 2.0000000000000000 (1 row) -- TD兼容模式 SELECT log(100.0); log -------------------- 2.0000000000000000 (1 row) -- MySQL兼容模式 SELECT log(100.0); log -------------------- 4.6051701859880914 (1 row)
  • round(double precision or numeric) 描述:离输入参数最近的整数。 返回值类型:与输入相同。 示例: 1 2 3 4 5 6 7 8 9 10 11 SELECT round(42.4); round ------- 42 (1 row) SELECT round(42.6); round ------- 43 (1 row) 当调用round函数时,数值类型将舍入零,而(在大多数计算机上) 实数和双精度型,以最接近的偶数为结果。
  • FORALL批量查询语句 语法图 图5 forall::= 变量index会自动定义为integer类型并且只在此循环里存在。index的取值介于low_bound和upper_bound之间。 示例 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 CREATE TABLE hdfs_t1 ( title NUMBER(6), did VARCHAR2(20), data_peroid VARCHAR2(25), kind VARCHAR2(25), interval VARCHAR2(20), time DATE, isModified VARCHAR2(10) ) DISTRIBUTE BY hash(did); INSERT INTO hdfs_t1 VALUES( 8, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK' ); CREATE OR REPLACE PROCEDURE proc_forall() AS BEGIN FORALL i IN 100..120 insert into hdfs_t1(title) values(i); END; / --调用函数 CALL proc_forall(); --查询存储过程调用结果 SELECT * FROM hdfs_t1 WHERE title BETWEEN 100 AND 120; --删除存储过程和表 DROP PROCEDURE proc_forall; DROP TABLE hdfs_t1;
  • FOR_LOOP(integer变量)语句 语法图 图3 for_loop::= 变量name会自动定义为integer类型并且只在此循环里存在。变量name介于lower_bound和upper_bound之间。 当使用REVERSE关键字时,lower_bound必须大于等于upper_bound,否则循环体不会被执行。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --从0到5进行循环 CREATE OR REPLACE PROCEDURE proc_for_loop() AS BEGIN FOR I IN 0..5 LOOP DBMS_OUTPUT.PUT_LINE('It is '||to_char(I) || ' time;') ; END LOOP; END; / --调用函数 CALL proc_for_loop(); --删除存储过程 DROP PROCEDURE proc_for_loop;
  • FOR_LOOP查询语句 语法图 图4 for_loop_query::= 变量target会自动定义,类型和query的查询结果的类型一致,并且只在此循环中有效。target的取值就是query的查询结果。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 --循环输出查询结果。 CREATE OR REPLACE PROCEDURE proc_for_loop_query() AS record VARCHAR2(50); BEGIN FOR record IN SELECT spcname FROM pg_tablespace LOOP dbms_output.put_line(record); END LOOP; END; / --调用函数 CALL proc_for_loop_query(); --删除存储过程 DROP PROCEDURE proc_for_loop_query;
  • 参数 表1 SQLSetStmtAttr参数 关键字 参数说明 StatementtHandle 语句句柄。 Attribute 需设置的属性。 ValuePtr 指向对应Attribute的值。依赖于Attribute的值,ValuePtr可能是32位无符号整型值,或指向以空结束的字符串,二进制缓冲区,或者驱动定义值。注意,如果ValuePtr参数是驱动程序指定值。ValuePtr可能是有符号的整数。 StringLength 如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。
  • 原型 1 2 3 4 SQLRETURN SQLSetStmtAttr(SQLHSTMT StatementHandle SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
  • 配置集群参数 查询TopSQL资源监控信息之前,需要先配置相关的GUC参数,以便能查询到作业的资源监控历史信息或归档信息。步骤如下: 登录GaussDB(DWS)管理控制台。 在“集群管理”页面,找到所需要的集群,单击集群名称,进入集群详情页面。 单击“参数修改”标签页,可以看到当前集群的参数值。 修改参数resource_track_duration值为合适的值,单击“保存”按钮进行保存。 enable_resource_record开关打开后,会引起存储空间膨胀及轻微性能影响,不用时请关闭。 返回集群管理页面,单击右上角的刷新按钮,等待集群参数配置完成。
  • 应用示例 查看分区表的分区信息: 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 CREATE TABLE web_returns_p1 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE (wr_returned_date_sk) ( PARTITION p2016 VALUES LESS THAN(20161231), PARTITION p2017 VALUES LESS THAN(20171231), PARTITION p2018 VALUES LESS THAN(20181231), PARTITION p2019 VALUES LESS THAN(20191231), PARTITION p2020 VALUES LESS THAN(maxvalue) ); SELECT * FROM dba_tab_partitions where table_name='web_returns_p1'; table_owner | schema | table_name | partition_name | high_value | pretty_high_value | tablespace_name -------------+--------+----------------+----------------+------------+-------------------+-------------------- dbadmin | public | web_returns_p1 | p2016 | 20161231 | 20161231 | DEFAULT TABLESPACE dbadmin | public | web_returns_p1 | p2017 | 20171231 | 20171231 | DEFAULT TABLESPACE dbadmin | public | web_returns_p1 | p2018 | 20181231 | 20181231 | DEFAULT TABLESPACE dbadmin | public | web_returns_p1 | p2019 | 20191231 | 20191231 | DEFAULT TABLESPACE dbadmin | public | web_returns_p1 | p2020 | MAXVALUE | MAXVALUE | DEFAULT TABLESPACE (5 rows)
  • 概述 一种可排序数据类型的每一种表达式都有一个排序规则(系统内部的可排序数据类型可以是text、varchar和char等字符类型。用户定义的基础类型也可以被标记为可排序的,并且在一种可排序数据类型上的域也是可排序的)。如果该表达式是一个列引用,该表达式的排序规则就是列所定义的排序规则。如果该表达式是一个常量,排序规则就是该常量数据类型的默认排序规则。更复杂表达式的排序规则根据其输入的排序规则得来。
  • 示例 语句中显示指定COLLATE子句。 1 2 3 4 5 SELECT 'a' = 'A', 'a' = 'A' COLLATE case_insensitive; ?column? | ?column? ----------+---------- f | t (1 row) 建表时指定列属性为case_insensitive。 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE t1 (a text collate case_insensitive); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE \d t1 Table "public.t1" Column | Type | Modifiers --------+------+-------------------------- a | text | collate case_insensitive INSERT INTO t1 values('a'),('A'),('b'),('B'); INSERT 0 4 建表时指定,查询时无需指定。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT a, a='a' FROM t1; a | ?column? ---+---------- A | t B | f a | t b | f (4 rows) SELECT a, count(1) FROM t1 GROUP BY a; a | count ---+------- a | 2 B | 2 (2 rows) CASE表达式,以WHEN子句中的COLLATE设置为准。 1 2 3 4 5 6 7 8 SELECT a,case a when 'a' collate case_insensitive then 'case1' when 'b' collate "C" then 'case2' else 'case3' end FROM t1; a | case ---+------- A | case1 B | case3 a | case1 b | case2 (4 rows) 跨子查询隐式派生。 1 2 3 4 5 6 7 8 9 SELECT * FROM (SELECT a collate "C" from t1) WHERE a in ('a','b'); a --- a b (2 rows) SELECT * FROM t1,(SELECT a collate "C" from t1) t2 WHERE t1.a=t2.a; ERROR: could not determine which collation to use for string hashing HINT: Use the COLLATE clause to set the collation explicitly. 由于collate case_insensitive为不敏感排序,结果集不确定,再使用敏感排序筛选,会有结果集不稳定的问题,因此语句中避免出现敏感排序和不敏感排序混用。 使用collate case_insensitive指定字符类型为大小写不敏感后,性能较使用前会有所下降,因此性能敏感场景需谨慎评估后使用。
  • 排序规则组合原则 当表达式的collation未指定时,则认为是默认的排序规则default,它表示数据库的区域设置。表达式的collation也可能是不确定的,此时,排序操作和其他不确定的排序规则的操作就会失败。 对于函数或操作符调用,其排序规则将通过检查所有参数的collation来决定。如果该函数或操作符调用的结果是一种可排序的数据类型,若有外层表达式要用到排序规则,那么该外层的表达式将继承对应函数和操作符所调用结果集的排序规则。 表达式的排序规则派生可以是显式或隐式。该区别会影响多个不同的排序规则出现在同一个表达式中时如何对collation进行组合。当执行语句使用COLLATE子句时,将发生显式派生,否则为隐式派生。当多个排序规则组合时,规则如下: 如果输入表达式中存在显式COLLATE派生,则在输入表达式之间的所有显式派生的COLLATE必须相同,否则将产生冲突错误。如果存在显式COLLATE,那它就是排序规则组合的结果。 如果不存在显式COLLATE,那所有输入表达式必须具有相同的隐式COLLATE或默认COLLATE。如果存在非默认COLLATE,那它就是排序规则组合的结果。否则,结果是默认COLLATE。 如果在输入表达式之间存在多个冲突的非默认COLLATE,则组合被认为是具有不确定排序规则,这并非一种错误。如果被调用的函数或表达式需要用到排序规则,运行时将产生排序规则未知的错误。 CASE表达式中,比较行为使用的规则以WHEN子句中的COLLATE设置为准。 显示COLLATE的派生仅在当前查询(CTE或SUBQUERY)中生效,查询外则降为隐式派生。
  • 大小写不敏感排序规则支持 从集群8.1.3版本开始,GaussDB(DWS)增加内置排序规则case_insensitive,即对字符类型的大小写不敏感行为(如排序、比较、哈希)。 约束条件: 支持字符类型:char/character/nchar、varchar/character varying/varchar2/nvarchar2/clob/text。 不支持字符类型:“char”和name。 不支持的编码:PG_EUC_JIS_2004、PG_MULE_INTERNAL、PG_LATIN10、PG_WIN874。 不支持CREATE DATABASE时指定到LC_COLLATE。 不支持正则表达式。 不支持字符类型的record比较(如record_eq)。 不支持时序表。 不支持倾斜优化。 不支持RoughCheck优化。
  • 应用示例 查询指定表的索引信息。 1 2 3 4 5 SELECT * FROM pg_indexes WHERE tablename = 'mytable'; schemaname | tablename | indexname | tablespace | indexdef ------------+-----------+----------------+------------+------------------------------------------------------------------------------- public | mytable | idx_mytable_id | | CREATE INDEX idx_mytable_id ON mytable USING btree (id) TABLESPACE pg_default (1 row) 查询当前数据库指定模式下所有表的索引信息。 1 2 3 4 5 6 7 8 9 10 SELECT tablename, indexname, indexdef FROM pg_indexes WHERE schemaname = 'public' ORDER BY tablename,indexname; tablename | indexname | indexdef -----------+--------------------+----------------------------------------------------------------------------------------------------- books | books_pkey | CREATE UNIQUE INDEX books_pkey ON books USING btree (id) TABLESPACE pg_default books | idx_books_tags_gin | CREATE INDEX idx_books_tags_gin ON books USING gin (tags) TABLESPACE pg_default customer | c_custkey_key | CREATE UNIQUE INDEX c_custkey_key ON customer USING btree (c_custkey, c_name) TABLESPACE pg_default mytable | idx_mytable_id | CREATE INDEX idx_mytable_id ON mytable USING btree (id) TABLESPACE pg_default test1 | idx_test_id | CREATE INDEX idx_test_id ON test1 USING btree (id) TABLESPACE pg_default v0 | v0_pkey | CREATE UNIQUE INDEX v0_pkey ON v0 USING btree (c) TABLESPACE pg_default (6 rows)
  • 变量作用域 变量的作用域表示变量在代码块中的可访问性和可用性。只有在它的作用域内,变量才有效。 变量必须在declare部分声明,即必须建立BEGIN-END块。块结构也强制变量必须先声明后使用,即变量在过程内有不同作用域、不同的生存期。 同一变量可以在不同的作用域内定义多次,内层的定义会覆盖外层的定义。 在外部块定义的变量,可以在嵌套块中使用。但外部块不能访问嵌套块中的变量。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 DECLARE emp_id INTEGER :=7788; --定义变量并赋值 outer_var INTEGER :=6688; --定义变量并赋值 BEGIN DECLARE emp_id INTEGER :=7799; --定义变量并赋值 inner_var INTEGER :=6688; --定义变量并赋值 BEGIN dbms_output.put_line('inner emp_id ='||emp_id); --显示值为7799 dbms_output.put_line('outer_var ='||outer_var); --引用外部块的变量 END; dbms_output.put_line('outer emp_id ='||emp_id); --显示值为7788 END; /
  • 变量声明 变量声明语法请参见图1。 图1 declare_variable::= 对以上语法格式的解释如下: variable_name,为变量名。 type,为变量类型。 value,是该变量的初始值(如果不给定初始值,则初始为NULL)。value也可以是表达式。 示例 1 2 3 4 5 6 DECLARE emp_id INTEGER := 7788; --定义变量并赋值 BEGIN emp_id := 5*7784; --变量赋值 END; /
  • %TYPE属性 %TYPE主要用于声明某个与其他变量类型(例如,表中某列的类型)相同的变量。假如想定义一个my_name变量,它的变量类型与employee的firstname类型相同,可使用如下定义: my_name employee.firstname%TYPE 这样定义可以带来两个好处,首先,不用预先知道employee表的firstname类型具体是什么。其次,即使之后firstname类型有了变化,也不需要再次修改my_name的类型。
  • 应用示例 查询名为serial1的数据库对象sequence和哪个表有依赖关系。 先通过系统表PG_CLASS查询序列名为serial1的oid。 1 2 3 4 5 SELECT oid FROM pg_class WHERE relname ='serial1'; oid ------- 17815 (1 row) 使用系统表PG_DEPEND根据所查询的序列serial1的oid获取依赖该序列的对象。 1 2 3 4 5 6 SELECT * FROM pg_depend WHERE objid ='17815'; classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype ---------+-------+----------+------------+----------+-------------+--------- 1259 | 17815 | 0 | 2615 | 2200 | 0 | n 1259 | 17815 | 0 | 1259 | 17812 | 1 | a (2 rows) 根据字段refobjid获取依赖该序列serial1的表的OID,并查询到表名。其结果表示,序列serial1依赖于表customer_address。 1 2 3 4 5 SELECT relname FROM pg_class where oid='17812'; relname ------------------ customer_address (1 row)
  • log_min_error_statement 参数说明:控制在服务器日志中记录错误的SQL语句。 参数类型:SUSET 取值范围:枚举类型,有效值有debug5、debug4、debug3、debug2、debug1、info、log、notice、warning、error、fatal、panic。参数的详细信息请参见表1。 设置为error ,表示导致错误、日志消息、致命错误、panic的语句都将被记录。 设置为panic,表示关闭此特性。 默认值:error
  • log_min_duration_statement 参数说明:当某条语句的持续时间大于或者等于特定的毫秒数时,log_min_duration_statement参数用于控制记录每条完成语句的持续时间。 设置log_min_duration_statement可以很方便地跟踪需要优化的查询语句。对于使用扩展查询协议的客户端,语法分析、绑定、执行每一步所花时间被独立记录。 参数类型:SUSET 当此选项与log_statement同时使用时,已经被log_statement记录的语句文本不会被重复记录。在没有使用syslog情况下,推荐使用log_line_prefix记录PID或会话ID,方便将当前语句消息连接到最后的持续时间消息。 取值范围:整型,-1 ~ INT_MAX,单位为毫秒。 设置为250,所有运行时间不短于250ms的SQL语句都会被记录。 设置为0,输出所有语句的持续时间。 设置为-1,关闭此功能。 默认值:30min
共100000条