伝票のヘッダと明細を一度にロックしたいけどヘッダ単位でforループしたいんです
いま直面している問題においては、別に一度にロックできる必要なんてなくねって感じではあるんだけど。
ヘッダと明細を普通に内部結合して、ヘッダのカラムだけ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: 右カッコがありません。
どうすればよいの。。スマートにはやれないってことなのか。
参考:
最上位のSELECT文でのみ、この句を指定できます。副問合せでは指定できません。…この句をDISTINCT演算子またはCURSOR式、集合演算子、group_by_clause、または集計ファンクションの構造体とともに指定することはできません。
20130705追記
明細を更新する場合はまずヘッダをロックしてから明細を更新する、というルールを決めるのが一般的なのかな?