Bo's Oracle Station

【博客文章2024】Oracle Database 23ai:19c时用period for来实现自动添加where条件时,返回数据可能不正确的Bug已经去除

2024-12-9 09:43| 发布者: admin| 查看: 24| 评论: 0

摘要: 在实践中发现在Oracle Database 19c(19.3.0)中,随机性地存在temporal validity方面返回数据可能不正确的问题。本人曾经向Oracle公司的数据库产品经理Martin Bach报告过这个现象。Oracle公司的数据库产品经理团队认为这种现象会在更高的版本中消失。我们使用Oracle Cloud and Engineered Systems Version 23.5.0.24.07在相同的环境下反复实验,发现返回数据都已经正确。
【博客文章2024】Oracle Database 23ai:19c时用period for来实现自动添加where条件时,返回数据可能不正确的问题已经不存在


Author: Bo Tang

    在实践中发现在Oracle Database 19c(19.3.0)中,随机性地存在temporal validity方面返回数据可能不正确的问题。本人曾经向Oracle公司的数据库产品经理Martin Bach报告过这个现象。Oracle公司的数据库产品经理团队认为这种现象会在更高的版本中消失。我们使用Oracle Cloud and Engineered Systems Version 23.5.0.24.07在相同的环境下反复实验,发现返回数据都已经正确。

1. 返回数据可能不正确的实验环境:

    1)创建表:

SQL> CREATE TABLE t_emp2
 ( empid number, salary number, deptid number,
 last_name VARCHAR2(20), first_name varchar2(20),

 PERIOD FOR hire_time);
Table created.
 
    2)插入数据:
2. 19c时可能会出现的现象描述:

    1)以下返回数据可能不正确的现象只有在SQLPLUS环境下出现,在SQLDEVELOPER环境下不会出现:     

SQL> select  * from t_emp2 as of period for hire_time to_date('2010-01-01','YYYY-MM-DD');
EMPID     SALARY     DEPTID LAST_NAME            FIRST_NAME
---------- ---------- ---------- -------------------- --------------------
no rows selected.

    以上的查询是希望显示2010-01-01存在的员工(有效时间里的数据),相当于select  * from t_emp2 where hire_time_start <=  to_date('2010-01-01','YYYY-MM-DD') and hire_time_end >  to_date('2010-01-01','YYYY-MM-DD'),应该返回empid为100的员工而没有返回。但是,有趣的是:使用SQLDEVELOPER连接相同的19c数据库,却能返回1行数据(empid为100的这行数据)。
    2)以下返回数据可能不正确的现象只有在SQLPLUS环境下出现,在SQLDEVELOPER环境下不会出现:

SQL> select  * from t_emp2 as of period for hire_time  to_date('2011-01-01','YYYY-MM-DD');
EMPID     SALARY     DEPTID LAST_NAME            FIRST_NAME
---------- ---------- ---------- -------------------- --------------------
100    10000    90    King    Steven    

    以上的查询是希望显示2011-01-01存在员工(有效时间里的数据),相当于select  * from t_emp2 where hire_time_start <=  to_date('2011-01-01','YYYY-MM-DD') and hire_time_end >  to_date('2011-01-01','YYYY-MM-DD'),应该返回empid为100和200的员工而200没有返回。但是,有趣的是:使用SQLDEVELOPER连接相同的19c数据库,却能返回2行数据。

3. 23ai时返回数据可能不正确的问题已经不存在

    1)在SQLPLUS环境下     

[oracle@station1 admin]$ sqlplus /nolog

SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Mon Dec 9 05:15:08 2024
Version 23.5.0.24.07

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

SQL> select  * from t_emp2 as of period for hire_time to_date('2010-01-01','YYYY-MM-DD');

EMPID     SALARY     DEPTID LAST_NAME            FIRST_NAME

---------- ---------- ---------- -------------------- --------------------

100    10000    90    King    Steven    

  
    2)在SQLPLUS环境下

[oracle@station1 admin]$ sqlplus /nolog

SQL*Plus: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Mon Dec 9 05:15:08 2024
Version 23.5.0.24.07

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

SQL> select  * from t_emp2 as of period for hire_time  to_date('2011-01-01','YYYY-MM-DD');

EMPID     SALARY     DEPTID LAST_NAME            FIRST_NAME
---------- ---------- ---------- -------------------- --------------------

100    10000    90    King    Steven    
200    10000    90    Whalen    Steven   




 

路过

雷人

握手

鲜花

鸡蛋

QQ|手机版|Bo's Oracle Station   

GMT+8, 2024-12-9 14:42 , Processed in 0.029873 second(s), 21 queries .

返回顶部