我在cachédb中有更多全局变量,具有相同的数据结构。对于每个具有SQL存储映射的全局I定义类,但我需要对所有全局变量进行泛化。是否可以使用sql存储映射定义一个类,它将在每次执行SQL查询之前用于映射?我需要避免每个需要通过SQL访问的全局的类声明。我使用ODBC执行SQL语句。
如果有人可以帮助我,我将非常感激
我的全局变量看起来像这样:
^glob1("x","y","SL",1) = "Name"
^glob1("x","y","SL",1,"Format") = "myFormat"
^glob1("x","y","SL",1,"Typ") = "my Type"
^glob1("x","y","SL",2) = "Name2"
^glob1("x","y","SL",2,"Format") = "myFormat2"
^glob1("x","y","SL",2,"Typ") = "Type2"
^nextGlob("x","y","SL",1) = "Next Name"
^nextGlob("x","y","SL",1,"Format") = "Next myFormat"
^nextGlob("x","y","SL",1,"Typ") = "my Type"
^another("x","y","SL",13) = "Another Name"
^another("x","y","SL",13,"Format") = "Another myFormat"
^another("x","y","SL",13,"Typ") = "Another Type"
我希望使用一个ObjectScript类对全局变量进行sql访问。
答案 0 :(得分:2)
如果您只需要通过ODBC从Caché读取数据。因此,在ODBC中,您可以使用CALL语句。你可以编写一些可以被ODBC调用的SqlProc 正如我所看到的,所有的全局变量都具有相同的结构。如果是这样,那将很容易。你可以在课堂上加上这样的东西。
Query Test() As %Query(ROWSPEC = "ID:%String,Global:%String,Name:%String,Typ:%String,Format:%String") [ SqlProc ]
{
}
ClassMethod TestExecute(ByRef qHandle As %Binary) As %Status
{
#; Initial settings
#; List of Globals
set $li(qHandle,1)=$lb("glob1","nextGlob","another")
#; Current Global index
set $li(qHandle,2)=1
#; Current ID in global
set $li(qHandle,3)=""
Quit $$$OK
}
ClassMethod TestClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = TestExecute ]
{
Quit $$$OK
}
ClassMethod TestFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = TestExecute ]
{
set globals=$lg(qHandle,1)
set globalInd=$lg(qHandle,2)
set id=$lg(qHandle,3)
set AtEnd=1
for {
set global=$lg(globals,globalInd)
quit:global=""
set globalData="^"_global
set globalData=$na(@globalData@("x","y","SL"))
set id=$o(@globalData@(id),1,name)
if id'="" {
set AtEnd=0
set typ=$get(@globalData@(id,"Typ"))
set format=$get(@globalData@(id,"Format"))
set Row=$lb(id,global,name,typ,format)
set $li(qHandle,3)=id
quit
} elseif $i(globalInd) {
set id=""
set $li(qHandle,2)=globalInd
}
}
Quit $$$OK
}
然后你可以像这样执行语句
CALL pkg.classname_test()
结果就像这张照片上的情况一样
答案 1 :(得分:0)
如果所有全局变量都相同,那么你可以这样做,但很可能你的全局变量都不同,因此不太可能产生单个存储映射。您是否已经拥有描述现有全局变量的数据字典/元数据系统?如果是这样,我会考虑编写从现有数据字典定义到缓存类的转换。