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)
}

さらに賢くして、セッション オブジェクトを 1 回だけ開くこともできますが、今後は、この方法を使用しないことをお勧めします。派手に見えるかもしれませんが、2年後には自分が何をしていたのか分からなくなります。したがって、提案された埋め込みSQL psrを使用することをお勧めします。これは、はるかに読みやすい(そして保守しやすい)ものです。

于 2012-10-16T08:33:56.773 に答える