【博客文章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)插入数据:SQL> insert into t_emp2( empid,salary,deptid, last_name, first_name,hire_time_start,hire_time_end) values (100,10000.00, 90, 'King','Steven', to_date('2010-01-01','YYYY-MM-DD'), to_date('2022-01-01','YYYY-MM-DD')); 1 row created. SQL> commit; Commit complete. SQL> insert into t_emp2( empid,salary,deptid, last_name, first_name,hire_time_start,hire_time_end) values (200,10000.00, 90, 'Whalen','Steven', to_date('2011-01-01','YYYY-MM-DD'), to_date('2011-07-01','YYYY-MM-DD')); 1 row created. SQL> commit; Commit complete. SQL> insert into t_emp2( empid,salary,deptid, last_name, first_name,hire_time_start,hire_time_end) values (300,10000.00, 90, 'Kochhar','Neena', to_date('2012-01-01','YYYY-MM-DD'), to_date('2022-01-01','YYYY-MM-DD')); 1 row created. SQL>commit; Commit complete. |
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
|
|