ObjectScript sobre ODBC
Este es un ejemplo de código que funciona en IRIS 2020.1 y en Caché 2018.1.3
No se mantendrá sincronizado con las nuevas versiones.
Y NO cuenta con el servicio de soporte de InterSystems.
En este artículo vamos a ver 3 procedimientos SQL que permiten acceder a los globals usando ODBC.
- SQLprocedure Ping() devuelve Server::Namespace::$ZV. Permite verificar la conexión.
- SQLprocedure Xcmd(<commandline>,<resultvar>) ejecuta la línea de comandos que envías y devuelve el resultado en <resultvar>.
- SQLprocedure Gset(<global>,<subscript>,<value>,<$data>) te permite establecer o eliminar un global.
- <global> es un nodo del global perteneciente al *namespace* del servidor remoto. Hay que incluir el símbolo inicial, por ejemplo, '^MyGlobal' .
- <subscript> representa el subíndice completo incluyendo los paréntesis, por ejemplo: '(1,3,"something",3)' .
- <value> es el valor que queremos establecer.
- <$data> controla si se establece el Nodo global o se ejecuta un ZKILL en él, por ejemplo:
- 1, 11 para establecer el valor.
- 0,10 para borrar (ZKILL) el valor.
El procedimiento Gset está diseñada para hacer uso del Global Scanning descrito en otro artículo. Gset permite copiar globals a través de cualquier conexión ODBC.
Instalación:
- En el sistema remoto necesitas la clase que se encuentra en OpenExchange.
- Además necesitas definir los procedimientos como "Linked SQL Procedures", para ello emplea este asistente:
SMP>System>SQL> Wizards>Link Procedure
En los ejemplos se usa el namespace rccEX.
- Si quieres ejecutar la copia de globals también necesitas instalar la clase Global Scanning desde OEX
Ejemplos:
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
Verifica la existencia del global ^rcc
[SQL]USER>>select rccEX.Xcmd('set %y=$d(^rcc)','%y')
ok: 10
Establece algún valor en ^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)
Haz una copia de ^rcc2 a ^rcc4.
Primero vemos el contenido de ^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
Ahora ejecuta la copia del contenido de ^rcc2 en ^rcc4:
[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
Un agradecimiento especial para @Anna Golitsyna por inspirarme a publicar esto.