EXECUTE
功能描述
执行一个前面准备好的预备语句。因为一个预备语句只在会话的生命期里存在,那么预备语句必须是在当前会话的前些时候用PREPARE语句创建的。
语法格式
EXECUTE name [ ( parameter [, ...] ) ]
参数说明
name:要执行的预备语句的名字;
parameter:给预备语句的一个参数的具体数值,它必须是一个生成与创建这个预备语句时指定参数的数据类型相兼容的值的表达式;
注意事项
如果创建预备语句的PREPARE语句声明了一些参数,那么传递给EXECUTE语句的必须是一个兼容的参数集,否则就会生成一个错误。
范例
PREPARE insert_customer(int,varchar(200),date,varchar(50)) AS INSERT INTO customer VALUES($1,$2,$3,$4);
PREPARE
EXECUTE insert_customer(11, '马超','20200618',15974236);
INSERT 0 1
语法兼容
SQL 标准包括了一个EXECUTE语句, 但是只被用于嵌入式 SQL。
相关语法
DEALLOCATE,PREPARE
EXECUTE DIRECT
功能描述
在指定的节点上执行SQL语句。
语法格式
EXECUTE DIRECT ON ( nodename [, ... ] )
query
参数说明
nodename:指定查询的节点名称,指定多个节点时用逗号分隔;
query:要执行查询语句。
注意事项
只有系统管理员才能执行EXECUTE DIRECT。
由于CN节点不存储用户表数据,不允许指定CN节点执行用户表上的SELECT查询。
范例
SELECT * FROM pgxc_node;
node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_
-----------+-----------+-----------+-----------------+----------------+------------------+--------
cn1 | C | 5432 | 192.168.142.211 | f | f | -117871
cn3 | C | 5432 | 192.168.142.213 | f | f | 110106
dn1 | D | 5433 | 192.168.142.211 | t | t | -56002
dn2 | D | 5433 | 192.168.142.212 | f | f | 35236
dn3 | D | 5433 | 192.168.142.213 | f | f | -70012
(5 rows)
EXECUTE DIRECT ON(dn1) 'select count(*) from t1';
count
--------
324900
(1 row)
SELECT COUNT(*) FROM t1;
count
---------
1000000
(1 row)
语法兼容
在 SQL 标准中没有定义EXECUTE DIRECT语句。
EXPLAIN
功能描述
显示SQL语句的执行计划。
语法格式
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
这里option可以是:
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
参数说明
ANALYZE:显示实际运行时间和其他统计数据,默认值为FALSE;
VERBOSE:显示有关计划的额外信息,默认值为FALSE;
COSTS:包括每个规划节点的估计总成本,以及估计的行数和每行的宽度,默认值为TRUE;
BUFFERS:包括缓冲区的使用情况的信息,默认值为FALSE;
NODES:打印query执行的节点信息;
NUM_NODES:打印执行中的节点的个数信息;
TIMING:包括实际的启动时间和花费在输出节点上的时间信息,默认值为TRUE;
SUMMARY:在查询计划之后包含摘要信息(例如,总计的时间信息);
FORMAT:指定输出格式,取值范围:TEXT、XML、JSON或者YAML,默认为TEXT;
boolean:指定被选中的选项是否应该被打开或关闭,可以指定TRUE、ON或1打开,或指定FALSE、OFF或0禁用,缺省情况下默认为TRUE;
statement:指定要分析的SQL语句。
注意事项
在指定ANALYZE选项时,语句会被执行。如果用户想使用EXPLAIN分析INSERT,UPDATE,DELETE,CREATE TABLE AS或EXECUTE语句,而不想改动数据(执行这些语句会影响数据),请使用这种方法:
START TRANSACTION;
EXPLAIN ANALYZE ...;
ROLLBACK;
范例
EXPLAIN SELECT * FROM disttab;
QUERY PLAN
------------------------------------------------------------------
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn1, dn2, dn3
-> Seq Scan on disttab (cost=0.00..11.70 rows=170 width=426)
(3 rows)
EXPLAIN (FORMAT JSON) SELECT * FROM disttab;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
[
+
{
+
"Plan": {
+
"Node Type": "c3",
+
"Parallel Aware": false,
+
"Startup Cost": 0.00,
+
"Total Cost": 0.00,
+
"Plan Rows": 0,
+
"Plan Width": 0,
+
"Node/s": "dn1, dn2, dn3",
+
"Remote plan": "[\n {\n \"Plan\": {\n \"Node Type\": \"Seq Scan\",\n \"Parallel Aware\": false,\n \"Relation Name\": \"disttab\",\n \"Alias\": \"disttab\",\n \"St
artup Cost\": 0.00,\n \"Total Cost\": 11.70,\n \"Plan Rows\": 170,\n \"Plan Width\": 426\n }\n }\n]\n"+
}
+
}
+
]
(1 row)
语法兼容
在 SQL 标准中没有定义EXPLAIN语句。
相关语法
ANALYZE
FETCH
功能描述
FETCH通过已创建的游标来检索数据。
语法格式
FETCH [ direction [ FROM | IN ] ] cursor_name
其中 direction 可以为空或者以下之一:
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL
参数说明
direction:定义抓取数据的方向及行数,取值范围:
NEXT:从当前关联位置开始,抓取下一行,此为默认值;
PRIOR:从当前关联位置开始,抓取上一行;
FIRST:抓取查询的第一行(和ABSOLUTE 1相同);
LAST:抓取查询的最后一行(和ABSOLUTE -1相同);
ABSOLUTE count:抓取查询中第count行,ABSOLUTE抓取不会比用相对位移移动到需要的数据行更快,因为下层的实现必须遍历所有中间的行;
RELATIVE count:从当前关联位置开始,抓取随后或前面的第count行;
count:抓取随后的count行(和FORWARD count一样);
ALL:从当前关联位置开始,抓取所有剩余的行(和FORWARD ALL一样);
FORWARD:抓取下一行(和NEXT一样);
FORWARD count:与RELATIVE count的效果相同,从当前关联位置开始,抓取随后或前面的第count行;
FORWARD ALL:从当前关联位置开始,抓取所有剩余行;
BACKWARD:GBase 8c当前不支持。从当前关联位置开始,抓取前面一行(和PRIOR一样);
BACKWARD count:GBase 8c当前不支持。从当前关联位置开始,抓取前面的count行(向后扫描);
BACKWARD ALL:GBase 8c当前不支持。从当前关联位置开始,抓取所有前面的行(向后扫描)。
count:整数常量(可以带符号),用来确定要取得的位置或行数;
cursor_name:使用关键字FROM或IN指定游标名称。
注意事项
每个游标都有一个供FETCH使用的关联位置。游标的关联位置可以在查询结果的第一行之前,或者在结果中的任意行,或者在结果的最后一行之后:
游标刚创建完之后,关联位置在第一行之前的。
在抓取了一些移动行之后,关联位置在检索到的最后一行上。
如果FETCH抓取完了所有可用行,它就停在最后一行后面,或者在反向抓取的情况下是停在第一行前面。
FETCH ALL或FETCH BACKWARD ALL将总是把游标的关联位置放在最后一行或者在第一行前面。
如果游标定义了NO SCROLL,则不允许使用例如FETCH BACKWARD之类的反向抓取。
NEXT,PRIOR,FIRST,LAST,ABSOLUTE,RELATIVE形式在恰当地移动游标之后抓取一条记录。如果后面没有数据行,就返回一个空的结果,此时游标就会停在查询结果的最后一行之后(向后查询时)或者第一行之前(向前查询时)。
FORWARD和BACKWARD形式在向前或者向后移动的过程中抓取指定的行数,然后把游标定位在最后返回的行上;或者是,如果count大于可用的行数,则在所有行之后(向后查询时)或者之前(向前查询时)。
RELATIVE 0,FORWARD 0,BACKWARD 0都要求在不移动游标的前提下抓取当前行,也就是重新抓取最近刚抓取过的行。除非游标定位在第一行之前或者最后一行之后,这个动作都应该成功,而在那两种情况下,不返回任何行。
当FETCH的游标上涉及列存表时,不支持BACKWARD、PRIOR、FIRST等涉及反向获取操作。
范例
BEGIN WORK;
BEGIN
DECLARE g_ft SCROLL CURSOR FOR SELECT * FROM customer;
DECLARE CURSOR
FETCH FORWARD 5 FROM g_ft;
id | name | birthday | tel
----+------+------------+-----------
3 | 张飞 | 2020-04-03 | 142356789
5 | 孙坚 | 2020-04-05 | 145623789
1 | 刘备 | 2020-04-01 | 123456789
4 | 曹操 | 2020-04-04 | 154623789
8 | 周瑜 | |
(5 rows)
FETCH PRIOR FROM g_ft;
id | name | birthday | tel
----+------+------------+-----------
4 | 曹操 | 2020-04-04 | 154623789
(1 row)
CLOSE g_ft;
CLOSE CURSOR
COMMIT WORK;
COMMIT
语法兼容
SQL标准只定义FETCH在嵌入式SQL中使用。
相关语法
CLOSE, DECLARE, MOVE
GRANT
功能描述
对角色和用户进行授权操作。
语法格式
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTION function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_USER
| SESSION_USER
GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]
参数说明
role_name:已存在用户名称;
table_name:已存在表名称;
column_name:已存在字段名称;
schema_name:已存在模式名称;
database_name:已存在数据库名称;
funcation_name:已存在函数名称;
sequence_name:已存在序列名称;
domain_name:已存在域类型名称;
fdw_name:已存在外部数据包名称;
lang_name:已存在语言名称;
type_name:已存在类型名称;
group_name:已存在的子集群名称;
src_name:已存在的Data Source对象名称;
argmode:参数模式;
arg_name:参数名称;
arg_type:参数类型;
loid:包含本页的大对象的标识符;
tablespace_name:表空间名称;
directory_name:目录名称;
WITH GRANT OPTION:如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。
注意事项
GRANT的权限分类如下:
SELECT:允许对指定的表、视图、序列执行SELECT语句;
INSERT:允许对指定的表执行INSERT语句;
UPDATE:允许对声明的表中任意字段执行UPDATE语句。SELECT… FOR UPDATE和SELECT… FOR SHARE除了需要SELECT权限外,还需要UPDATE权限;
DELETE:允许执行DELETE语句删除指定表中的数据;
TRUNCATE:允许执行TRUNCATE语句删除指定表中的所有记录;
REFERENCES:创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限;
TRIGGER:允许在指定的表上创建触发器;
CREATE:
对于数据库,允许在数据库里创建新的模式;
对于模式,允许在模式中创建新的对象。如果要重命名一个对象,用户除了必须是该对象的所有者外,还必须拥有该对象所在模式的CREATE权限;
对于表空间,允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间;
CONNECT:允许用户连接到指定的数据库;
TEMPORARY | TEMP:允许在使用指定数据库时创建临时表;
EXECUTE:允许使用指定的函数,以及利用这些函数实现的操作符;
USAGE:
对于过程语言,允许用户在创建函数的时候指定过程语言;
对于模式,USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名字;
对于序列,USAGE允许使用currval和nextval函数;
对于类型和域,USAGE允许使用该类型或域来创建表、函数和其他模式对象;
对于外部数据包装器,USAGE允许使用该外部数据包装器创建新服务器;
对于服务器,USAGE允许使用该服务器创建外部表、以及创建、修改或删除与该服务器相关的用户映射;
ALL PRIVILEGES:一次性给指定用户/角色赋予所有可赋予的权限。
范例
GRANT INSERT ON customer TO PUBLIC;
GRANT
语法兼容
该命令部分兼容SQL。
相关语法
REVOKE, ALTER DEFAULT PRIVILEGES
INSERT
功能描述
向表中添加一行或多行数据。
语法格式
[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
[ OVERRIDING { SYSTEM | USER} VALUE ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
[ ON CONFLICT [ conflict_target ] conflict_action ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
其中 conflict_target 可以是以下之一:
( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
ON CONSTRAINT constraint_name
并且 conflict_action 是以下之一:
DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
参数说明
INSERT子句:
with_query:用于声明一个或多个可以在主查询中通过名字引用的子查询,相当于临时表;
table_name:要插入数据的目标表名;
alias:table_name的替补名称,当提供了一个别名时,它会完全隐藏掉表的实际名称;
column_name:目标表中的字段名,字段名可以有子字段名或者数组下标修饰;
OVERRIDING SYSTEM VALUE:定义为GENERATED ALWAYS的标识列指定显式值时不报错;
OVERRIDING USER VALUE:定义为GENERATED BY DEFAULT的标识列提供的值将被忽略;
DEFAULT VALUES:所有列都将填充为默认值;
expression:赋予对应列的一个有效表达式或值;
DEFAULT:对应字段名的缺省值。如果没有缺省值,则为NULL;
query:一个查询语句(SELECT语句),将查询结果作为插入的数据;
output_expression:NSERT命令在每一行都被插入之后用于计算输出结果的表达式,该表达式可以使用table的任意字段,可以使用*返回被插入行的所有字段;
output_name:字段的输出名称;
ON CONFLICT子句:
conflict_target:通过选择仲裁索引指定与ON CONFLICT相冲突的行,执行唯一索引或显式命名约束的方式;
ON CONFLICT DO NOTHING的conflict_target是可选的,缺省情况下与所有有效约束(以及唯一索引)的冲突都将被处理;
ON CONFLICT DO UPDATE的conflict_target是必选的;
conflict_action:指定一个可替换的 ON CONFLICT动作;
DO NOTHING;
DO UPDATE:指定在冲突情况下要执行的UPDATE动作,ON CONFLICT DO UPDATE中的SET和 WHERE子句能够使用该表的名称访问现有的行;
index_column_name:table_name列的名称,用来推断仲裁索引;
index_expression:用来推断出现在索引定义中的table_name列上的表达式;
collation:强制index_column_name或 index_expression使用特定的排序规则以便在推断期间能被匹配,通常会被省略;
opclass:强制index_column_name或 index_expression使用特定的操作符类以便推断期间能被匹配,通常会被省略;
index_predicate:用于允许推断部分唯一索引;
constraint_name:用名称显式地指定一个仲裁者约束,而不是推断一个约束或者索引;
condition:返回boolean值的表达式,只有当该表达式返回为true的行才将被更新。
注意事项
对分区表进行操作时,如果其中的输入违反了分区约束,将会报错。
范例
INSERT INTO customer VALUES(12,'关平','20200622',123456789);
INSERT 0 1
语法兼容
INSERT符合SQL标准,只有RETURNING子句是一种 PostgreSQL扩展。
LISTEN
功能描述
监听一个通知。
语法格式
LISTEN channel
参数说明
channel:一个通知频道的名称,可以是任意标识符。
注意事项
LISTEN在事务提交时生效。
如果在一个后来被回滚的事务中执行了LISTEN或UNLISTEN,被监听的通知频道集合不会变化。
一个已经执行了LISTEN的事务不能为两阶段提交做准备。
范例
LISTEN virtual;
LISTEN
NOTIFY virtual;
NOTIFY
Asynchronous notification "virtual" received from server process with PID 12245.
语法兼容
在 SQL 标准中没有LISTEN语句。
相关语法
NOTIFY, UNLISTEN
LOAD
功能描述
载入一个共享库文件。
语法格式
LOAD 'filename'
注意事项
这个命令把一个共享库文件载入到GBase 8c服务器的地址空间中。
库文件名通常只是一个裸文件名,在服务器的库搜索路径中寻找,或者给出完整的路径名。文件扩展名可以省略。
非管理员用户只能将LOAD应用在位于 $libdir/plugins/中的库文件。
LOAD命令只能加载本地库,如要应用到整个集群中,应在全部的CN和DN节点上手动加载库,或编辑每个节点的postgresql.conf。
语法兼容
LOAD是一种 PostgreSQL扩展。
相关语法
CREATE FUNCTION
LOCK
功能描述
锁定表。
语法格式
LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ]
其中 lockmode 可以是以下之一:
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
参数说明
name:要锁定的表的名字,可以被模式修饰;如果在表名前指定了ONLY,则只有该表会被锁定;如果没有指定ONLY,则该表及其后代都会被锁定;可以在表名后加*以包含所有后代;LOCK TABLE命令中声明的表的顺序就是上锁的顺序;
lockmode:指定该锁与哪些其他锁冲突;缺省情况下使用最严格的ACCESS EXCLUSIVE模式;
NOWAIT:声明LOCK TABLE不去等待任何冲突的锁释放,如果无法立即获取该锁,该命令退出并且发出一个错误信息;
注意事项
LOCK命令必须在事务中执行。
LOCK TABLE ... IN ACCESS SHARE MODE需要在目标表上有SELECT权限。所有其他形式的LOCK需要UPDATE和/或DELETE权限。
没有UNLOCK TABLE命令,锁总是在事务结束时释放。
LOCK TABLE只处理表级的锁,因此那些带“ROW”字样的锁模式都是有歧义的。这些模式名字通常可理解为用户试图在一个被锁定的表中获取行级的锁。同样,ROW EXCLUSIVE模式也是一个可共享的表级锁。注意,只要是涉及到LOCK TABLE ,所有锁模式都有相同的语意,区别仅在于规则中锁与锁之间是否冲突。
冲突的行级锁:
要求的锁模式
当前的锁模式
FOR KEY SHARE
FOR SHARE
FOR NO KEY UPDATE
FOR UPDATE
FOR KEY SHARE
X
FOR SHARE
X
X
FOR NO KEY UPDATE
X
X
X
FOR UPDATE
X
X
X
X
范例
BEGIN;
BEGIN
LOCK TABLE customer IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE
DELETE FROM customer WHERE id = 6;
DELETE 1
COMMIT;
COMMIT
语法兼容
在SQL标准中没有LOCK TABLE,SQL标准中使用SET TRANSACTION指定事务上的并发层次。
MOVE
功能描述
在不检索数据的情况下重新定位一个游标。作用类似于FETCH。
语法格式
MOVE [ direction [ FROM | IN ] ] cursor_name
其中direction可以为空或者以下之一:
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL
参数说明
MOVE命令的参数与FETCH的相同,详细请参见FETCH。
注意事项
MOVE重新定位一个游标而不检索任何数据。功能与FETCH相同,只是不返回行。
范例
BEGIN WORK;
BEGIN
DECLARE g_ft CURSOR FOR SELECT * FROM customer;
DECLARE CURSOR
MOVE FORWARD 5 IN g_ft;
MOVE 5
FETCH 1 FROM g_ft;
id | name | birthday | tel
----+------+----------+-----
9 | 黄忠 | |
(1 row)
CLOSE g_ft;
CLOSE CURSOR
COMMIT WORK;
COMMIT
语法兼容
在SQL标准中没有MOVE语句。
相关语法
CLOSE, DECLARE, FETCH
————————————————
版权声明:本文为优快云博主「aisirea」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/aisirea/article/details/125979936