变量

vsql 提供与常用 Linux 命令 shell 相似的变量替换功能。变量是名称/值对,其中值可以是任意长度的字符串。若要设置变量,请使用 vsql 元命令 \set:例如,以下语句将变量 fact 设置为值 dim

=> \set fact dim

如果您对变量调用 \set 并且不提供任何值,则该变量设置为空字符串。

获取变量

若要检索给定变量的内容,请在名称前面附加冒号,并将此用作斜杠命令的实参:例如:

=> \echo :fact
dim

未限定的 \set 命令会返回所有当前变量及其值:

dbadmin=> \set
VERSION = 'vsql'
AUTOCOMMIT = 'off'
VERBOSITY = 'default'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
ROWS_AT_A_TIME = '1000'
DBNAME = 'dbadmin'
USER = 'dbadmin'
PORT = '5433'
LOCALE = 'en_US@collation=binary'
HISTSIZE = '500'

删除变量

若要取消设置(删除)变量,请使用 vsql 元命令 \unset

变量命名约定

vsql 内部变量名称可以包含任意数量的字母、数字和下划线(而且它们可以按任何顺序出现)。vsql 会对某些内部变量进行特殊处理。这些变量指示可以在运行时通过更改变量的值来更改某些选项设置,或者表示应用程序的某种状态。虽然可以将这些变量用于任何其他用途,但建议您不要这样做。按照约定,所有特殊处理的变量均包含全大写字母(并且可能包含数字和下划线)。若要确保在将来具有最高兼容性,请避免将这些变量名称用于您自己的用途。

SQL 插值

您可以将 vsql 变量替换(“插值”)到常规 SQL 语句中。为此,可以在变量名称前加上冒号 (:)。例如,以下语句查询表 my_table

=> \set fact 'my_table'
=> SELECT * FROM :fact;

将逐字复制变量的值,因此,变量甚至可以包含不对称的引号或包含反斜杠命令。请确保将变量放置到能够起作用的位置。不会执行到带有引号的 SQL 实体的变量插值。存在一个例外:带有反引号 (````) 的字符串的内容会传递到系统 shell,并替换为 shell 的输出。请参阅下面的“使用反引号读取系统变量”。

使用反引号读取系统变量

在 vsql 中,反引号的内容会传递到系统 shell 进行解释(此行为与许多 UNIX shell 相同)。在设置 vsql 内部变量时,此行为特别有用,因为您可能需要访问 UNIX 系统变量(例如 HOME 或 TMPDIR)而非硬编码值。

例如,要将内部变量设置为 UNIX 用户目录中某个文件的完整路径,您可以使用反引号获取 HOME 系统变量(此变量是指向用户目录的完整路径)的内容:

=> \set inputfile `echo $HOME`/myinput.txt=> \echo :inputfile
/home/dbadmin/myinput.txt

反引号之内的内容会替换为在系统 shell 解释器中运行这些内容后的结果。在此示例中,echo $HOME 命令将返回 HOME 系统变量的内容。