test=# \d parts
Table "public.parts"
Column | Type | Collation | Nullable | Default
-------+----------------------------+-----------+----------+--------
pnum | integer | | |
pname | character varying(15 char) | | |
test=# \df TESTFUNC
List of functions
Schema | Name | Result data type | Argument data types | Type
-------+----------+------------------+---------------------+------
public | testfunc | integer | | func
(1 row)
的表。就像在SQL名称中那样,把模式放在双引号中可以阻止它被转换成小写形式。如果需要在一个模式中包括一个真正的双引号字符,则需要把它写成两个相邻的双引号,这同样是符合SQL引用标识符的规则。例如,
"FOO""BAR"
将显示名为
FOO"BAR
foo"bar
)的表。和普通的SQL名称规则不同,你不能只在模式的一部分周围放上双引号,例如
FOO"FOO"BAR
将会显示名为
fooFOObar
pattern
参数被完全省略,
命令会显示在当前schema 搜索路径中可见的全部对象 —这等价于用
作为模式(如果一个对象所在的 schema位于搜索路径中并且没有同类且同名的对象出现在搜索路径中该schema 之前的 schema 中,则说该对象是
的。这表示可以直接用名称引用该对象,而不需要用schema来进行限定)。要查看数据库中所有的对象而不管它们的可见性,可以把
用作模式。
如果放在一个模式中,
将匹配任意字符序列(包括空序列),而
会匹配任意的单个字符(这种记号方法就像Unix shell的文件名模式一样)。例如,
会显示名称以
开始的表。但是如果被放在双引号内,
就会失去这些特殊含义而变成普通的字符。
包含一个点号(
)的模式被解释为一个 schema名称模式后面跟上一个对象名称模式。例如,
foo*.*bar*
会显示名称以
开始的schema中所有名称包括
的表。如果没有出现点号,那么模式将只匹配当前schema搜索路径中可见的对象。同样,双引号内的点号会失去其特殊含义并且变成普通的字符。
高级用户可以使用字符类等正则表达式记法,如
[0-9]
可以匹配任意数字。所有的正则表达式特殊字符都按照
POSIX正则表达式
所说的工作,以下字符除外:
会按照上面所说的作为一种分隔符,
会被翻译成正则表达式记号
会被翻译成
则按字面意思匹配。根据需要,可以通过书写
?来分别模拟模式字符
不需要作为一个正则表达式字符,因为模式必须匹配整个名称,而不是像正则表达式的常规用法那样解释(换句话说,
会被自动地追加到模式上)。如果不希望该模式的匹配位置被固定,可以在开头或者结尾写上
。注意在双引号内,所有的正则表达式特殊字符会失去其特殊含义并且按照其字面意思进行匹配。还有,在操作符名称模式中(即作为
的参数),正则表达式特殊字符也按照字面意思进行匹配。
4.1.4.2.
在Ksql中您可以使用
\dn[S+]
pattern
]命令列出模式(详见 \dn 命令描述)。例如:
test=# \dn public
List of schemas
Name | Owner
------+----------
public| user1
(1 row)
testdb=> CREATE TABLE my_table (
testdb(> first integer not null default 0,
testdb(> second text)
testdb-> ;
CREATE TABLE
您可以使用 PL/SQL 子程序来操作数据库的数据。有关 PL/SQL 语句的信息,请参考 KingbaseES 数据库 PL/SQL 语言参考资料。Ksql 以与 SQL 命令相同的方式处理 PL/SQL 子程序,只是分号(;) 不会终止并执行 PL/SQL。
在以下情况下,可以进入输入 PL/SQL 语句模式:
-- create test() function
\set SQLTERM /
CREATE OR REPLACE FUNCTION test( ) RETURNS SETOF type_tb1 AS
BEGIN
RETURN QUERY
SELECT *
FROM tb1;
RETURN;
\set SQLTERM ;
-- call test()
SELECT test();
-------
(1,1)
(2,2)
(2 rows)
要在一个参数中包括空白,可以将它加上单引号。要在一个参数中包括一个单引号,则需要在文本中写上两个单引号。任何包含在单引号中的内容都服从与 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
weird""
name"
weird"
对参数的解析会在行尾或者碰到另一个未加引号的反斜线时停止。一个未加引号的反斜线被当做新元命令的开始。特殊的序列
(两个反斜线)表示参数结束并且应继续解析SQL命令(如果还有)。使用这种方法,SQL命令和Ksql命令可以被自由地混合在一行中。但是无论在何种情况中,元命令的参数都无法跨越一行。
很多元命令作用在当前查询缓冲区上。这就是一个缓冲区而已,它保存任何已经被键入但是还没有发送到服务器执行的SQL命令文本。这将包括之前输入的行以及在该元命令同一行上出现在前面的任何文本。
4.1.7.1.3.
命令行编辑
为了方便的进行编辑和检索,Ksql支持Readline库。Ksql退出时命令历史会被自动保存,而当Ksql启动时命令历史会被重新载入。Ksql也支持tab 补全,不过补全逻辑绝不是一个SQL解析器。tab补全产生的查询也可能会受其他 SQL命令干扰,例如
TRANSACTION
ISOLATION
LEVEL
。如果出于某种原因不想用 tab 键补全,可以把下面的代码放在主目录下的名为
.inputrc
文件中关闭该特性:
$if ksql
set disable-completion on
$endif
这三个变量包含了描述提示符外观的字符串和特殊转义序列。Prompt1 是当Ksql等待新命令时发出的常规提示符。Prompt 2是在命令输入时需要更多输入时发出的提示符,例如当命令没有被分号终止或者引用没有被关闭时就会发出这个提示符。在运行一个SQL``COPY FROM STDIN``命令并且需要在终端上输入一个行值时,会发出Prompt 3。
被选中的提示符变量会被原样打印,除非碰到一个百分号(
)。百分号的下一个字符会被特定的其他文本替换。预定义好的替换有:
Ksql提供了和普通 Unix 命令 shell 相似的变量替换特性。变量简单来说就是一对名称/值,其中值可以是任意长度的任意字符串。名称必须由字母(包括非拉丁字母)、数字和下划线构成。
要设置一个变量,可以使用Ksql的元命令
testdb=> \set foo bar
有一些变量会被Ksql特殊对待。它们表示特定的选项设置,运行时这类选项设置可以通过修改该变量的值来改变,或者在某些情况下它们表示Ksql的可更改的状态。按照惯例,所有被特殊对待的变量的名称由全部大写形式的 ASCII 字母(还有可能是数字和下划线)组成。为了确保未来最大的兼容性,最好避免使用这类变量名。
控制Ksql行为的变量通常不能被重置或者设置为无效值。允许
\unset
命令,但它会被解释为将变量设置为它的默认值。没有第二参数的
命令会被解释为将变量设置为
(对于接受该值的控制变量),对不接受该值的变量则会拒绝这个命令。此外,接受值
的控制变量也能接受其他常见的布尔值拼写方式,例如
false
被特殊对待的变量是:
可以使用 SQL 数据库操作语言(DML)命令更新、插入和删除来指定您希望对存储在数据库中的数据信息所做的更改,这些更改可以单独的使用,也可以在PL/SQL块中使用。在输入 SQL 提交命令或 SQL 数据库控制语言(DCL)或数据库定义语言(DDL)命令(如创建表)或使用自动提交功能之前,这些更改不会永久的保存。Ksql 自动提交特性会导致 SQL DML 事务成功之后的更改被永久的保存到数据库。
您可以使用 Ksql 自动提交系统变量
AUTOCOMMIT
来控制自动提交功能。默认情况下,kingbase 数据库的自动提交是开启的,也就是说任何一个 SQL 语句执行完成后,所做的数据修改都会被立刻提交,这种情况下每个语句都是一个独立事务。
自动提交功能提交开启时,无法回滚对数据的修改。
WHENEVER SQLERROR { EXIT | CONTINUE }
EXIT选项:表示当遇到SQL错误、PLPGSQL块错误、PLSQL块错误或者错误的Ksql反斜线命令,将会退出Ksql。
CONTINUE选项(默认值):表示当遇到SQL错误、PLPGSQL块错误、PLSQL块错误或者错误的Ksql反斜线命令,不会退出Ksql。
Ksql变量的一个关键特性是可以把它们替换(“插入”)到常规SQL语句中,也可以把它们作为元命令的参数。此外,Ksql还提供了功能来确保被用作 SQL 文字和标识符的变量值会被正确地引用。插入一个值而不需要加引用的语法是在变量名前面加上一个冒号(
)。例如:
testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;
testdb=> \set content `cat my_file.txt`
-- windows environment
testdb=> \set content `type my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');
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
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)
时,如果已经连接到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;
-----
(1 row)
testdb=#
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