Oracle 数据库 10g 和 11g 中选择更新 ...的区别
Posted
技术标签:
【中文标题】Oracle 数据库 10g 和 11g 中选择更新 ...的区别【英文标题】:Difference in select for update of ... in Oracle Database 10g and 11g 【发布时间】:2010-04-29 10:11:58 【问题描述】:我发现 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中的一些错误吗?有什么想法吗?
【问题讨论】:
【参考方案1】:这是 Oracle 11G 中的一个错误。它已在 11.2.0.2 版本中修复。已在此线程中讨论过:https://forums.oracle.com/forums/thread.jspa?threadID=2314477
【讨论】:
【参考方案2】:有一个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;
【讨论】:
我试过了,非 ANSI 语法按预期工作。因此,他们似乎修复了您提到的错误,但又引入了另一个错误。 :-)以上是关于Oracle 数据库 10g 和 11g 中选择更新 ...的区别的主要内容,如果未能解决你的问题,请参考以下文章
安装oracle10g 和oralce11g之后,plsql连接正常。有一个软件需要连接oracle,提示报错ORA-01804: 时区信息
Oracle 10g,和 Oracle 11g 能互相兼容吗?还是向下兼容?