我们的dev dbs中有一个有趣的行为。
有人建立一个新视图并将其与旧视图进行比较,并使用类似
的语句select * from old_view where id=1234
union
select * from new_view where id=1234;
它显示了一个值的差异,但如果你单独执行它们,它们会显示相同的值。 所以,我查看了old_view,它看起来像这样:
select some_function() as a,
some_value as b,
to_char(some_date, 'YYYYMMDD') as c,
DECODE (funny_table.funny_field, 0, '01', '12') AS D, --that's the funny value
null as e,
some_value as f
from some_view a
LEFT OUTER JOIN some_table
ON something
LEFT OUTER JOIN funny_table ON something
LEFT OUTER JOIN some_table ON something;
现在,它又变得奇怪了。如果我执行此操作,使用where子句中的id,它可以正常工作。如果我在select-part的末尾添加funny_table.funny_field
,它会显示错误的值(0而不是1),并且解码也会显示错误的值。
当我选择funny_table时,它似乎也很好。
我试过
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;
没有改变任何内容,DBMS_REPAIR.CHECK_OBJECT
也没有显示任何错误。
有什么建议吗?