变量定义(define)

Isql的变量包含了内部变量的功能、自定义变量功能。

Isql内部变量可通过define命令修改值从而控制isql内部属性。

修改变量值命令格式为:define name value

查看内部所有变量或自定义变量命令为:define

查看指定变量值命令为:echo :name

内部变量

不可删除变量:

变量名(区分大小写) 描述
  • format
  • 输出格式,可选值有unaligned,aligned,html,latex,缺省值“aligned”,效果同\pset format unaligned/aligned/html/latex。
  • unaligned:(不对齐)把一条记录的所有字段都输出到一行,用当前有效的域分隔符分隔;
  • aligned:(对齐)格式化后的文本输出;
  • htmllatex: 模式把表输出为对应的标记语言。
  • border
  • 控制输出格式,在html模式里,这个参数会直接翻译成border=...属性。在其他的模式里,表现为0(无边界),1(内部分隔线),和
  • 2(表框架),值必须是一个数字,缺省值“1”,效果同\pset border <values>。
  • expanded
  • 正常和扩展格式之间切换。当打开扩展格式时,查询结果用两列显示,字段名称在左,数据在右缺省值“OFF”,
  • 效果同\pset expanded on/off或\x。
  • fieldsep
  • 声明在非对齐模式时的域分隔符,缺省值“|”,效果同\pset fieldsep <values>。
  • recordsep
  • 声明在非对齐模式时的记录分隔符,缺省值“\n”,效果同\pset recordsep <values>。
  • tuples_only
  • 完全显示和记录显示之间切换。完全显示将显示列头,标题和各种脚注等信息。记录显示只显示实际的表数据,缺省值“OFF”,
  • 效果同\pset tuples_only on/off或\t。
  • pager
  • isql输出的分页器。如果设置了环境变量 PAGER,输出被定向到指定程序,缺省值“ON”使用系统缺省(比如 more),
  • 效果同\pset pager always/on/off。
  • define
  • 变量引用标识符,默认标识符为"&"。on开启变量定义功能;off关闭变量定义功能。单个(非数字和字母)字符为设置变量引用标识符,
  • 效果同\pset define on/off/<values>。
  • concat
  • 连接标识符,默认标识符为"."。on为开启连接标识符功能;off为关闭连接标识符功能。单个(非数字和字母)字符为设置连接标识符,
  • 效果同\pset concat on/off/<values>。
  • escape
  • 转义标识符,默认标识符为""。on为开启转义标识符功能;off为关闭转义标识符功能。单个(非数字和字母)字符为设置转义标识符,
  • 效果同\pset escape on/off/<values>。
  • rm-nb-space
  • utf-8字符集存在的特殊的空格符号:no-break space(0xc2 0xa0),和普通空格(0x20)不同点在于其宽度不会被压缩,由于后台数据库
  • 不支持该种符号作为分隔符,此命令可将该特殊空格符号转换为普通空格符号;默认关闭,on为开启替换功能,off为关闭替换功能。

不可删除变量,可删除变量值:( 通过“define name”删除变量值)

变量名(区分大小写) 描述
  • AUTOCOMMIT
  • 可选值on/off,如果是on(缺省),那么每个SQL命令都在成功完成后自动提交。如果是off,SQL命令不会提交,直到你明确发出COMMIT
  • ON_ERROR_STOP
  • 可选值on/off,缺省为空。执行sql文件遇错误停止,效果同set ERROR_STOP on/off。
  • QUIET
  • 可选值on/off,缺省为空,效果同参数-q
  • SINGLELINE
  • 可选值on/off,缺省为空,效果同参数-S
  • SINGLESTEP
  • 可选值on/off,缺省为空,效果同参数-s
  • FETCH_COUNT
  • 值为正整数,默认不限制。获取游标数据的行数。
  • ECHO
  • 可选值queries/all,缺省为空,效果同参数-e。
  • ECHO_HIDDEN
  • 可选值noexec/on/off,缺省为空,效果同参数-E。
  • noexec 只打印反斜杠命令生成的查询语句不执行;
  • on:打印反斜杠命令并执行生成的语句;
  • off:关闭打印反斜杠命令查询语句功能;
  • ON_ERROR_ROLLBACK
  • 可选值interactive/on/off,缺省为空。
  • interactive:当前客户端为交互界面时可触发错误自动回滚;
  • on:执行sql语句遇到错误自动回滚;
  • off:关闭遇错误自动回滚功能;
  • HISTCONTROL
  • 可选值ignorespace/ignoredups/ignoreboth,缺省为空。
  • ignorespace:命令history不记录空格;
  • ignoredups:如果上一条命令和本条相同,则不记录;
  • ignoreboth:前面两种情况都不记录;
  • PROMPT1
  • 暂未使用
  • PROMPT2
  • 暂未使用
  • PROMPT3
  • 暂未使用
  • VERBOSITY
  • 可选值terse/default/verbose,缺省为default。控制执行命令结果的细节量。
  • terse:不获取排除记录DETAIL、HINT、QUERY和CONTEXT错误信息;
  • verbose:获取包括SQLSTATE错误码以及产生错误的源代码文件名、函数名和行号;
  • default:获取默认执行结果;

可删除内部变量:(通过“undefine name”删除)

变量名(区分大小写) 描述
VERSION Isql所匹配的数据库版本。
DBNAME 当前连接的数据库名称。
USER 当前连接数据库的用户名称。
HOST 当前连接的数据库地址。
PORT 当前连接的数据库端口。
ENCODING 当前的客户端字符集编码。

自定义变量和使用

用户可通过define命令自定义变量使用,变量名区分大小写。

定义变量命令格式:define name value

删除变量命令格式:undefine name

查看指定变量值命令为:echo :name

在isql中执行sql语句,如果语句中想引用定义的变量,通过在变量名称前面加冒号(:变量名)的方式引用,比如:

define name 'tony'

define age 23

select :name,:age from dual;

最终在数据库中执行的语句为:

select tony,23 from dual;

生成的这个语句会执行出错,因为没有tony这个列,如果你想把参数作为数据,需要这么用:

select :'name',:age from dual;

此时生成正确的SQL语句为:select 'tony',23 from dual;

注解

同样,如果在其他SQL语句中使用变量作为数据的部分,比如insert的值,且变量是字符串类型的,

在insert语句中使用变量的格式为:冒号+单引号+变量名称+单引号 (:'变量名称'),比如:

insert into test values(:'name',:aget);最终执行SQL语句为:insert into test values('tony',23);

变量替换(&符号)

isql中,可以在sql语句或者PL中用&指定一个待输入的参数,在执行时,isql会提示逐一输入参数的值,直到所有参数都完成了输入后,才会去执行sql语句。

此功能是为了兼容Oracle的sqlplus中的变量替换功能,需要注意的是,&符号会出现在任何位置,比如单引号或者双引号中,&符号后面的字符会作为变量名称,直到空格结束。

如果一条SQL语句非常的长,变量替换会非常的慢,因为它是逐字进行解析替换的。该功能默认为关闭,想开启变量替换可执行\pset define on

例如:

\pset define on

create table test1 (cna int,cnb char(40));

insert into test1 values(12,'&a');

输入 a 的值:hello

原值 1: insert into test1 values(12,'&a');

新值 1: insert into test1 values(12,'hello');

如果用户想在替换变量后追加字符,可以通过使用“.”符号后跟追加字符来实现。

当需要多次对同一个替换变量进行提示输入替换值时,我们可以通过在SQL的替换变量前添加第二个“&”符号来避免重复输入。在同一个会话中,当再次执行上述SQL,对于含有两个“&”符号的替换变量不会再次被提示输入相应值,而只含有一个“&”符号的替换变量需要再次输入。

例如:

insert into &&name values(13,'&a.lo');

输入 name 的值:test1

输入 a 的值:hel

原值 2: insert into &&name values(13,'&a.lo');

新值 2: insert into test1 values(13,'hello');

当再次使用name变量时,不会再提示用户输入。

ISQL中“undefine”命令可以用来取消对于name变量的定义,即执行“undefine”命令后当再次使用name变量时,会提示用户输入相应的值。

注解

isql对于&的识别是一种硬识别,不会对&的上下文进行语法匹配,因此如果sql中的数据中也包含&符合,用isql执行时会误判为需要进行参数替换。此时如果不想作为参数替换解析,可执行\pset define off 。

替换的另外一种方式是用start命令,START命令可以直接在脚本中传递替代变量的参数,不用再提示用户输入替代值。在脚本中,通过设置“&”符号后跟一个数字的形式来代替替换变量。每次运行该脚本时,首先通过START命令启动文件名,然后START命令会用第一个值替代“&1”,用第二个值替代“&2”,依次替代。 脚本文件中只有以数字命名的替代变量才可以被START命令的变量替代,其他的需要提示用户进行输入。

例如:

start d:\s.txt test1 'ni,hao. s'

原值 1: insert into &1 values(12,&2);

新值 1: insert into test1 values(12,'ni,hao. s');