1

我将如何在对象脚本而不是 SQL 中编写此查询?

Query GetSessionIdByUserName(UserName As %String) As %SQLQuery [ Private ]
{
    SELECT %ID from Sample.Session
    WHERE UserName = :UserName
}

到目前为止,我似乎在文档中找到的只是 %OpenId

##class(Sample.Session).%OpenId(id)  

当 id 未知且需要先找到时会发生什么?

4

2 回答 2

2

没有内置方法可以执行诸如通过用户名获取会话 ID 之类的操作。您需要自己编写它们,而 SQL 通常是最好的方法。不过,您可以将 SQL 包装在方法中,而不是查询中。

Method GetSessionIdByUserName(UserName As %String) As Sample.Session [ Private ]

{
    &SQL(SELECT %ID INTO :ID from Sample.Session
    WHERE UserName = :UserName)

    Q ##class(Sample.Session).%OpenId(ID)
}
于 2012-10-15T18:49:32.307 回答
1

如果您坚持不使用 SQL,则需要执行以下操作:

Method GetSEssionIdByUserName(UserName as %String) As Sample.Session [ Private ]
{
   s c=$O(^Sample.SessionD("")),f=""
   while ((f="") && (c'="")){
       s p=##class(Sample.Session).%OpenId(c)
       if $isobject(p){
            s:p.UserName=UserName f=c
       }
       //alternatively if you're sure about the global structure, something like this:
       //assume the Username is stored at position 3 for a sec:
       //s:$LG(^Sample.SessionD(c),3)=UserName f=c

       s c=$O(^Sample.SessionD(c))
   }
   q ##class(Sample.Session).%OpenId(f)
}

你可以让它更聪明,只打开一次会话对象,但我建议不要这样做。它可能看起来很花哨,但两年后你不会知道你在做什么。所以我建议使用建议的嵌入式 sql psr,它更具可读性(和可维护性)。

于 2012-10-16T08:33:56.773 回答