Intersystemscaché - 关系映射(自定义sql存储)

时间:2015-02-18 14:05:42

标签: odbc mapping storage intersystems-cache

我在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访问。

2 个答案:

答案 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()

结果就像这张照片上的情况一样 enter image description here

答案 1 :(得分:0)

如果所有全局变量都相同,那么你可以这样做,但很可能你的全局变量都不同,因此不太可能产生单个存储映射。您是否已经拥有描述现有全局变量的数据字典/元数据系统?如果是这样,我会考虑编写从现有数据字典定义到缓存类的转换。