第十四章 使用SQL Shell界面(二)
存储和调用SQL语句
通过数据回调
SQL Shell自动将在终端会话期间发出的每个成功的SQL语句存储在本地缓存中,并为其分配一个顺序号。这些数字用于在当前Terminal过程中重新调用以前的SQL语句。 SQL Shell仅将数字分配给成功的SQL语句。如果在准备SQL语句期间发生错误,则不会分配任何编号。这些数字分配不是特定于名称空间的。以下是可用的数字调用命令:
-
#
:可以使用#列出所有先前缓存的SQL语句及其分配的编号。 -
#n
:可以通过在SQL Shell提示符下指定#n来调用并执行先前的SQL语句,其中n
是SQL Shell分配给该语句的整数。 -
#0
:可以通过在SQL Shell提示符下指定#0
来调用并执行最近准备的SQL语句。#0
调用最近准备的SQL语句,而不必调用最近执行的SQL语句。因此,调用和执行SQL语句对#0调用哪个SQL语句没有影响。
通过数字调用SQL语句不会为该语句分配新的数字。 SQL Shell在终端会话的持续时间内顺序分配数字;退出并重新进入SQL Shell或更改名称空间不会影响数字分配或先前分配的数字的有效性。
要删除所有号码分配,请使用#CLEAR
并在显示的提示符下确认此操作。这将删除所有先前的号码分配,并从1重新开始号码分配。
通过名字回调
可以选择为SQL语句分配名称,然后按名称重新调用该语句。这些名称用于重新调用从任何当前用户的Terminal进程发出的SQL语句。通过名称保存和调用SQL语句有两种方法:
- 使用
SAVEGLOBAL
保存到全局;使用OPEN
从全局调用。 - 使用
SAVE
保存到文件;使用LOAD
从文件中调用。
保存到全局变量
要将全局名称分配给最新的SQL语句,请使用sql shell命令saveglobal
名称,该名称可以缩写为SG
名称。然后,可以使用SQL Shell命令打开名称来调用全局的SQL语句。如果Executemode
是立即的,则SQL shell都会调用并执行该语句。如果延迟了executemode
,则将准备该语句,但在指定GO
命令之前,不会执行该语句。
每次使用打开名称以全局名称调用SQL语句时,SQL shell会为语句分配新号码。旧的和新数字都对调用数字仍然有效。
名称可以包含除空白字符之外的任何可打印字符。名称中的字母区分大小写。名称可以是任何长度。名称特定于当前命名空间。可以多次使用不同名称保存相同的SQL语句;所有已保存的名称都保持有效。如果使用已分配的名称保存SQL语句,则SQL Shell会提示是否希望覆盖现有名称,将其重新分配给新的SQL语句。
为当前命名空间分配全局名称。可以使用SQL Shell L
(或列表)命令列出当前命名空间的所有分配的全局名称。分配后,所有当前用户的终端进程都可以使用名称。在创建它结束的终端进程后,分配的名称仍然存在。如果没有名称分配,则列表返回“保存”消息的“无语句”。
要删除全局名称分配,请使用清除名称。要删除当前命名空间的所有全局名称分配,请在显示的PROMP下使用清除并确认此操作
保存到文件
要将文件名分配给最新的SQL语句,请使用SQL Shell命令保存名称。然后,可以使用SQL Shell命令加载名称来调用SQL语句。如果Executemode
是立即的,则SQL shell都会调用并执行该语句。每次使用Load Name
按文件名调用SQL语句时,SQL Shell会将新号码分配给语句。旧的和新数字都对召回数字仍然有效。
名称可以包含除空白字符之外的任何可打印字符。名称中的字母区分大小写。名称可以是任何长度。名称特定于当前命名空间。可以多次使用不同名称保存相同的SQL语句;所有已保存的名称都保持有效。如果尝试使用已分配的名称保存SQL语句,则SQL Shell会提示是否希望覆盖现有名称,将其重新分配给新的SQL语句。
为当前命名空间分配名称。分配后,所有当前用户的终端进程都可以使用名称。在创建它结束的终端进程后,分配的名称仍然存在。
清除缓存查询Query
SQL shell提供了清除(缩写p
)命令,以清除当前命名空间中的所有缓存查询。此命令清除名称空间中的所有缓存查询,而不仅仅是使用SQL Shell生成的查询。
$SYSTEM.SQL.Purge()
方法和管理门户操作下拉列表选项为提供了更具体的选项,仅清除所选择的缓存查询或清除命名空间中的所有缓存查询。
配置SQL shell
- 可以使用Management Portal配置SQL Shell默认值。
- 可以使用SQL Shell参数配置单个SQL shell。更改SQL Shell参数覆盖SQL shell的当前调用的系统范围默认值;它不会更改系统范围的SQL shell默认值。
以下是可用的SQL Shell配置选项,相应的shell参数和默认设置:
管理门户shell配置 | Shell 参数 | 默认 | |
---|---|---|---|
Select Mode | selectmode | Logical | |
SQL Dialect (TSQL) | dialect (TSQL) | IRIS | |
Schema Search Path | path | none | |
Result Column Alignment | colalign | Delimiter | |
Command Prefix (TSQL) | commandprefix (TSQL) | none | |
Result Output Display Mode | displaymode | Current Device | |
Display Path | displaypath | none | |
Display File | displayfile | none | |
Display File Translate Table | displaytranslatetable | none | |
Echo Mode | echo | On | |
Execute Mode | executemode | Immediate | |
Messages Mode | messages | On | |
IF condition to allow execution | 1 | ||
log | Off |
标记为(TSQL)的参数主要用于从SQL Shell执行Sybase
或MSSQL
Transact-SQL
代码。
配置SQL Shell系统范围默认值
转到管理门户,选择系统管理,配置,SQL和对象设置,SQL。选择SQL Shell选项卡。查看并设置SQL Shell系统范围的当前默认设置。
如果更改一个或多个配置设置,则在管理门户路径之后立即由屏幕的左上角的星号(*
)表示。例如,系统>配置> SQL *。按SAVE按钮接受更改。激活更改,星号消失。
为SQL shell配置参数
SQL Shell配置参数特定于当前终端进程上的当前SQL Shell调用。设置跨名称空间应用。但是,如果退出SQL Shell,则所有SQL Shell参数都会重置为系统宽的默认值。 Intersystems Iris提供系统默认值;您可以使用Set Save建立当前进程的不同默认值,如下所述。
SQL shell set命令(没有参数)显示当前shell配置参数,如以下示例所示。在此示例中,该组显示系统默认值,这些值是调用SQL Shell时建立的值:
[SQL]USER>>SET
commandprefix = ""
dialect = IRIS
displayfile =
displaymode = currentdevice
displaypath =
displaytranslatetable =
echo = on
executemode = immediate
log = off
messages = on
path = SQLUser
selectmode = logical
[SQL]USER>>
要显示单个配置参数的当前设置,请指定set param
。例如,SET SelectMode
返回当前选择介绍设置。
可以使用SQL Shell Set
命令设置shell配置参数。 SQL Shell调用的持续时间持续一个设定值;每次调用SQL shell时,参数都会重置为默认值。设置可以使用以下任一语法表单:
SET param value
SET param = value
参数和值都不区分大小写。允许空间,但不需要,之前和之后。
SQL Shell Set Save
命令将当前shell配置参数设置保存为用户默认值。这些默认值应用于当前进程的所有后续SQL Shell调用。它们也被应用于SQL Shell默认值,以在该用户调用的终端过程中的任何后续调用的SQL Shell。它们仍然有效,直到特别重置。使用Set
保存不会影响当前正在运行的SQL Shell调用。
SQL Shell Set Clear
命令清除(重置为系统默认值)当前进程的当前shell配置参数设置。 Intersystems IRIS将此重置应用于当前进程的后续SQL Shell调用,或者当前用户调用的任何新终端进程。设置清除不会影响当前运行的SQL Shell调用。
既不设定保存也没有设置清除更改系统范围的SQL Shell Shell默认设置,使用管理门户进行配置和显示。
Setting COLALIGN
可以使用Set Colalign
来指定用于显示查询ResultSet
数据和列标题的空格格式。可用选项包括:
- 分隔符:
ResultSet
标题/数据列将基于标准分隔符(标签)对齐。这是默认值。 - 标题:
ResultSet
标题/数据列将基于列标题的长度和标准分隔符(标签)对齐。 - 数据:
ResultSet
标题/数据列将基于列数据属性的精度/长度和标准分隔符(标签)对齐。
设置displaymode和displaytranslatetable
可以使用Set DisplayMode
指定用于显示查询数据的格式,如以下示例所示:
DHC-APP>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <>.
Enter q to quit, ? for help.
DHC-APP>>SET DISPLAYMODE XML
displaymode = xml
DHC-APP>>
DisplayMode
默认值是CurrentDevice
,其在TXT格式中显示终端上的查询数据。可以指定set displaymode = cur
恢复CurrentDevice
默认值。
其他可用选项有TXT
、HTML
、PDF
、XML
和CSV
。
格式的选择决定了文件类型。
InterSystems IRIS创建这种类型的文件,将查询数据写入该文件,并在可能的情况下启动适当的程序来显示该查询数据文件。
对于除TXT之外的所有选项,将创建第二个文件来记录结果集消息。
默认情况下,SQL Shell在InterSystems IRIS mgr\Temp\目录中创建这些文件,并分配一个随机生成的带有适当文件类型后缀的文件名。
生成的消息文件名与数据文件名相同,除了附加的字符串“Messages”
。
对于HTML
、PDF
和XML
选项,消息文件具有与查询数据文件相同的文件类型后缀。
对于CSV
选项,消息文件具有TXT
文件类型后缀。
以下是DisplayMode = TXT
时创建的文件的示例:
C:\InterSystems\IRIS\mgr\Temp\sGm7qLdVZn5VbA.txt
C:\InterSystems\IRIS\mgr\Temp\sGm7qLdVZn5VbAMessages.txt
每次运行查询时,SQL shell都会创建一个具有随机生成的文件名的新文件。
如果显示屏是txt
或csv
,则可以选择在执行格式转换时指定要应用的翻译表的名称可以指定SET DISPLAYTRANSLATE
或SET DISPLAYTRANSLATERATE
。转换表名称值区分大小写。
如果DisplayMode
被设置为除CurrentDevice
以外的值,则任何查询结果集包含控制字符的数据会导致生成的警告消息。通常,控制字符仅在逻辑模式下出现在查询结果集数据中。例如,列表结构中的数据包含在逻辑模式下显示的控制字符。因此,建议将DisplayMode
设置为CurrentDevice
以外的值时,还将SelectMode
设置为显示或ODBC。
设置displayfile和displaypath
如果DisplayMode
设置为“CurrentDevice以外的值”
,则可以使用DisplayFile
和DisplayPath
参数指定目标文件位置:
-
DISPLAYFILE:
设置为一个没有后缀的简单文件名;
例如:SET DISPLAYFILE = myfile
。
也可以将该参数设置为部分限定路径,系统间的IRIS将该路径追加到DISPLAYPATH
值或默认目录中,根据需要创建子目录;
例如:SET DISPLAYFILE = mydir\myfile
。
如果设置了DISPLAYPATH
,系统将在指定的目录中创建一个以该文件名命名的文件;
如果没有设置DISPLAYPATH
,系统将在InterSystems IRIS mgr\Temp\目录下创建一个以该文件名命名的文件。 -
DISPLAYPATH:
根据操作系统平台的不同,设置为以斜杠(“/”
)或反斜杠(“\”
)结尾的现有的全限定目录路径结构。
如果设置了DISPLAYFILE
,系统将在此目录下创建一个名为DISPLAYFILE
的文件;
如果没有设置DISPLAYFILE
,系统将在该目录下创建一个随机生成的文件名文件。
如果目录“DISPLAYPATH”
不存在,InterSystems IRIS将忽略“DISPLAYPATH”
和“DISPLAYFILE”
的设置,使用默认目录和随机生成的默认文件名。
必要时,系统自动在DISPLAYPATH
值的末尾添加斜杠(或反斜杠)和/或从DISPLAYFILE
值的开始删除斜杠(或反斜杠),以创建有效的完全限定目录路径。
设置DISPLAYMODE
、DISPLAYFILE
和DISPLAYPATH
:
DHC-APP>>SET DISPLAYMODE XML
displaymode = xml
DHC-APP>>SET DISPLAYFILE = myfile
displayfile = myfile
DHC-APP>>SET DISPLAYPATH = C:\temp\mydir\
displaypath = C:\temp\mydir\
DHC-APP>>
执行查询时,SQL shell将生成以下文件。第一个包含查询数据。第二个包含Query执行产生的任何消息:
C:\temp\mydir\myfile.xml
C:\temp\mydir\myfileMessages.xml
如果既不指定DISPLAYFILE
也不指定DISPLAYPATH
,系统将在Mgr\Temp\目录下为InterSystems IRIS安装(例如,C:\InterSystems\IRIS\Mgr\Temp\
)创建一个随机生成的文件名。
如果显示屏未设置为CurrentDevice
,则每次使用displayfile
集运行查询时,命名文件中的任何现有数据都会被新查询数据替换为新的查询数据。每次使用displayfile
未设置查询时,SQL shell都会使用随机生成的文件名和新的相应邮件文件创建一个新文件。
如果displaymode
设置为currentDevice
,则DisplayFile
和DisplayPath
参数无效。
设置executemode
SQL Shell支持立即和延迟的SQL语句执行。立即执行准备并在按Enter键时执行指定的SQL语句。延迟执行准备在输入Enter时,但在指定转到SQL提示符之前,不会执行它。
可用选项已立即设置ExecuteMode
(默认值),设置ExecuteMode
延迟和设置ExecuteMode
以显示当前模式设置。以下示例设置执行模式:
DHC-APP>>SET EXECUTEMODE DEFERRED
Executemode = deferred
延迟执行允许准备多个SQL查询,然后按名称或编号调用它们以进行执行。要执行准备好的SQL语句,请调用所需的语句(来自适当的命名空间),然后指定Go
。
以下示例显示了在延迟模式下准备三个查询。前两个保存并分配了调用名称;第三个未分配一个名称,但可以通过数字来调用:
DHC-APP>>SELECT TOP 5 Name,Home_State FROM Sample.Person
1. SELECT TOP 5 Name,Home_State FROM Sample.Person
---------------------------------------------------------------------------
DHC-APP>>SAVE 5sample
...statement saved as: 5sample
DHC-APP>>SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
2. SELECT TOP 5 Name,Home_State FROM Sample.Person ORDER BY Home_State
---------------------------------------------------------------------------
DHC-APP>>SAVE 5ordered
...statement saved as: 5ordered
DHC-APP>>SELECT Name,Home_State FROM Sample.Person ORDER BY Home_State
3. SELECT Name,Home_State FROM Sample.Person ORDER BY Home_State
---------------------------------------------------------------------------
以下示例显示了延迟模式执行前一个示例中定义的两个查询的执行。请注意,此示例通过名称调用一个查询(在调用SQL Shell提供新号码时,并按编号调用一个查询:
DHC-APP>>go
C:\InterSystems\Cache\mgr\Temp\ffQlXfFdbGnOxA.xml
Messages.xml
statement prepare time(s)/globals/lines/disk: 0.0526s/45464/263430/5ms
execute time(s)/globals/lines/disk: 0.2948s/153553/1042318/75ms
---------------------------------------------------------------------------
Setting ECHO
可以使用Set Echo
来指定是否将查询结果恢复到SQL Shell。如果指定SET Echo = OFF
,则准备查询,定义缓存查询,并执行查询。终端没有查询结果。这在以下示例中显示:
DHC-APP>>set echo=off
echo = off
DHC-APP>>SELECT Name,Age FROM Sample.Person
4. SELECT Name,Age FROM Sample.Person
--------------------------------------------------------------------------
如果指定SET Echo = ON
(默认值),则将查询结果显示给终端。这在以下示例中显示:
DHC-APP>>set echo=on
echo = on
DHC-APP>>SELECT Name,Age FROM Sample.Person
5. SELECT Name,Age FROM Sample.Person
---------------------------------------------------------------------------
DHC-APP>>go
C:\InterSystems\Cache\mgr\Temp\LVZpPfjfxXXJBg.xml
Messages.xml
statement prepare time(s)/globals/lines/disk: 0.0001s/5/187/0ms
execute time(s)/globals/lines/disk: 0.1613s/152365/1040157/0ms
---------------------------------------------------------------------------
SET Echo
如果displaymode = currentDevice
(默认值)仅有意义。
SET ECHO
和SET MESSAGES
指定终端显示的内容;
它们不会影响查询的准备或执行。
如果SET MESSAGES=OFF和SET ECHO=OFF
,则查询准备好了,一个缓存的查询被创建,查询执行创建一个查询结果集,但是没有返回给终端。
Setting MESSAGES
可以使用SET MESSAGES
来指定是否显示查询错误消息(如果不成功)或查询执行信息(如果成功):
- 如果查询执行不成功:如果指定
SET MESSAGES=OFF
,则终端不会显示任何信息。
如果指定SET MESSAGES=ON
(默认值),则返回查询错误提示,如下所示:error #5540: SQLCODE: -30 message: Table 'SAMPLE
。
值得注意的没有找到。 - 如果查询执行成功:如果指定
SET MESSAGES=OFF
,则只显示查询结果和受影响的n
行。
如果指定SET MESSAGES=ON
(默认值),则查询结果和受影响的n
行(s
行)后面紧跟着语句准备度量、语句执行度量和生成的缓存查询的名称。
准备和执行指标以运行时间(以毫秒为单位)、全局引用总数、执行的命令总数和磁盘读取延迟(以毫秒为单位)来衡量。
设置DISPLAYMODE
不会改变SET MESSAGES=ON
时显示的信息。
一些DISPLAYMODE
选项同时创建一个查询结果集文件和一个消息文件。
该消息文件包含结果集消息,而不是set messages =ON
时显示到终端的查询准备和执行消息。
设置消息并设置echo
指定终端上显示的内容;它们不会影响查询的准备或执行。如果SET MESSAGENT = OFF
和SET ECHO = OFF
,则准备成功的查询,创建缓存的查询,查询执行创建查询结果集,但没有返回到终端。
Setting LOG
可以使用Set
日志指定是否将SQL Shell活动记录到文件。可用选项包括:
-
SET LOG OFF
: 默认值。 Intersystems IRIS不会为当前SQL Shell记录活动。 -
SET LOG ON
: Intersystems Iris将SQL Shell活动记录到默认日志文件。 -
SET LOG pathname
:Intersystems Iris将SQL Shell活动记录到Pathname
指定的文件。
SET LOG ON
在IRIS\mgr\namespace中创建一个日志文件,其中namespace是进程当前命名空间的名称。
这个默认日志文件名为xsqlnnnn。
其中nnnn是当前进程的进程ID (pid)号。
日志文件可以挂起并恢复。
创建日志文件后,SET log OFF
会挂起对该日志文件的写入。
设置LOG ON
恢复写入默认日志文件。
日志重新启动:日志恢复时,将日期时间写入日志文件。
设置LOG ON
总是激活默认日志文件。
因此,如果暂停写入指定的路径名日志文件,则在恢复时必须指定SET log pathname
。
激活日志文件创建终端上显示的SQL Shell活动的副本;它不会重定向SQL Shell终端输出。 SQL Shell Log为失败的SQL执行和SQL代码记录SQL错误,并为成功的SQL执行而导致的行计数。 SQL Shell日志不会记录结果集数据。
如果日志已处于活动状态,则指定“设置”登录无效。如果日志已处于活动状态,则指定设置日志路径名暂停当前日志并激活路径名指定的日志。、
Setting PATH
可以使用SET路径架构来设置Schema Search Path,SQL用于提供不合格表名的正确架构名称。架构可以是单个架构名称,或者逗号分隔的架构名称列表,如下例所示:
DHC-APP>>SET PATH cinema,sample,user
path = cinema,sample,user
没有任何参数的设置路径删除了当前架构搜索路径,恢复系统范围的默认模式名称。
如果未指定SET
路径架构,或者在指定的模式中找不到表,则SQL Shell使用系统范围的默认模式名称。
Setting SELECTMODE
可以使用SetSeliteMode
指定用于显示查询数据的模式。
DHC-APP>>SET SELECTMODE DISPLAY
selectmode = display
可用选项显示,逻辑和ODBC。逻辑是默认值。要确定当前模式,请指定SETELESMODE
,无需值:
DHC-APP>>SET SELECTMODE logical
selectmode = logical
%List
数据使用非打印字符进行编码。因此,当SelectMode =逻辑
时,SQL shell将%List
数据值显示为$listbuild
语句,例如以下$lb("White","Green")
。时间数据类型数据支持分数秒。因此,当SelectMode = ODBC
时,SQL Shell显示分数秒,这与ODBC标准不对应。实际的ODBC时间数据类型截断分数秒。
还可以使用SET SELECTMODE
指定输入数据是否将从显示格式转换为逻辑存储格式。
要进行此数据转换,必须使用select
运行时模式编译SQL代码。
在执行时,SET SELECTMODE
必须设置为LOGICAL
(默认值)。