文章
· 六月 7, 2022 阅读大约需 3 分钟

绕过ODBC使用ObjectScript访问远程系统

绕过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是为了利用前一篇文章的Global扫描而设计的,结合起来用,它们支持在任何ODBC连接中进行Global复制。  

安装: 

- 在远程系统中,你需要我们应用市场OpenExchange中提供的 
- 在本地(源)系统中你需要定义这些程序为连接的SQL Procedures
      SMP>System>SQL> Wizards>Link Procedure
      同时定义你的本地包名称 (在这个例子中我使用zrccEX)
-  如果你想运行Global 复制你还需要从我们应用市场安装Global  Scanning 类 

   (只是为了舒服一点)

例子:

USER>do $system.SQL.Shell()
SQL Command Line Shell
[SQL]USER>>select rccEX.Ping()
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 rccEX.Xcmd('set %y=$d(^rcc)','%y')
ok: 10

赋值 ^rcc4(1,"demo",3,4)

[SQL]USER>>select rccEX.Gset('^rcc4','(1,"demo",3,4)','this is a demo',1)
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('^rcc2',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
讨论 (0)1
登录或注册以继续