OCM_담당의사 배치의 SQL 을 확보하고, 옮기기 전에 정할 것 둘을 적는다

조회 두 개(GetCodInfDT With_Join · GetUidMst)와 세 갈래 호출 조건을
문서에 그대로 옮겼다 — 다음 세션이 다시 파헤치지 않아도 된다.

## 그 과정에서 걸린 것 둘

① 조회에 ORDER BY 가 없는데 호출부가 Rows(0) 을 집는다.
   한 내원에 진료과 이력이 여럿이면 <b>오라클이 어느 행을 먼저 주느냐에 따라
   담당의가 달라진다</b>. 레거시 동작 자체가 비결정적이라
   "그대로 옮긴다"가 성립하지 않는다 — 정할 문제다.

② 위 SQL 이 이미 담당의 이름(CodDtrCod_Nam)을 돌려주는데
   태그는 그것을 안 쓰고 다른 날짜로 GetUidMst 를 한 번 더 친다.
   날짜가 다르니 두 값이 갈릴 수 있다. 왕복을 줄이려고 첫 결과를 쓰면
   값이 달라진다 — 레거시를 따르려면 두 번 쳐야 한다.

그리고 이 조회는 PatientContextStore 가 읽는 CodInf 와 선택 규칙이 다르다
(그쪽은 BETWEEN + 최신순 1행). 문맥의 CodInf 를 재사용하면 안 된다.

코드 변경 없음(문서만). 게이트는 앞 커밋 상태 그대로다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Msystech
2026-08-19 11:39:50 +09:00
co-authored by Claude Opus 5
parent d6d594490c
commit 3e9f50ee52
+51
View File
@@ -105,3 +105,54 @@ ETC_로그인_사용자ID_사용자명 Return moWrkInfoBiz.UidMst.Item("UidCod"
지어낸 이름 셋이 조용히 앉아 있던 적이 있다. 지어낸 이름 셋이 조용히 앉아 있던 적이 있다.
- 짐작한 컬럼·계산식은 넣지 않는다. 종이에 그럴듯한 값이 찍히면 아무도 의심하지 않는다. - 짐작한 컬럼·계산식은 넣지 않는다. 종이에 그럴듯한 값이 찍히면 아무도 의심하지 않는다.
- 값이 아니라 <b>사유</b>를 돌려주는 쪽이 항상 안전하다. - 값이 아니라 <b>사유</b>를 돌려주는 쪽이 항상 안전하다.
---
## 배치 1 준비 — `OCM_담당의사` 계열 (SQL 확보 완료)
`GetCodInfDT(comNum, adpDtm, 1)` = `EN_JOIN.With_Join` (dtCommonLib.vb:2777-2830):
```sql
SELECT Cod.*, DepKorNam CodDepCod_Nam,
Usr.UidNam CodDtrCod_Nam, Umt.UidNam CodStfCod_Nam
FROM P_CodInf Cod
LEFT OUTER JOIN M_UidMst Usr ON Usr.UidCod = CodDtrCod AND Usr.UidDtrYon = 'Y'
AND :d BETWEEN Usr.UidStrDte AND Usr.UidEndDte
LEFT OUTER JOIN M_UidMst Umt ON Umt.UidCod = CodStfDtr AND Umt.UidDtrYon = 'Y'
AND :d BETWEEN Umt.UidStrDte AND Umt.UidEndDte
LEFT OUTER JOIN M_DepMst Dep ON DepCod = CodDepCod AND DepHspCod = Usr.UidHspCod
AND DepWrkTyp IN ('D','A') -- SYBS·NYHY 는 ('D','A','B')
AND :d BETWEEN DepStrDte AND DepEndDte
WHERE CodComNum = :n AND CodMtiSeq = '0'
```
`:d` 는 넘긴 적용일시의 **앞 8자리**(비면 서버 날짜).
호출 갈래(bzDataInterface.vb `OCM_담당의사`):
| 조건 | 넘기는 시각 | UidMst 조회 날짜 |
| --- | --- | --- |
| 입원 · `ComPrgStt='ILV'` | `ComLevDtm[0..12]` | `CodEndDtm[0..8]` |
| 입원 · 그 밖 | 서버 현재일시 | `CodEndDtm[0..8]` |
| 외래 | `ComAcpDtm[0..12]` | `ComAcpDtm[0..8]` |
세 태그의 차이는 마지막 한 줄뿐이다 —
`UidNam` / `UidNam(UidCod)` / `UidMblPhn`.
### 옮기기 전에 정해야 할 것 둘
**① 이 조회에는 정렬이 없다.** `CodComNum` + `CodMtiSeq='0'` 으로만 거르고
`ORDER BY` 가 없는데 호출부는 `Rows(0)` 을 집는다. 한 내원에 진료과 이력이 여럿이면
<b>오라클이 어느 행을 먼저 주느냐에 따라 담당의가 달라진다.</b>
레거시의 실제 동작이 비결정적이라는 뜻이라, "그대로 옮긴다"가 성립하지 않는다.
정렬을 넣으면 레거시와 달라질 수 있고, 안 넣으면 우리도 비결정적이 된다.
→ 어느 쪽인지 사용자와 정하고 근거를 주석에 남긴다.
**② 두 번 조회한다.** 위 SQL 이 이미 `CodDtrCod_Nam`(담당의 이름)을 돌려주는데
태그는 그것을 쓰지 않고 `GetUidMst` 로 <b>다른 날짜</b>를 써서 다시 찾는다.
날짜가 다르므로 두 값이 갈릴 수 있다. 어느 쪽이 맞는지는 레거시 동작을 따라야 한다
(= 두 번째 조회 결과를 쓴다). 왕복을 줄이려고 첫 결과를 쓰면 값이 달라진다.
또한 이 조회는 `PatientContextStore` 가 이미 읽는 `CodInf` 와 <b>선택 규칙이 다르다</b>
(그쪽은 적용일시 BETWEEN + 최신순 1행). 같은 표를 두 규칙으로 읽게 되므로
문맥의 `CodInf` 를 재사용하면 안 된다.