読者です 読者をやめる 読者になる 読者になる

伝票のヘッダと明細を一度にロックしたいけどヘッダ単位でforループしたいんです

oracle db

いま直面している問題においては、別に一度にロックできる必要なんてなくねって感じではあるんだけど。

ヘッダと明細を普通に内部結合して、ヘッダのカラムだけselectしてdistinctすればよくね?と思ったけど、distinctとfor updateは共存できないんです。

select distinct j.*
from jobs j, job_history h
where j.job_id = h.job_id
and j.job_id = 'ST_CLERK'
for update nowait;
for update nowait
*
行5でエラーが発生しました。:
ORA-01786: この問合せ式ではFOR UPDATE句は使用できません。

ならば、とdistinctする前のselect文をサブクエリにしてみるがダメ。for updateはトップレベルのselect文でないと使えないんです。

select distinct *
from (
  select j.*
  from jobs j, job_history h
  where j.job_id = h.job_id
  and j.job_id = 'ST_CLERK'
  for update nowait
)
  for update nowait
  *
行7でエラーが発生しました。:
ORA-00907: 右カッコがありません。

どうすればよいの。。スマートにはやれないってことなのか。

参考:

SQL文: SAVEPOINT~UPDATE

最上位のSELECT文でのみ、この句を指定できます。副問合せでは指定できません。…この句をDISTINCT演算子またはCURSOR式、集合演算子、group_by_clause、または集計ファンクションの構造体とともに指定することはできません。

20130705追記

明細を更新する場合はまずヘッダをロックしてから明細を更新する、というルールを決めるのが一般的なのかな?