4

我发现 Oracle 数据库 10g 和 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 回答