2015-02-18 3 views
1

У меня есть больше globals в caché db с одинаковой структурой данных. Для каждого глобального я определил класс с картой памяти SQL, но мне нужно сделать это в общем случае для всех глобальных переменных. Можно ли определить один класс с картой памяти sql, который будет использоваться для сопоставления перед выполнением каждого SQL-запроса? Мне нужно избегать объявления класса для каждого глобального, который должен быть доступен через SQL. Я использую ODBC для выполнения операторов SQL.Intersystems caché - реляционное сопоставление (заказное хранилище 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" 

Я хочу иметь SQL-доступ к глобальным переменным, используя один класс ObjectScript.

ответ

2

Если вам нужны только данные, полученные от Caché by ODBC. Итак, в ODBC вы можете использовать инструкцию CALL. И вы можете написать некоторый SqlProc, который может быть вызван ODBC.
Как я вижу, все ваши глобалы с одинаковой структурой. Если так, то это будет легко. Вы можете положить что-то вроде этого, в свой класс.

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(@[email protected]("x","y","SL")) 
     set id=$o(@[email protected](id),1,name) 
     if id'="" { 
      set AtEnd=0 
      set typ=$get(@[email protected](id,"Typ")) 
      set format=$get(@[email protected](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

+0

спасибо, это полезно – mrfazolka

0

Если все глобальные переменные совпадают, тогда вы можете это сделать, но вполне вероятно, что ваши глобальные переменные отличаются друг от друга, что делает невозможным одну карту хранения. У вас уже есть словарь данных/метаданных, который описывает ваши существующие глобальные переменные? Если это так, я бы подумал о написании преобразования из вашего существующего определения словаря данных в классы кэша.

+0

Я обновил свой вопрос. Я точно не знаю, как вы это понимаете, но теперь мой вопрос должен быть ясен. – mrfazolka

+0

Основываясь на вашем обновлении, похоже, что ваш глобальный идентичен по структуре, но имена ваших глобальных символов различаются, поскольку у вас есть globals glob1, NextGlob и другие. Даже если вы сделали один глобальный, который раскрыл каждый из трех глобальных переменных, я предполагаю, что вы заставите пользователя написать инструкцию SQL, которая каким-то образом побудила движок узнать, какой именно глобальный вы хотите. Думаю, я вернусь к одному из моих предыдущих вопросов «У вас есть словарь данных», который описывает эти глобальные переменные? –

+0

Я не уверен, знаю ли вы, что вы подразумеваете под словарем данных, но если вы имеете в виду информацию, используемую при использовании словаря%, так что да, у меня есть эта информация. Я знаю количество свойств и их тип данных и т. Д. – mrfazolka

Смежные вопросы