第十四章 使用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: <<nothing>>.
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
(默認值)。