本部分包含以下内容:
4.1. Ksql基础
4.1.1. 输入和执行命令
通常,您可以使用空格或Tab分隔命令中的单词,可以在单词之间使用额外的空格或Tab提高命令的可读性。
4.1.1.1. 执行命令
在Ksql命令行中,您可以输入一个命令,然后通过Enter键引导Ksql执行。Ksql将处理该命令,并在准备执行另一个命令时重新显示命令提示符。
4.1.2. 列出表的定义
要查看给定表每个列的定义,可以使用Ksql的
\d[S+] [ pattern
] 命令(详见 \d 命令描述)。例如:
test=# \d parts Table "public.parts" Column | Type | Collation | Nullable | Default -------+----------------------------+-----------+----------+-------- pnum | integer | | | pname | character varying(15 char) | | |
4.1.3. 列出 PL/SQL 定义
要查看函数的定义,可以使用Ksql的
\df[anptwS+] [ pattern
] 命令(详见 \df 命令描述)。例如:
CREATE or REPLACE FUNCTION TESTFUNC() RETURNS integer AS $test$ BEGIN RETURN 1; $test$ LANGUAGE plsql;
test=# \df TESTFUNC List of functions Schema | Name | Result data type | Argument data types | Type -------+----------+------------------+---------------------+------ public | testfunc | integer | | func (1 row)
4.1.4. 列出模式
4.1.4.1. 概述
高级用户可以使用字符类等正则表达式记法,如
[0-9]
可以匹配任意数字。所有的正则表达式特殊字符都按照 POSIX正则表达式 所说的工作,以下字符除外:.
会按照上面所说的作为一种分隔符,*
会被翻译成正则表达式记号.*
,?
会被翻译成.
,而$
则按字面意思匹配。根据需要,可以通过书写?
、(R
+|)、(R
|)和R
?来分别模拟模式字符.
、R
*和R
?。$
不需要作为一个正则表达式字符,因为模式必须匹配整个名称,而不是像正则表达式的常规用法那样解释(换句话说,$
会被自动地追加到模式上)。如果不希望该模式的匹配位置被固定,可以在开头或者结尾写上*
。注意在双引号内,所有的正则表达式特殊字符会失去其特殊含义并且按照其字面意思进行匹配。还有,在操作符名称模式中(即作为\do
的参数),正则表达式特殊字符也按照字面意思进行匹配。
4.1.4.2. 列出模式
在Ksql中您可以使用
\dn[S+] [ pattern
]命令列出模式(详见 \dn 命令描述)。例如:
test=# \dn public List of schemas Name | Owner ------+---------- public| user1 (1 row)
4.1.5. 运行 SQL 命令
SQL命令语言使您能够操作数据库中的数据。有关具体SQL命令的信息,请参考KingbaseES数据库SQL语言。
SELECT a, b
如果输入错误,使用 Backspace 删除并重新输入。完成后按 Enter 键移动到下一行。
FROM parts;
分号(;)表示该命令的结束符,按 Enter 后Ksql将处理该命令,并显示以下结果:
pnum | pname ------+------- (5 rows)
4.1.5.1. 理解 SQL 命令语法
如口语的语法规则来控制我们将单词组合成句子的方式一样,Ksql 也有语法规则控制如何将单词组合成命令。如果希望 Ksql 接受并执行输入的命令,则必须遵守这些规则。
4.1.5.2. 将 SQL 命令换分为单独的行
您可以在任何地方使用SQL命令将其划分为单独的行,只要不拆分单个单词。因此,可以按三行输入一个简单的查询SQL。例如:
SELECT * FROM parts WHERE pnum > 10;
testdb=> CREATE TABLE my_table ( testdb(> first integer not null default 0, testdb(> second text) testdb-> ; CREATE TABLE
4.1.5.3. 结束 SQL 命令
-- 分号结束符 SELECT * FROM parts pnum | pname ------+------- (5 rows) -- \set SQLTERM 定义 / 结束符 \set SQLTERM / select * from parts pnum | pname ------+------- (5 rows) \set SQLTERM ;
4.1.6. 运行 PL/SQL
-- 创建名为 test 的函数 CREATE OR REPLACE FUNCTION test( ) RETURNS SETOF test1 AS $BODY$ BEGIN FOR i IN 1 .. 5 LOOP INSERT INTO test1 VALUES(i,1); END LOOP; RETURN QUERY SELECT * FROM test1; RETURN; $BODY$ LANGUAGE plpgsql; -- 通过 \set SQLTERM 指定 / 结束符 \set SQLTERM / CREATE OR REPLACE FUNCTION test( ) RETURNS SETOF test1 AS BEGIN FOR i IN 1 .. 5 LOOP INSERT INTO test1 VALUES(i,1); END LOOP; RETURN QUERY SELECT * FROM test1; RETURN; \set SQLTERM ; -- 执行 test 函数 SELECT * FROM test();
4.1.6.1. 创建存储过程
存储过程是 PL/SQL 函数、软件包或过程。若要创建存储过程,请使用以下的 SQL 创建命令:
输入这些命令中的任何一个都可以使其处于 PL/SQL 模式,可以在其中输入 PL/SQL 子程序。有关更多的信息参考 KingbaseES 数据库相应的章节。
-- create table tab1 CREATE TABLE tb1( a int, b int -- insert values INSERT INTO tb1 VALUES(1,1); INSERT INTO tb1 VALUES(2,2); -- create test() function \set SQLTERM / CREATE OR REPLACE FUNCTION test( ) RETURNS SETOF test1 AS BEGIN RETURN QUERY SELECT * FROM tb1; RETURN; \set SQLTERM ; -- call test() SELECT test(); ------- (1,1) (2,2) (2 rows)
不是每种存储过程都能通过 SQL 命令执行,比如 CREATE TRIGGER 创建的触发器是通过创建时指定的触发条件自动被触发执行的,并不能通过 SQL 命令执行。
4.1.7. 运行 Ksql 命令
您可以使用 Ksql 命令操作 SQL 命令和 PL/SQL 块,并格式化和打印查询结果。Ksql 对 Ksql 命令的处理方式不同于 SQL 命令或 PL/SQL。例如
-- 将结果格式为 html \pset format html
如果输入错误的内容,可以使用 Backspace 删除它们并重新输入。
-- 查询 SELECT * FROM tb1; select * from tb1; <table border="1"> <th align="center">a</th> <th align="center">b</th> <tr valign="top"> <td align="right">1</td> <td align="right">1</td> <tr valign="top"> <td align="right">2</td> <td align="right">2</td> </table> <p>(2 rows)<br />
4.1.7.1. 理解 Ksql 命令语法
4.1.7.1.1. 元命令概述
你输入到Ksql中的任何以未加引用的反斜线开始的东西都是一个Ksql元命令,它们由Ksql自行处理。这些命令让Ksql对管理和编写脚本更有用。元命令常常被称作斜线或者反斜线命令。
4.1.7.1.2. 命令格式
Ksql命令的格式是用反斜线后面直接跟上一个命令动词,然后是一些参数。参数与命令动词和其他参数之间用任意多个空白字符分隔开。
如果在一个参数中出现一个未加引号的冒号(
:
)后面跟着一个Ksql变量名,它会被该变量的值替换,如
SQL中插入变量
中所述。在其中描述的形式 :'variable_name' 和 :"variable_name" 也有同样的效果。
:{?variable_name
}语法允许测试一个变量是否被定义。它会被TRUE或FALSE替换。用一个反斜线转义该冒号可以防止它被替换。
在一个参数中,封闭在反引号(
`
)中的文本会被当做一个传递给shell的命令行。该命令的输出(移除任何拖尾的新行)会替换反引号文本。在封闭在反引号的文本中,不会有特别的引号或者其他处理发生,
:variable_name
的出现除外,其中
variable_name
是一个会被其值替换的Ksql变量名。此外,Also,appearances of :'variable_name' 的出现会被替换为该变量的值,而值会被适当地加以引用以变成一个单一shell命令参数(后一种形式几乎总是优先,除非你非常确定变量中有什么)。因为回车和换行字符在所有的平台上都不能被安全地引用,:'variable_name' 形式会打印一个错误消息并且在这类字符出现在值中时不替换该变量值。
有些命令把SQL标识符(例如一个表名)当作参数。这些参数遵循SQL的语法规则:无引号的字母被强制变为小写,而双引号(
"
)可以保护字母避免大小写转换并且允许在标识符中包含空白。
在双引号内,成对的双引号会被缩减为结果名称中的单个双引号。例如,
FOO"BAR"BAZ
会被解释成
fooBARbaz
,而
"A weird"" name"
会变成
A weird" name
。
对参数的解析会在行尾或者碰到另一个未加引号的反斜线时停止。一个未加引号的反斜线被当做新元命令的开始。特殊的序列
\\
(两个反斜线)表示参数结束并且应继续解析SQL命令(如果还有)。使用这种方法,SQL命令和Ksql命令可以被自由地混合在一行中。但是无论在何种情况中,元命令的参数都无法跨越一行。
很多元命令作用在当前查询缓冲区上。这就是一个缓冲区而已,它保存任何已经被键入但是还没有发送到服务器执行的SQL命令文本。这将包括之前输入的行以及在该元命令同一行上出现在前面的任何文本。
4.1.7.1.3. 命令行编辑
$if ksql set disable-completion on $endif
(这不是Ksql特性而是Readline的特性。进一步的细节请阅读它的文档。)
4.1.7.1.4. 命令提示符
被选中的提示符变量会被原样打印,除非碰到一个百分号(
%
)。百分号的下一个字符会被特定的其他文本替换。预定义好的替换有:
数据库会话的用户名(在数据库会话期间,这个值可能会因为命令
SET SESSION AUTHORIZATION
的结果而改变)。如果会话用户时一个数据库超级用户,则是
#
,否则是一个>
(在数据库会话期间,这个值可能会因为命令SET SESSION AUTHORIZATION
的结果而改变)。事务状态:当不在事务块中时是一个空字符串,在一个事务块中时是
*
,在一个失败的事务块中时是!
,当事务状态是未判定时(例如因为没有连接)为?
。
:literal:`%\
command
`
command
的输出,类似于平常的“反引号”替换。
%[
...%]
提示符可以包含终端控制字符,例如改变提示符文本的颜色、背景或者风格以及更改终端窗口标题的控制字符。为了让Readline的行编辑特性正确工作,这些不可打印的控制字符必须被包裹在
%[
和%]
之间以指定它们是不可见的。在提示附中可以出现多个这样的标识对。例如:testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '会导致一个在兼容 VT100的彩色终端上的粗体(
1;
)的、黑底黄字(33;40
)的提示符。
要在你的提示符中插入一个百分号,可以写成
%%
。提示符 1 和 2 的默认提示是
'%/%R%# '
,提示符 3 的提示是
'>> '
。
例如,现在我们把提示符改一改:
testdb=> \set PROMPT1 '%n@%m %~%R%# ' peter@localhost testdb=>
4.1.8. 变量
Ksql提供了和普通 Unix 命令 shell 相似的变量替换特性。变量简单来说就是一对名称/值,其中值可以是任意长度的任意字符串。名称必须由字母(包括非拉丁字母)、数字和下划线构成。
要设置一个变量,可以使用Ksql的元命令
\set
。例如:
testdb=> \set foo bar
会设置
foo
为值
bar
。要检索该变量的内容,可以在名称前放一个冒号,例如:
testdb=> \echo :foo
这在常规 SQL 命令和元命令中均有效,下文的 SQL中插入变量 中有更多细节。
如果调用
\set
时没有第二个参数,该变量会被设置为一个空字符串值。要重置(即删除)一个变量,可以使用命令
\unset
。要显示所有变量的值,在调用
\set
时不带任何参数即可。
注意
\set
的参数服从与其他命令相同的替换规则。因此可以构造有趣的引用,例如
\set :foo 'something'
以及分别得到Perl或者PHP的“软链接”或者“可变变量”。这些构造出来的东西并没有什么用处。在另一方面,
\set bar :foo
是一种很好的拷贝变量的方法。
有一些变量会被Ksql特殊对待。它们表示特定的选项设置,运行时这类选项设置可以通过修改该变量的值来改变,或者在某些情况下它们表示Ksql的可更改的状态。按照惯例,所有被特殊对待的变量的名称由全部大写形式的 ASCII 字母(还有可能是数字和下划线)组成。为了确保未来最大的兼容性,最好避免使用这类变量名。
控制Ksql行为的变量通常不能被重置或者设置为无效值。允许
\unset
命令,但它会被解释为将变量设置为它的默认值。没有第二参数的
\set
命令会被解释为将变量设置为
on
(对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值
on
和
off
的控制变量也能接受其他常见的布尔值拼写方式,例如
true
和
false
。
被特殊对待的变量是:
AUTOCOMMIT
在被设置为
on
(默认)时,每一个 SQL 命令在成功完成时会被自动提交。在这种模式中要推迟提交,必须输入一个BEGIN
或者START TRANSACTION
SQL 命令。当被设置为off
或者被重置时,在显式发出COMMIT
或者END
之前,SQL 命令不会被提交。自动提交打开模式会为你发出一个隐式的BEGIN
,在任何尚未在事务块中且本身即不是BEGIN
或其他事务控制命令,也不是无法在事务块中执行的命令(例如VACUUM
)之前。注意
在自动提交关闭模式中,必须通过
ABORT
或者ROLLBACK
显式地放弃任何失败的事务。还要记住,如果退出会话时没有提交,则所有的工作都会丢失。注意
自动提交打开模式是KingbaseES的传统行为,但是自动提交关闭模式更接近于 SQL 的规范。如果更喜欢自动提交关闭模式,可以在系统级的
ksqlrc
文件或者个人的~/.ksqlrc
文件中设置它。
COMP_KEYWORD_CASE
确定在补全一个 SQL关键词时要使用的大小写形式。如果被设置为
lower
或者upper
,补全后的词将分别是小写或者大写形式。如果被设置为preserve-lower
或者preserve-upper
(默认),补全后的词将会保持该词已输入部分的大小写形式,但是如果被补全的词还没有被输入,则它会被分别补全成小写或者大写形式。
DBNAME
当前已连接的数据库名称。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者重置。
ECHO
如果被设置为
all
,所有非空输入行会被按照读入它们的样子打印到标准输出(不适用于交互式读取的行)。要在程序开始时选择这种行为,可以使用开关-a
。如果被设置为queries
,Ksql会在发送每个查询给服务器时将它们打印到标准输出。选择这种行为的开关是-e
。如果被设置为errors
,那么只有失败的查询会被显示在标准错误输出上。这种行为的开关是-b
。如果被重置或者设置为none
(默认值)则不会显示任何查询。
ECHO_HIDDEN
当这个变量被设置为
on
且一个反斜线命令查询数据库时,相应的查询会被先显示。这种特性可以帮助我们学习KingbaseES的内部并且在自己的程序中提供类似的功能(要在程序开始时选择这种行为,可以使用开关-E
)。如果把这个变量设置为值noexec
,则对应的查询只会被显示而并不真正被发送给服务器执行。默认值是off
。
ENCODING
当前的客户端字符集编码。每一次你连接到一个数据库(包括程序启动)时以及当你用
\encoding
更改编码时,这个变量都会被设置,但它可以被更改或者重置。
ERROR
如果上一个SQL查询失败则为
true
,如果成功则是false
。另见SQLSTATE
。
FETCH_COUNT
如果这个变量被设置为一个大于零的整数值,
SELECT
查询的结果会以一组一组的方式取出并且显示(而不是像默认的那样把整个结果集拿到以后再显示),每一组就会包括这么多个行。因此,这种方式只会使用有限的内存量,而不管整个结果集的大小。在启用这个特性时,通常会使用 100 到 1000的设置。记住在使用这种特性时,一个查询可能会在已经显示了一些行之后失败。提示
尽管可以把这种特性用于任何的输出格式,但是默认的
aligned
格式看起来会比较糟糕,因为每一组的FETCH_COUNT
个行将被单独格式化,这就会导致不同的行组的列宽不同。其他的输出格式会更好。
HIDE_TABLEAM
如果将该变量设置为
true
,则不会显示表的访问方法详细信息。这主要用于回归测试。
HISTCONTROL
如果这个变量被设置为
ignorespace
,则以一个空格开始的行不会被放入到历史列表中。如果被设置为值ignoredups
,则匹配之前的历史行的行不会被放入。值ignoreboth
组合了上述两种值。如果被重置或者被设置为none
(默认值),所有在交互模式中被读入的行都会保存在历史列表中。
HISTFILE
该文件名将被用于存储历史列表。如果被重设,文件名将从
KSQL_HISTORY
环境变量中取得。如果该环境变量也没有被设置,则默认值是~/.ksql_history
,在Windows上是%APPDATA%\kingbase\ksql_history
。例如,\set HISTFILE ~/.ksql_history- :DBNAME放在
~/.ksqlrc
中将会导致Ksql为每一个数据库维护一个单独的历史。
HISTSIZE
存储在命令历史中的最大命令数(默认值是500)。如果被设置为一个负值,则不会应用限制。
HOST
当前连接到的数据库服务器端口。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者重置。
IGNOREEOF
如果被设置为1或者更小,向一个Ksql的交互式会话发送一个EOF字符(通常是Control+D)将会终止应用。如果设置为一个较大的数值,则必须键入多个连续的EOF字符才能让交互式会话终止。如果该变量被设置为一个非数值,则它会被解释为10。默认值为0。
LASTOID
最后被影响的 OID的值,这可能会由
INSERT
或者\lo_import
命令返回。这个变量只保证在下一个SQL命令被显示完之前有效。 由于KingbaseES V8.6 版本服务器不再支持OID系统列,所以LASTOID在针对这类服务器时在INSERT
之后将始终是0。
LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE
当前Ksql会话中最近一个失败查询的主错误消息和相关的SQLSTATE代码,如果在当前会话中没有发生错误,则是一个空字符串和
00000
。
ON_ERROR_ROLLBACK
当被设置为
on
时,如果事务块中的一个语句产生一个错误,该错误会被忽略并且该事务会继续。当被设置为interactive
时,只在交互式会话中忽略这类错误,而读取脚本文件时则不会忽略错误。当被重置或者设置为off
(默认值)时,事务块中产生错误的一个语句会中止整个事务。错误回滚模式的工作原理是在事务块的每个命令之前都为你发出一个隐式的SAVEPOINT
,然后在该命令失败时回滚到该保存点。
ON_ERROR_STOP
默认情况下,出现一个错误后命令处理会继续下去。当这个变量被设置为
on
后,出现错误后命令处理会立即停止。在交互模式下,ksql将会返回到命令提示符;否则,ksql将会退出并且返回错误代码 3 来把这种情况与致命错误区分开来,致命错误会被报告为错误代码 1。在两种情况下,任何当前正在运行的脚本(顶层脚本以及任何它已经调用的其他脚本)将被立即中止。如果顶层命名字符串包含多个 SQL 命令,将在当前命令处停止处理。
PORT
当前连接到的数据库服务器端口。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者重置。
PROMPT1
PROMPT2
PROMPT3
这些变量指定Ksql发出的提示符的模样。见下文的 提示符。
QUIET
把这个变量设置为
on
等效于命令行选项-q
。在交互模式下可能用处不大。
ROW_COUNT
上一个SQL查询返回的行数或者受影响的行数,如果该查询失败或者没有报告行计数则为0。
SERVER_VERSION_NAME
SERVER_VERSION_NUM
字符串形式的服务器版本号,例如
|V8R2|
、10.1
或者11beta1
,以及数字形式的服务器版本号,例如90602
或者100001
。每次你连接到一个数据库(包括程序启动)时,这些都会被设置,但可以被改变或者重设。
SHOW_CONTEXT
这个变量可以被设置为值
never
、errors
或者always
来控制是否在来自服务器的消息中显示``CONTEXT``域。默认是errors
(表示在错误消息中显示上下文,但在通知和警告消息中不显示)。当VERBOSITY
被设置为terse
或者sqlstate
时,这个设置无效(另见\errverbose
,它可以用来得到刚遇到的错误的详细信息)。
SINGLELINE
设置这个变量为
on
等效于命令行选项-S
。
SINGLESTEP
设置这个变量为
on
等效于命令选项-s
。
SQLSTATE
与上一个SQL查询的失败相关的错误代码(见 KingbaseES错误代码 ),如果上一个查询成功则为
00000
。
USER
当前连接的数据库用户。每次连接到一个数据库时都会设置该变量(包括程序启动时),但是可以被更改或者重置。
VERBOSITY
这个变量可以被设置为值
default
、verbose
、terse
或者sqlstate
来控制错误报告的详细程度(另见\errverbose
,在想得到之前的错误的详细版本时使用)。
VERSION
VERSION_NAME
VERSION_NUM
这些变量在程序启动时被设置以反映Ksql的版本,分别是一个详细的字符串、一个短字符串(例如
|V8R2|
、10.1
或者11beta1
)以及一个数字(例如90602
或者100001
)。它们可以被更改或重设。
WHENEVER_SQLERROR
此变量为兼容Oracle SQL*Plus语法的Whenever sqlerror语法增加的变量,可以被设置为
continue
(默认)或者exit
。默认情况下,出现一个错误后命令处理会继续下去。当这个变量被设置为exit
后,出现错误后命令处理会立即停止,Ksql将会退出并且返回错误代码 3 来把这种情况与致命错误区分开来,致命错误会被报告为错误代码 1。任何当前正在运行的脚本(顶层脚本以及任何它已经调用的其他脚本)将被立即中止。如果顶层命名字符串包含多个 SQL 命令,将在当前命令处停止处理。
4.1.9. 停止正在运行的任务
假设您执行了一个结果集较大的查询任务,查询结果已经显示了一部分,但并不需要查看其余部分内容,这时可以使用 Ctrl + C 命令,Ksql 将停止显示。
4.1.10. 运行操作系统命令
可以从 Ksql 命令提示符中执行操作系统命令,当您想要执行诸如列出现有操作系统文件等任务时,这一点非常的有用。
要运行操作系统命令,请输入 Ksql 命令 \! , 然后输入操作系统命令。例如:
-- 查看当前所在位置的系统文件 test=# \! ls code data2 logfile ...
4.1.11. 自动保存对数据库的更改
test=# \echo :AUTOCOMMIT
test=# \set AUTOCOMMIT on/off
4.1.12. 显示详细错误信息
如果 Ksql 在命令中检测到错误,则会显示错误信息。您通常将能够单独从消息中找到如何纠正这个问题的方式。例如:
test=# SELECT * FROM t2; ERROR: relation "t2" does not exist LINE 1: SELECT * FROM t2;
可以使用
\errverbose
命令显示最近的服务器错误信息。例如:
test=# \errverbose ERROR: 42P01: relation "t2" does not exist LINE 1: SELECT * FROM t2; LOCATION: parserOpenTable, parse_relation.c:1244
4.1.12.1. Oracle兼容
为兼容Oracle SQL*Plus工具的Whenever sqlerror语法功能,Ksql也支持此语法。语法定义为:
WHENEVER SQLERROR { EXIT | CONTINUE } EXIT选项:表示当遇到SQL错误、PLPGSQL块错误、PLSQL块错误或者错误的Ksql反斜线命令,将会退出Ksql。 CONTINUE选项(默认值):表示当遇到SQL错误、PLPGSQL块错误、PLSQL块错误或者错误的Ksql反斜线命令,不会退出Ksql。
4.2. Ksql执行脚本
\i
or
\include
filename
命令从文件
filename
读取输入并且把它当作从键盘输入的命令来执行。例如:
在操作系统当前目录中创建一个脚本文件 test.sql, 输入以下语句:
CREATE TABLE t1 a int, b int INSERT INTO t1 VALUES(1,1); INSERT INTO t1 VALUES(2,2); SELECT * FROM t1;
test=# \i test.sql CREATE TABLE INSERT 0 1 INSERT 0 1 a | b ---+--- 1 | 1 2 | 2 (2 rows)
4.2.1. 启动 Ksql 时运行一个脚本
例如:按照 Ksql 命令,使用用户名,目标数据库以及将要执行的文件名字。例如:
[test@kes_35_14 ~]$ ksql -p54320 -d test -f test.sql INSERT 0 1 INSERT 0 1 a | b ---+--- 1 | 1 2 | 2 1 | 1 2 | 2 1 | 1 2 | 2 (6 rows)
4.3. SQL中插入变量
testdb=> \set foo 'my_table' testdb=> SELECT * FROM :foo;
将查询表
my_table
。注意这可能会不安全:该变量的值会被按字面拷贝,因此它可能包含不平衡的引号甚至反斜线命令。必须确保把它放在那里是有意义的。
testdb=> \set foo 'my_table' testdb=> SELECT * FROM :"foo";
在被引用的SQL文本和标识符中将不会执行变量插入。因此,一个诸如
':foo'
的结构不会从一个变量的值产生一个被引用的文本(即便能够也会不安全,因为无法正确地处理嵌入在值中的引号)。
使用这种机制的一个例子是把一个文件的内容拷贝到一个表列中。首先把该文件载入到一个变量,然后把该变量的值作为一个被引用的字符串插入:
testdb=> \set content `cat my_file.txt` testdb=> INSERT INTO my_table VALUES (:'content');
(注意如果
my_file.txt
包含 NULL字节,这样也不行。Ksql不支持在变量值中嵌入 NULL 字节)。
:{?name
}特殊语法根据该变量存在与否返回TRUE或者FALSE,并且因此总是会被替换,除非分号被反斜线转义。
4.4. 格式化Ksql输出
4.4.1. 设置输出格式
Ksql 支持aligned、csv、html、asciidoc 等不同的输出格式,可以使用
\pset format
命令设置结果的输出格式。例如:
peter@localhost testdb=> \a \t \x Output format is aligned. Tuples only is off. Expanded display is on. peter@localhost testdb=> SELECT * FROM my_table; -[ RECORD 1 ]- first | 1 second | one -[ RECORD 2 ]- first | 2 second | two -[ RECORD 3 ]- first | 3 second | three -[ RECORD 4 ]- first | 4 second | four
peter@localhost testdb=> \pset border 2 Border style is 2. peter@localhost testdb=> SELECT * FROM my_table; +-------+--------+ | first | second | +-------+--------+ | 1 | one | | 2 | two | | 3 | three | | 4 | four | +-------+--------+ (4 rows) peter@localhost testdb=> \pset border 0 Border style is 0. peter@localhost testdb=> SELECT * FROM my_table; first second ----- ------ 1 one 2 two 3 three 4 four (4 rows) peter@localhost testdb=> \pset border 1 Border style is 1. peter@localhost testdb=> \pset format csv Output format is csv. peter@localhost testdb=> \pset tuples_only Tuples only is on. peter@localhost testdb=> SELECT second, first FROM my_table; one,1 two,2 three,3 four,4 peter@localhost testdb=> \pset format unaligned Output format is unaligned. peter@localhost testdb=> \pset fieldsep '\t' Field separator is " ". peter@localhost testdb=> SELECT second, first FROM my_table; one 1 two 2 three 3 four 4
4.4.2. 定义打印的标题
设置用于任何后续被打印表的表标题,可以使用
title
命令。这可以用来给输出加上描述性的标签。如果没有给出标题,这个标题会被复原。例如:
test=# \pset title 'This is test function' Title is "This is test function". test=# select * from test(); This is test function a | b ---+--- 1 | 1 2 | 2 3 | 3 (3 rows)
4.4.3. 存储和打印查询结果
要将查询结果存储到文件,可以在 Ksql 中输入
`\o
or
\out [ filename
] 命令 (详见
\o
)。例如:
test=# \o a.txt test=# SELECT * FROM t1; test=# \o
4.4.4. \r显示风格
testdb=# create table tb(vc varchar(20)); CREATE TABLE testdb=# insert into tb values ('abc' || chr(13) || '12'); INSERT 0 1 testdb=# select * from tb; ----- (1 row) testdb=#
而Ksql连接到PG模式的KingbaseES服务端时,将显示为\r字符。依旧使用上面的用例输出结果如下为:
testdb=# select * from tb; --------- abc\r12 (1 row) testdb=#
4.5. 生成HTML
test=# \H Output format is html. <table border="1"> <th align="center">a</th> <th align="center">b</th> <tr valign="top"> <td align="right">1</td> <td align="right">1</td> <tr valign="top"> <td align="right">2</td> <td align="right">2</td> </table> <p>(6 rows)<br />
4.6. Ksql调优
4.6.1. 统计 SQL 执行时间
使用 Ksql 的
\timing
命令显示运行一个或多个命令块执行的时间。例如:
test=# \timing on Timing is on. test=# SELECT * FROM t1; a | b ---+--- 1 | 1 2 | 2 1 | 1 2 | 2 1 | 1 2 | 2 (6 rows) Time: 1.767 ms
4.6.2. 输出执行计划
test=# EXPLAIN SELECT * FROM t1 ORDER BY a; QUERY PLAN ------------------------------------------------------------ Sort (cost=158.51..164.16 rows=2260 width=8) Sort Key: a -> Seq Scan on t1 (cost=0.00..32.60 rows=2260 width=8) (3 rows) Time: 1.115 ms
执行计划显示基于成本的行数估计(基数)。一般来说,每个节点上的代价、基数和字节表示累积的结果。
4.7. Ksql安全
4.7.1. 创建和控制角色
您可以使用 SQL 命令来创建和控制对角色的访问,从而为数据库表提供安全性。通过创建一个角色,然后设定访问的权限,可以确保只有特定的用户可以访问特定数据库的权限。
角色将与SQL的 CREATE、GRANT和SET 命令一起使用:
-- CREATE user CERATE ROLE USER1 SUPERUSER PASSWORD '123456' login; -- GRANT PRIVILEGES GRANT ALL PRIVILEGES ON DATABASE test TO USER1; -- SET ROLE session_user | current_user --------------+-------------- peter | peter SET ROLE 'paul'; SELECT SESSION_USER, CURRENT_USER;