2010-04-29 88 views
4

的......更新我發現,Oracle數據庫10g和11g區別對待下面的PL/SQL塊(我用SCOTT模式爲方便起見):差異選擇在Oracle數據庫10g和11g

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中的這個錯誤呢?有什麼想法嗎?

回答

0

有一個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; 
+0

我試着和非ANSI語法按預期工作。因此,他們似乎修復了你提到的錯誤,但引入了另一個錯誤。 :-) – sax 2010-04-30 04:42:27