Разница в выборе для обновления ... в Oracle Database 10g и 11g - PullRequest
4 голосов
/ 29 апреля 2010

Я обнаружил, что Oracle Database 10g и 11g по-разному относятся к следующему блоку PL / SQL (для удобства я использую схему Скотта):

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? Есть мысли?

Ответы [ 2 ]

2 голосов
/ 18 июля 2012

Это ошибка в Oracle 11G. Это было исправлено в версии 11.2.0.2. Это обсуждалось в этой теме: https://forums.oracle.com/forums/thread.jspa?threadID=2314477

0 голосов
/ 30 апреля 2010

В Oracle 10g была ошибка , которая была исправлена ​​в 11g, когда столбец ORA-00918 с неопределенным определением не вызывался, когда должен был. Хотя я не уверен, относится ли это к вашему, потому что вы указали все псевдонимы.

Установлены ли отношения по внешнему ключу в bonus.ename -> emp.ename?

Вы пытались использовать не-ANSI синтаксис соединения, например ::10000

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;
...