第四十五章 Caché 命令大全 ZSAVE 命令
保存当前例程。
大纲
ZSAVE:pc routine
ZS:pc routine
参数
- pc 可选-后置条件表达式。
- routine 可选-例程的新名称,指定为简单文字。必须是有效的标识符。例程名称区分大小写。例程值不包含在引号中。它没有尖号(
^
)前缀或文件类型后缀。不能使用变量或表达式指定。
描述
ZSAVE
命令保存当前例程。可以使用ZLOAD
加载例程,然后使用ZSAVE
保存通过ZINSERT
和ZREMOVE
命令对例程所做的任何更改。
从终端输入ZSAVE
命令或使用XECUTE
命令或$XECUTE
函数调用ZSAVE
命令时,都只能使用它。不应将其编码到例程的主体中,因为其操作会影响该例程的执行。在例程中指定ZSAVE
会导致编译错误。从例程中执行ZSAVE
的任何尝试也会产生错误。
ZSAVE
不会移动编辑指针。
如果将ZLOAD
例程作为当前例程,则:
- 使用
ZINSERT
和/或ZREMOVE对
其进行修改后,ZSAVE
当前例程:InterSystems IRIS^rINDEX("MyRoutine","INT")
和^rINDEX("MyRoutine","OBJ")
全局更新为当前时间戳和字符数,和更新以及^ROUTINE("MyRoutine",0)
全局变量。 -
ZSAVE
当前例程,而不修改当前例程:InterSystems IRIS全局变量更新^rINDEX("MyRoutine","OBJ")
;它不会更改全局变量^rINDEX("MyRoutine","INT")
或全局变量^ROUTINE("MyRoutine",0)
。
ZSAVE具有两种形式:
- 无参
- 有参
ZSAVE无参数
不带参数的ZSAVE
将当前例程保存为其当前名称。这是ZLOAD
中指定的名称,或者是之前使用ZSAVE
保存时使用的名称。 ZSAVE
将例程保存在当前名称空间中。
以下示例从USER名称空间加载例程,修改该例程,然后更改为其他名称空间并执行ZSAVE
。这些操作的结果是,现在在USER和SAMPLES命名空间中都有名为MyRoutine
的例程。 SAMPLES中的MyRoutine
包含插入的代码行。 USER中的MyRoutine
不包含插入的代码行:
DHC-APP>ZLOAD PHA.TEST.Command
DHC-APP>ZPRINT +1:+4
AviationLetters
WRITE "Hello, World!"
Abc
WRITE "A is Abel",!
DHC-APP>ZINSERT " WRITE 123,!":+3
DHC-APP>ZPRINT +1:+5
AviationLetters
WRITE "Hello, World!"
Abc
WRITE 123,!
WRITE "A is Abel",!
DHC-APP>ZNSPACE "SAMPLES"
SAMPLES>ZPRINT +1:+5
AviationLetters
WRITE "Hello, World!"
Abc
WRITE 123,!
WRITE "A is Abel",!
SAMPLES>ZSAVE
如果当前例程尚无名称,则无参数ZSAVE
会生成错误。
无参数的ZSAVE
命令可以指定后置条件表达式。
ZSAVE有参数
ZSAVE
例程将当前例程作为指定的例程名称保存到磁盘。它将指定的例程作为当前例程。例如,如果加载名为MyRoutine
的例程,请对其进行修改,然后使用ZSAVE MyNewRoutine
保存它,当前的例程现在为MyNewRoutine
,其中包含所做的更改。名为MyRoutine
的例程不包含这些更改,并且不再作为当前例程加载。
ZSAVE
例程将当前例程保存在当前名称空间中。例如,如果从USER命名空间加载名为MyRoutine的例程,修改该例程,然后更改为SAMPLES命名空间并执行ZSAVE MyNewRoutine
,则MyNewRoutine
保存在命名空间SAMPLES中,而不是USER命名空间中。
如果使用XECUTE
命令调用ZSAVE
例程,则系统将创建一个Load帧以保留当前例程。当XECUTE
命令结束时,Caché使用此Load帧将XECUTE
之前的例程名称恢复为当前例程。在下面的示例中显示:
SAMPLES> WRITE "Current routine name",!
Current routine name
SAMPLES>WRITE "initial name: ",$ZNAME,!
initial name: PHA.TEST.Command
SAMPLES>SET x = "WRITE $ZNAME"
SAMPLES>SET y = "ZSAVE mytest"
SAMPLES>SET z = "WRITE "" changed to "",$ZNAME,!"
SAMPLES>XECUTE x,y,z
PHA.TEST.Command changed to PHA.TEST.Command
SAMPLES> WRITE "restored name: ",$ZNAME,!
restored name: PHA.TEST.Command
ZSAVE
例程用于命名装载了无参数ZLOAD
的例程。
ZSAVE
例程用于命名由ZINSERT
命令创建的无名例程。
参数
pc
可选的后置条件表达式。如果后置条件表达式为true(计算为非零数值),则Caché执行命令。如果后置条件表达式为假(计算为零),则Caché不执行命令。
routine
保存例程的名称。例程必须是有效的例程名称。可以使用 $ZNAME("string",1)
函数来确定string是否为有效的例程名称。可以使用$ZNAME
特殊变量来确定当前加载的例程的名称。
通常,例程是该例程的新名称,但它可以是当前例程的名称。如果当前名称空间中已经存在该名称的例程,则Caché会覆盖它。请注意,系统不会要求您确认覆盖。例程名称在前255个字符内必须是唯一的;例程名称不应超过220个字符。
如果省略例程,则系统会将例程保存为当前名称。如果不存在当前名称,则ZSAVE
生成
错误。
示例
以下终端会话示例执行ZSAVE
命令以保存当前加载的例程:
USER>DO ^myroutine
this is line 8
this is line 9
USER>ZLOAD myroutine
USER>PRINT +8
WRITE "this is line 8",!
USER>ZREMOVE +8
USER>PRINT +8
WRITE "this is line 9",!
USER>ZSAVE myroutine
USER>DO ^myroutine
this is line 9
USER>
注意
ZSAVE和例行重新编译
如果发出了修改源代码的命令,则ZSAVE
重新编译并保存例程。如果例程的源代码不可用,则ZSAVE
会失败,并显示
错误,并且不会替换现有的目标代码。例如,以下命令加载%SS
目标代码例程,尝试从(不存在的)源代码中删除行,然后尝试保存到^test
全局。此操作失败,并显示
错误:
ZLOAD %SS ZREMOVE +3 ZSAVE ^test
如果尚未发出修改源代码的命令,则ZSAVE将目标代码保存在指定的例程中。 (显然,不会进行重新编译。)例如,以下命令将加载%SS
目标代码例程,然后将其保存到^test
全局变量中。此操作成功:
ZLOAD %SS ZSAVE ^test
带有% Routines的ZSAVE
如果尝试将%routine ZSAVE
保存到远程数据集,即使该数据集是该过程的当前数据集,也会收到
错误。百分号前缀用于不可修改的例程的名称,例如系统实用程序。
并发ZSAVE操作
在网络环境中使用ZSAVE
时,可能会发生两种不同的作业可能会同时保存一个例程并为其分配相同名称的情况。此操作可能会导致一个例程覆盖另一个例程的一部分,从而产生不可预测的结果。如果存在这种可能性,请在ZSAVE
操作之前在例程上获取建议性锁定。例如,LOCK ^ ROUTINE(“ name”)
。当跨ECP运行作业时,由于本地缓冲区保护对其他客户端不可见,因此已保存的源更容易受到此类并发保存的影响。