欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第四十五章 Caché 命令大全 ZSAVE 命令

程序员文章站 2022-07-01 10:39:11
...

第四十五章 Caché 命令大全 ZSAVE 命令

保存当前例程。

大纲

ZSAVE:pc routine
ZS:pc routine

参数

  • pc 可选-后置条件表达式。
  • routine 可选-例程的新名称,指定为简单文字。必须是有效的标识符。例程名称区分大小写。例程值不包含在引号中。它没有尖号(^)前缀或文件类型后缀。不能使用变量或表达式指定。

描述

ZSAVE命令保存当前例程。可以使用ZLOAD加载例程,然后使用ZSAVE保存通过ZINSERTZREMOVE命令对例程所做的任何更改。

从终端输入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生成<COMMAND>错误。

示例

以下终端会话示例执行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会失败,并显示<NO SOURCE>错误,并且不会替换现有的目标代码。例如,以下命令加载%SS目标代码例程,尝试从(不存在的)源代码中删除行,然后尝试保存到^test全局。此操作失败,并显示<NO SOURCE>错误:

 ZLOAD %SS ZREMOVE +3 ZSAVE ^test

如果尚未发出修改源代码的命令,则ZSAVE将目标代码保存在指定的例程中。 (显然,不会进行重新编译。)例如,以下命令将加载%SS目标代码例程,然后将其保存到^test全局变量中。此操作成功:

  ZLOAD %SS ZSAVE ^test

带有% Routines的ZSAVE

如果尝试将%routine ZSAVE保存到远程数据集,即使该数据集是该过程的当前数据集,也会收到<PROTECT> 错误。百分号前缀用于不可修改的例程的名称,例如系统实用程序。

并发ZSAVE操作

在网络环境中使用ZSAVE时,可能会发生两种不同的作业可能会同时保存一个例程并为其分配相同名称的情况。此操作可能会导致一个例程覆盖另一个例程的一部分,从而产生不可预测的结果。如果存在这种可能性,请在ZSAVE操作之前在例程上获取建议性锁定。例如,LOCK ^ ROUTINE(“ name”)。当跨ECP运行作业时,由于本地缓冲区保护对其他客户端不可见,因此已保存的源更容易受到此类并发保存的影响。