变量定义(define)¶
Isql的变量包含了内部变量的功能、自定义变量功能。
Isql内部变量可通过define命令修改值从而控制isql内部属性。
修改变量值命令格式为:define name value
查看内部所有变量或自定义变量命令为:define
查看指定变量值命令为:echo :name
内部变量¶
不可删除变量:
| 变量名(区分大小写) | 描述 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
不可删除变量,可删除变量值:( 通过“define name”删除变量值)
| 变量名(区分大小写) | 描述 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可删除内部变量:(通过“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');