Я испытал эту ошибку в прошлом в различных экземплярах Oracle 11g. На самом деле, нет доступа лично к поддержке Oracle, чтобы узнать, является ли проблема идентифицированной/разрешенной.Ошибка Oracle при добавлении столбцов с нулевым значением по умолчанию
Ошибка приводит к тому, что запрос всегда возвращает значение по умолчанию для столбца, даже если запись имеет другое значение.
Он проявляется только в определенных запросах, и это вызвано добавлением столбца с недействительными значениями по умолчанию в ранее существовавшей таблице с использованием одного предложения о добавлении.
Подробнее см. Ниже.
DROP TABLE testBugMain;
DROP TABLE testBugAdditional;
-- Create two tables related to one another through real or apparent FK.
CREATE TABLE testBugMain (
mainid NUMBER(1) NOT NULL,
str VARCHAR(200) NULL,
CONSTRAINT PK_testBugMain PRIMARY KEY (mainid)
);
CREATE TABLE testBugAdditional (
additionalid NUMBER(1) NOT NULL,
mainid NUMBER(1) NOT NULL,
CONSTRAINT PK_testBugAdditional PRIMARY KEY (additionalid)
);
-- Insert a couple of values on both.
INSERT INTO testBugMain (mainid, str) VALUES (1, 'test-with-1');
INSERT INTO testBugMain (mainid, str) VALUES (2, 'test-with-2');
INSERT INTO testBugMain (mainid, str) VALUES (3, 'test-with-3');
INSERT INTO testBugAdditional (additionalid, mainid) VALUES (1, 1);
INSERT INTO testBugAdditional (additionalid, mainid) VALUES (2, 2);
INSERT INTO testBugAdditional (additionalid, mainid) VALUES (3, 3);
-- Required for bug to manifest: add a new column, NOT NULL, with DEFAULT value (5 in this case).
-- It needs to be added through an ALTER and both DEFAULT and NOT NULL in the same sentence for the bug to manifest.
ALTER TABLE testBugAdditional ADD bug NUMBER(1) DEFAULT 5 NOT NULL;
-- Update the value on the column, so the query below should return these values instead of 5's.
UPDATE testBugAdditional SET bug = 1 WHERE mainid = 1;
UPDATE testBugAdditional SET bug = 2 WHERE mainid = 2;
UPDATE testBugAdditional SET bug = 3 WHERE mainid = 3;
-- Sanity check (returned values are correct).
SELECT ma.mainid, ma.str, ad.bug FROM testBugMain ma INNER JOIN testBugAdditional ad ON ma.mainid = ad.mainid;
-- Insanity check (returned values are default values).
SELECT mainid, str, bug FROM
(
SELECT ma.mainid, ma.str, ad.bug FROM testBugMain ma
LEFT JOIN -- Required for bug to manifest (left join).
testBugAdditional ad ON ma.mainid = ad.mainid
ORDER BY ma.mainid ASC -- Required for bug to manifest (any order by, perhaps?).
)
WHERE rownum < 6 -- Required for bug to manifest (pagination);
Хотя запрос обнажая ошибку кажется несколько запутанными, я полагаю, на самом деле не что странно иметь упорядоченный, постраничный запрос с левыми присоединяются (и, учитывая все обстоятельства, имеющий манифеста ошибку редко, вероятно, хуже) ,
Вопросы
Является ли это идентифицированный/решен вопрос с помощью Oracle?
Есть ли способы обхода проблемы?
Возникли вопросы? – BobC
У вас есть номер ошибки? Если это так, я могу узнать, было ли исправлено исправление. – BobC
Хороший вопрос, я как бы предполагал, что вопросы были неявными, но теперь добавили их непосредственно к деталям. Часть этого (обходной путь) я ответил сам, чтобы получить знания. –