4

OracleDatabase10gと11gでは次のPL/SQLブロックの処理が異なることがわかりました(便宜上、scottスキーマを使用しています)。

DECLARE
  v_ename  bonus.ename%TYPE;
BEGIN
  SELECT b.ename
    INTO v_ename
    FROM bonus b
    JOIN emp e ON b.ename = e.ename
    JOIN dept d ON d.deptno = e.deptno
   WHERE b.ename = 'Scott'
     FOR UPDATE OF b.ename;
END;
/

10g(10.2)では、このコードは正常に終了しますが(NO_DATA_FOUND例外が発生しますが、これは予期されます)、11g(11.2)では、「列があいまいに定義されています」という例外が発生します。そして、それは絶対に期待されていません。FOR UPDATE OF e.empno(これも機能しません)の列をe.mgr (一意)に変更すると機能し始めることがわかったため、テーブルエイリアスが考慮されていないようです。それで、これは11gのエラーですか?何かご意見は?

4

2 に答える 2

2

これは Oracle 11G のバグです。11.2.0.2 バージョンで修正されました。このスレッドで議論されています: https://forums.oracle.com/forums/thread.jspa?threadID=2314477

于 2012-07-18T04:58:51.083 に答える
0

Oracle 10g にはバグがあり、11g で修正されました。ORA-00918 あいまいに定義された列が発生するはずのときに発生しませんでした。すべてのエイリアスを指定しているため、これがあなたに当てはまるかどうかはわかりません。

Bonus.ename -> emp.ename に適用される外部キー関係はありますか?

ANSI 以外の結合構文を使用してみましたか。たとえば、次のようになります。

SELECT b.ename
INTO   v_ename
FROM   bonus b, emp e, dept d
WHERE  b.ename = 'Scott'
AND    b.ename = e.ename
AND    d.deptno = e.deptno
FOR UPDATE OF b.ename;
于 2010-04-30T04:18:52.080 に答える