绕过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
查看原帖 由 @Robert Cemper 撰写