plsql – 在Oracle数据库10g和11g中选择更新…的区别

我发现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中的一些错误吗?有什么想法吗?

最佳答案 有一个
bug in 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;
点赞