8

Oracle マージ クエリから主キーを返したい。存在しない場合に挿入する単一のステートメントを使用していますが、そのためにプロシージャまたは関数を使用したくありません..

これはサンプルクエリです

merge into myTable e
  using (select :empname name from dual) s
  on (UPPER(TRIM(e.empname)) = UPPER(TRIM(s.name)))
  when not matched then insert (empname) 
    values (s.name)

myTable の別の主キー フィールドを取得する必要があります。主キーは、シーケンスとトリガーを使用して挿入されます

追加しようとしまし RETURNING empID into :empId たが、エラーが発生します

4

2 に答える 2

10

問題があります。

  1. Merge Intoをサポートしていないため、機能しませんReturning Into
  2. シーケンスは、新しいレコードを挿入するときにのみ使用されるため、常に使用されるわけではありません。
  3. 現在のセッションでシーケンスがまだ使用されていないときに Sequence.currval をクエリするとエラーが発生するため、シーケンスの既存の値を取得することはできません。

それを解決するには:

  1. プロシージャまたは匿名プログラム ブロックを使用して、値を更新してみてください。sql%rowcount更新後に 0 が返された場合は、代わりに挿入を実行します。
  2. 選択 ( のクエリUPPER(TRIM(name))) を使用して、更新されたレコードを検索します。
于 2012-11-06T13:11:09.513 に答える