绕过ODBC使用ObjectScript访问远程系统 这是一个在 IRIS 2020.1 和 Caché 2018.1.3 上工作的代码示例 不会与新版本保持同步 也不会获得 InterSystems 提供的支持服务! 我们经常会遇到这样的情况,由于各种原因ODBC是访问一个远程系统的唯一选择。如果你只需要检查或改变表,这就足够了。但你不能直接执行一些命令或改变一些Global。 特别感谢@Anna.Golitsyna 启发我发表此文。 `这个例子提供了3种 SQLprocedure 方法来实现访问远程系统这个目的,如果其他的访问方式被阻止,通常是被一些防火墙阻止。` * SQLprocedure **Ping() **返回 Server::Namespace::$ZV 并允许检查连接 * SQLprocedure **Xcmd(<commandline>,<resultvar>)**  执行你提交的命令行,并返回一个存放在你命名的变量中的结果。 * SQLprocedure **Gset(<global>,<subscript>,<value>,<$data>) ** 允许你设置或删除一个Global节点 。参数<global> 是远程命名空间中的GlobalName,包括前导符;例如'^MyGlobal'  _(注意:sql 用单引号!)_ 。参数<subscript>代表完整的下标,包括括号;例如 '(1,3, "something",3)'  _(注意:sql 用单引号!)。_ 参数<$data> 控制你是对Global节点赋值,还是对其执行ZKILL;例如,1,11表示设置,0,10表示ZKILL;正如你可能从名字中猜到的那样,在Global复制过程中,这特别有用。    `程序Gset是为了利用前一篇文章的<a href="https://cn.community.intersystems.com/post/global-%E6%89%AB%E6%8F%8F%E5%92%8C%E5%88%87%E7%89%87">Global扫描</a>而设计的,结合起来用,它们支持在任何ODBC连接中进行Global复制。  ` ### **`安装: `** `- 在远程系统中,你需要我们应用市场OpenExchange中提供的<a href="https://openexchange.intersystems.com/package/ObjectScript-Over-ODBC-2">类</a> <br>- 在本地(源)系统中你需要定义这些程序为连接的SQL Procedures<br>      <u>SMP>System>SQL> Wizards>Link Procedure</u><br>      同时定义你的本地包名称 (在这个例子中我使用<strong>zrccEX</strong>)<br>-  如果你想运行Global 复制你还需要从我们应用市场安装<a href="https://openexchange.intersystems.com/package/Global-Scanning-and-Slicing-to-SQL">Global  Scanning 类 </a>` `   (只是为了舒服一点)` ### `<strong>例子:</strong>` USER>do $system.SQL.Shell() SQL Command Line Shell [SQL]USER>>select <strong>rccEX.Ping()</strong> Expression_1 cemper9::CACHE::IRIS for Windows (x86-64) 2020.1 (Build 215U) Mon Mar 30 2020 20:14:33 EDT `检查Global是否存在 ^rcc` [SQL]USER>>select <strong>rccEX.Xcmd('set %y=$d(^rcc)','%y')</strong> ok: 10 赋值 ^rcc4(1,"demo",3,4) [SQL]USER>>select <strong>rccEX.Gset('^rcc4','(1,"demo",3,4)','this is a demo',1)</strong> Expression_1 ok: ^rcc4(1,"demo",3,4) 从 ^rcc2 到 ^rcc4 进行Global 复制. 首先显示 ^rcc2 USER>>select reference,value,"$DATA" from rcc_G.Scan where rcc_G.scan('<strong>^rcc2</strong>',4)=1 Reference       Value   $Data  ^rcc2           10 (1)     1       1 (2)     2       11 (2,"xx")                10 (2,"xx",1)      "XX1"   1 (2,"xx",10)     "XX10"  1 (2,"xx",4)      "XX4"   1 (2,"xx",7)      "XX7"   1 (3)     3       1 (4)     4       11 (4,"xx")                10 (4,"xx",1)      "XX1"   1 (4,"xx",10)     "XX10"  1 (4,"xx",4)      "XX4"   1 (4,"xx",7)      "XX7"   1 (5)     5       1 16 Rows(s) Affected `现在执行复制到远程global` [SQL]USER>>select rccEX.Gset('^rcc4',reference,value,"$DATA")  from rcc_G.Scan where rcc_G.scan('^rcc2',4)=1 Expression_1 ok: ^rcc4 ok: ^rcc4(1) ok: ^rcc4(2) ok: ^rcc4(2,"xx") ok: ^rcc4(2,"xx",1) ok: ^rcc4(2,"xx",10) ok: ^rcc4(2,"xx",4) ok: ^rcc4(2,"xx",7) ok: ^rcc4(3) ok: ^rcc4(4) ok: ^rcc4(4,"xx") ok: ^rcc4(4,"xx",1) ok: ^rcc4(4,"xx",10) ok: ^rcc4(4,"xx",4) ok: ^rcc4(4,"xx",7) ok: ^rcc4(5)  16 Rows(s) Affected