2012-10-15 2 views
1

SQL 대신 개체 스크립트에이 쿼리를 쓰려면 어떻게해야합니까?% OpenID를 사용하지 않는 개체 스크립트 쿼리

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

나는이 문서에서 지금까지 찾을 수가 모두가 % 오픈 ID

ID가 알려져 있지 않을 때 발생하고 먼저 발견 할 필요가 무엇
##class(Sample.Session).%OpenId(id) 

?

답변

2

사용자 이름별로 세션 ID를 가져 오는 것과 같은 작업을 수행하는 메소드가 없습니다. 직접 작성해야하며 일반적으로 SQL을 사용하는 것이 가장 좋습니다. 쿼리가 아닌 메서드에서 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을 사용하지 않는 주장하는 경우

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

, 당신의 라인을 따라 뭔가를 할 필요가있을 것이다 도로 나는이 방법에 반대하는 것이 좋습니다. 그것은 멋져 보일지 모르지만, 2 년 후에는 자신이하는 일을 알 수 없을 것입니다. 그래서 나는 제안 된 임베디드 SQL과 함께 갈 것이 좋습니다, 그것은 훨씬 더 (그리고 maintainable) 읽을 수있어.

+0

+1 - 좋은 예. 나는 동의한다, 겨자를 자르지 않을 것이다. –

+0

또는 사용자 이름이 모든 세션 항목에서 고유해야한다는 것을 알고 있다면 클래스에 고유 색인을 항상 추가 할 수 있습니다 :'Index UserNameIndex on UserName [Unique];'그런 다음 위의 메소드는 하나 또는 두 개의 행만 필요합니다. 이름이 색인에 존재하는지 점검하는 코드. 그럴 경우 ID 값을 반환합니다. 그렇지 않은 경우, 사용자 이름이 없음을 의미하는 null을 리턴합니다. – Derek

관련 문제