0
点赞
收藏
分享

微信扫一扫

金仓数据库KingbaseES ksql工具用户指南及参考--4. 使用 Ksql

目录

4.1. Ksql基础

4.1.1. 输入和执行命令

4.1.2. 列出表的定义

4.1.3. 列出 PL/SQL 定义

4.1.4. 列出模式

4.1.5. 运行 SQL 命令

4.1.6. 运行 PL/SQL

4.1.7. 运行 Ksql 命令

4.1.8. 变量

4.1.9. 停止正在运行的任务

4.1.10. 运行操作系统命令

4.1.11. 自动保存对数据库的更改

4.1.12. 显示详细错误信息

4.2. Ksql执行脚本

4.2.1. 启动 Ksql 时运行一个脚本

4.3. SQL中插入变量

4.4. 格式化Ksql输出

4.4.1. 设置输出格式

4.4.2. 定义打印的标题

4.4.3. 存储和打印查询结果

4.4.4. \r显示风格

4.5. 生成HTML

4.6. Ksql调优

4.6.1. 统计 SQL 执行时间

4.6.2. 输出执行计划

4.7. Ksql安全

4.7.1. 创建和控制角色


4.1. Ksql基础

4.1.1. 输入和执行命令

通常,您可以使用空格或Tab分隔命令中的单词,可以在单词之间使用额外的空格或Tab提高命令的可读性。

您可以输入三种命令:

  • SQL命令,用于处理数据库中的信息;

  • PL/SQL blocks,也是用于处理数据库中的信息;

  • Ksql命令,用于格式化查询结果、设置选项以及编辑SQL命令和PL/SQL blocks;

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 命令描述)。例如:

创建名为 TESTFUNC 的函数

CREATE or REPLACE FUNCTION TESTFUNC() RETURNS integer AS $test$
   BEGIN
      RETURN 1;
   END;
$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. 概述

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
------+-------
   11 |
   22 |
   33 |
   44 |
   55 |
(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

注意

命令提示符的改变。

在本指南中,会发现大多数 SQL 命令都分为子句,每行一个句子。例如,上面的查询例子中,SELECT 和 FROM 子句被放置在不同的行上。许多人发现这种清晰可见的结构很有帮助,但您可以选择任何划分使命令更加的易读。

4.1.5.3. 结束 SQL 命令

可以通如下方式结束 SQL 命令:

  • 使用分号(;)

  • 使用 \g 结束

  • 使用 set SQLTERM 命令定义 SQL 命令结束符

一个分号(;) 告诉 Ksql 您要运行该命令。在命令的最后一行的末尾输入分号,然后按 ENTER 键,Ksql 处理该命令,将其发送到服务器并返回结果。如果在输入分号之前错误的按了 ENTER 键,Ksql 将提示输入命令的下一行的行号。键入分号再次运行命令。例如:

-- 分号结束符
SELECT * FROM parts
;

 pnum | pname
------+-------
   11 |
   22 |
   33 |
   44 |
   55 |
(5 rows)

-- \set SQLTERM 定义 / 结束符
\set SQLTERM /
 select * from parts
 /
 pnum | pname
------+-------
   11 |
   22 |
   33 |
   44 |
   55 |
(5 rows)
\set SQLTERM ;

4.1.6. 运行 PL/SQL

您可以使用 PL/SQL 子程序来操作数据库的数据。有关 PL/SQL 语句的信息,请参考 KingbaseES 数据库 PL/SQL 语言参考资料。Ksql 以与 SQL 命令相同的方式处理 PL/SQL 子程序,只是分号(;) 不会终止并执行 PL/SQL。

在以下情况下,可以进入输入 PL/SQL 语句模式:

  • 可以键入一个用来创建存储过程的 SQL 命令(例如,创建函数)。以这种方式进入 PL/SQL 模式后,键入要创建的存储过程。

  • 可以通过set SQLTERM 指定一个结束符,在创建的存储过程结束后新的一行中键入指定的结束符来结束存储过程的创建。

例如:创建并执行 test 函数

-- 创建名为 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;
END
$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;
END;
/
\set SQLTERM ;

-- 执行 test 函数
SELECT * FROM test();

4.1.6.1. 创建存储过程

存储过程是 PL/SQL 函数、软件包或过程。若要创建存储过程,请使用以下的 SQL 创建命令:

  • CREATE FUNCTION

  • CREATE LIBRARY

  • CREATE PACKAGE

  • CREATE PACKAGE BODY

  • CREATE PROCEDURE

  • CREATE TRIGGER

  • CREATE TYPE

  • CREATE TYPE BODY

输入这些命令中的任何一个都可以使其处于 PL/SQL 模式,可以在其中输入 PL/SQL 子程序。有关更多的信息参考 KingbaseES 数据库相应的章节。

要运行 SQL 命令创建的存储过程,可以使用下面的方式:

  • CALL FUNCTION NAME;

  • SELECT FUNCTION NAME;

例如:创建名为 test 的函数并执行

-- 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;
END;
/
\set SQLTERM ;

-- call test()
SELECT test();
test
-------
(1,1)
(2,2)
(2 rows)

注意

不是每种存储过程都能通过 SQL 命令执行,比如 CREATE TRIGGER 创建的触发器是通过创建时指定的触发条件自动被触发执行的,并不能通过 SQL 命令执行。

4.1.7. 运行 Ksql 命令

您可以使用 Ksql 命令操作 SQL 命令和 PL/SQL 块,并格式化和打印查询结果。Ksql 对 Ksql 命令的处理方式不同于 SQL 命令或 PL/SQL。例如

输入 ksql 命令:

-- 将结果格式为 html
\pset format html

如果输入错误的内容,可以使用 Backspace 删除它们并重新输入。

输入以下查询,然后按 ENTER 键来运行它:

-- 查询
SELECT * FROM tb1;

select * from tb1;
<table border="1">
<tr>
   <th align="center">a</th>
   <th align="center">b</th>
</tr>
<tr valign="top">
   <td align="right">1</td>
   <td align="right">1</td>
</tr>
<tr valign="top">
   <td align="right">2</td>
   <td align="right">2</td>
</tr>
</table>
<p>(2 rows)<br />
</p>

4.1.7.1. 理解 Ksql 命令语法

4.1.7.1.1. 元命令概述

你输入到Ksql中的任何以未加引用的反斜线开始的东西都是一个Ksql元命令,它们由Ksql自行处理。这些命令让Ksql对管理和编写脚本更有用。元命令常常被称作斜线或者反斜线命令。

4.1.7.1.2. 命令格式

Ksql命令的格式是用反斜线后面直接跟上一个命令动词,然后是一些参数。参数与命令动词和其他参数之间用任意多个空白字符分隔开。

要在一个参数中包括空白,可以将它加上单引号。要在一个参数中包括一个单引号,则需要在文本中写上两个单引号。任何包含在单引号中的内容都服从与 C语言中\n(新行)、\t(制表符)、\b(退格)、\r(回车)、\f(换页)、\digits(10 进制)以及\xdigits(16 进制)类似的替换规则。单引号内文本中的其他任何字符(不管它是什么)前面的反斜线都没有实际意义(会被忽略)。

如果在一个参数中出现一个未加引号的冒号(:)后面跟着一个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. 命令行编辑

为了方便的进行编辑和检索,Ksql支持Readline库。Ksql退出时命令历史会被自动保存,而当Ksql启动时命令历史会被重新载入。Ksql也支持tab 补全,不过补全逻辑绝不是一个SQL解析器。tab补全产生的查询也可能会受其他 SQL命令干扰,例如SET TRANSACTION ISOLATION LEVEL。如果出于某种原因不想用 tab 键补全,可以把下面的代码放在主目录下的名为.inputrc文件中关闭该特性:

$if ksql
set disable-completion on
$endif

(这不是Ksql特性而是Readline的特性。进一步的细节请阅读它的文档。)

4.1.7.1.4. 命令提示符

Ksql发出的提示符可以根据用户的喜好自定义。PROMPT1PROMPT2PROMPT3这三个变量包含了描述提示符外观的字符串和特殊转义序列。Prompt1 是当Ksql等待新命令时发出的常规提示符。Prompt 2是在命令输入时需要更多输入时发出的提示符,例如当命令没有被分号终止或者引用没有被关闭时就会发出这个提示符。在运行一个SQL``COPY FROM STDIN``命令并且需要在终端上输入一个行值时,会发出Prompt 3。

被选中的提示符变量会被原样打印,除非碰到一个百分号(%)。百分号的下一个字符会被特定的其他文本替换。预定义好的替换有:

%m

%>

%n

%/

%~

%#

%p

%R

%x

%l

%digits

%:name:

:literal:`%\command`

%[ ... %]

要在你的提示符中插入一个百分号,可以写成%%。提示符 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
bar

这在常规 SQL 命令和元命令中均有效,下文的 SQL中插入变量 中有更多细节。

如果调用\set时没有第二个参数,该变量会被设置为一个空字符串值。要重置(即删除)一个变量,可以使用命令\unset。要显示所有变量的值,在调用\set时不带任何参数即可。

注意

\set的参数服从与其他命令相同的替换规则。因此可以构造有趣的引用,例如\set :foo 'something'以及分别得到Perl或者PHP的“软链接”或者“可变变量”。这些构造出来的东西并没有什么用处。在另一方面,\set bar :foo是一种很好的拷贝变量的方法。

有一些变量会被Ksql特殊对待。它们表示特定的选项设置,运行时这类选项设置可以通过修改该变量的值来改变,或者在某些情况下它们表示Ksql的可更改的状态。按照惯例,所有被特殊对待的变量的名称由全部大写形式的 ASCII 字母(还有可能是数字和下划线)组成。为了确保未来最大的兼容性,最好避免使用这类变量名。

控制Ksql行为的变量通常不能被重置或者设置为无效值。允许\unset命令,但它会被解释为将变量设置为它的默认值。没有第二参数的\set命令会被解释为将变量设置为on(对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值onoff的控制变量也能接受其他常见的布尔值拼写方式,例如truefalse

被特殊对待的变量是:

COMP_KEYWORD_CASE

DBNAME

ECHO

ECHO_HIDDEN

ENCODING

ERROR

FETCH_COUNT

HIDE_TABLEAM

HISTCONTROL

HISTFILE

HISTSIZE

HOST

IGNOREEOF

LASTOID

LAST_ERROR_MESSAGE LAST_ERROR_SQLSTATE

ON_ERROR_ROLLBACK

ON_ERROR_STOP

PORT

PROMPT1 PROMPT2 PROMPT3

QUIET

ROW_COUNT

SERVER_VERSION_NAME SERVER_VERSION_NUM

SHOW_CONTEXT

SINGLELINE

SINGLESTEP

SQLSTATE

USER

VERBOSITY

VERSION VERSION_NAME VERSION_NUM

WHENEVER_SQLERROR

4.1.9. 停止正在运行的任务

假设您执行了一个结果集较大的查询任务,查询结果已经显示了一部分,但并不需要查看其余部分内容,这时可以使用 Ctrl + C 命令,Ksql 将停止显示。

4.1.10. 运行操作系统命令

可以从 Ksql 命令提示符中执行操作系统命令,当您想要执行诸如列出现有操作系统文件等任务时,这一点非常的有用。

要运行操作系统命令,请输入 Ksql 命令 \! , 然后输入操作系统命令。例如:

-- 查看当前所在位置的系统文件
test=# \! ls
code  data2  logfile  ...

4.1.11. 自动保存对数据库的更改

可以使用 SQL 数据库操作语言(DML)命令更新、插入和删除来指定您希望对存储在数据库中的数据信息所做的更改,这些更改可以单独的使用,也可以在PL/SQL块中使用。在输入 SQL 提交命令或 SQL 数据库控制语言(DCL)或数据库定义语言(DDL)命令(如创建表)或使用自动提交功能之前,这些更改不会永久的保存。Ksql 自动提交特性会导致 SQL DML 事务成功之后的更改被永久的保存到数据库。

您可以使用 Ksql 自动提交系统变量 AUTOCOMMIT 来控制自动提交功能。默认情况下,kingbase 数据库的自动提交是开启的,也就是说任何一个 SQL 语句执行完成后,所做的数据修改都会被立刻提交,这种情况下每个语句都是一个独立事务。

注意

自动提交功能提交开启时,无法回滚对数据的修改。

查看自动提交功能是否开启

test=# \echo :AUTOCOMMIT
on

设置自动提交功能开启或关闭

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;

ksql 中输入以下命令执行 test.sql 文件:

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 时运行脚本,使用以下选项:

  • -f filename 从文件filename而不是标准输入中读取命令。(详见 option选 中 -f)

例如:按照 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中插入变量

Ksql变量的一个关键特性是可以把它们替换(“插入”)到常规SQL语句中,也可以把它们作为元命令的参数。此外,Ksql还提供了功能来确保被用作 SQL 文字和标识符的变量值会被正确地引用。插入一个值而不需要加引用的语法是在变量名前面加上一个冒号(:)。例如:

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;

将查询表my_table。注意这可能会不安全:该变量的值会被按字面拷贝,因此它可能包含不平衡的引号甚至反斜线命令。必须确保把它放在那里是有意义的。

当一个值被用作 SQL文本或者标识符时,最安全的是把它加上引用。要引用一个变量的值作为SQL文本,可以把变量名称放在单引号中并且在引号前面写一个冒号。要引用作为SQL标识符,则可以把变量名称放在双引号中并且在引号前面写一个冒号。这种结构可以正确地处理变量值中嵌入的引号和其他特殊字符。之前的例子用这种方法写会更安全:

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 字节)。

因为冒号可以合法地出现在 SQL命令中,一次明显的插入尝试(即:name:'name'或者:"name")不会被替换,除非所提及的变量就是当前被设置的。在任何情况下,可以用一个反斜线对冒号进行转义以避免它被替换。

:{?name}特殊语法根据该变量存在与否返回TRUE或者FALSE,并且因此总是会被替换,除非分号被反斜线转义。

变量的冒号语法对嵌入式查询语言(例如ESQL)来说是标准的SQL。用于数组切片和类型造型的冒号语法是KingbaseES扩展,它有时可能会与标准用法冲突。把一个变量值转义成SQL 文本或者标识符的冒号引用语法是一种Ksql扩展。

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

您可以用 \pset 命令以不同的方式显示表,例如:

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

提示

更多有关输出格式的设置参考 \pset 命令 。

4.4.4. \r显示风格

当Ksql设置输出格式为aligned 和wrapped 时,如果已经连接到ORACLE模式的KingbaseES服务端,那么对于\r(0x13字节)的显示将会兼容Oracle的显示风格,即遇到\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;
   vc
-----
   12c
(1 row)

testdb=#

而Ksql连接到PG模式的KingbaseES服务端时,将显示为\r字符。依旧使用上面的用例输出结果如下为:

testdb=# select * from tb;
   vc
---------
   abc\r12
(1 row)

testdb=#

注意

在兼容ORACLE显示格式时的使用限制或已知问题:

  1. 可能在某些字符集情况下会出现显示乱码的情况。

  2. 某些包含\r的列显示宽度可能会和其他列不一致。

4.5. 生成HTML

要想将查询结果生成HTML格式,可以使用以下的方式:

  • 使用 \pset format html

  • 使用 \H or \html 命令开启HTML查询输出格式,如果HTML格式已经开启,这会把它切换回默认的对齐文本格式。

test=# \H
Output format is html.
<table border="1">
<tr>
   <th align="center">a</th>
   <th align="center">b</th>
</tr>
<tr valign="top">
   <td align="right">1</td>
   <td align="right">1</td>
</tr>
<tr valign="top">
   <td align="right">2</td>
   <td align="right">2</td>
</tr>
</table>
<p>(6 rows)<br />
</p>

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. 输出执行计划

使用 EXPLAIN 命令生成执行计划的输出。例如:

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 命令。您可以使用或不使用密码创建角色

  • 若要授予对角色的访问权限,请使用 GRANT 命令。通过这种方式,您可以控制与该角色相关联的权限

  • 若要访问角色,请使用 SET ROLE 命令。如果您使用密码创建了该角色,则用户必须知道密码才能访问该角色

例如:创建名字为 USER1 的用户并设置对应的访问权限

-- 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;

session_user | current_user
--------------+--------------
peter        | paul

提示

详细的命令请参考 KingbaseES SQL语言参考手册。

举报

相关推荐

0 条评论