Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.date、java.sql.timestamp谓词->;Oracle分区数据类型_Java_Sql_Oracle_Jdbc_Database Partitioning - Fatal编程技术网

java.sql.date、java.sql.timestamp谓词->;Oracle分区数据类型

java.sql.date、java.sql.timestamp谓词->;Oracle分区数据类型,java,sql,oracle,jdbc,database-partitioning,Java,Sql,Oracle,Jdbc,Database Partitioning,您好,我们有一个大型Oracle列对象,我们用数据类型对其进行了分区,该数据类型为日期 其中一个分区如下所示: GCP_P1 TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83 M_DATA01 DISABLED 348132 15214 146 08.06.2014 02:20:40 1078 0 SELECT COUNT(1) FROM AT

您好,我们有一个大型Oracle列对象,我们用数据类型对其进行了分区,该数据类型为日期

其中一个分区如下所示:

GCP_P1  TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83  M_DATA01    DISABLED    348132  15214   146 08.06.2014 02:20:40 1078    0
SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?
preparedStatement.setTimestamp(...); //it does not benefits from partition
每个分区有一周的时间

我们使用jdbc通过瘦客户机运行sql。没有ORM,只有纯jdbc

当分区列的谓词项为java.sql.timestamp时,我们意识到查询不会从分区中受益。但是,当它是java.sql.date类型时,执行计划显示成功的分区访问

例如,我们的sql如下所示:

GCP_P1  TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83  M_DATA01    DISABLED    348132  15214   146 08.06.2014 02:20:40 1078    0
SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?
preparedStatement.setTimestamp(...); //it does not benefits from partition
当我们的java语句为:

preparedStatement.setDate(...); // it benefits from partition
但如果是这样的话:

GCP_P1  TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') 83  M_DATA01    DISABLED    348132  15214   146 08.06.2014 02:20:40 1078    0
SELECT COUNT(1) FROM ATABLE WHERE PARTITIONED_COLUMN > ?
preparedStatement.setTimestamp(...); //it does not benefits from partition
我是从蟾蜍的角度看的。我经历过,当它是java.sql.date时,它在oracle上被解释为日期,当它是java.sql.timestamp时,它被解释为时间戳

我使用下面的sql语句跟踪捕获的jdbc日期类型

SELECT *
  FROM V$SQL_BIND_CAPTURE
WHERE WAS_CAPTURED = 'YES' AND LAST_CAPTURED BETWEEN SYSDATE-1/50 AND SYSDATE
ORDER BY LAST_CAPTURED DESC;

我的问题是你有没有经历过这样的问题?如果是的话,你能告诉我一些文件吗

第8节-映射SQL和Java类型的

因为标准Java类Java.util.Date与以下任何一个 这三种JDBC日期/时间类型完全相同(它包括日期和时间) 时间信息,但没有纳秒),JDBC定义了三个 java.util.Date的子类,以对应于SQL类型。它们是:

java.sql.Date

查询SQL日期信息。时、分、秒、秒 java.util.Date基类的毫秒字段应设置为 零。如果提供给java.sql.Date的毫秒数 构造函数为负,驱动程序将计算日期作为 1970年1月1日之前的毫秒数。否则,日期为 计算为1月1日之后的指定毫秒数, 1970年

java.sql.Time

获取SQL时间信息。年、月、日 java.util.Date基类的字段设置为1970、一月和一月 1.这是Java时代的“零”日期

java.sql.Timestamp

获取SQL时间戳信息。此类通过添加 纳秒场

oracle包含从jdbc类型到oracle数据类型的映射。由于日期数据类型的复杂性,它有一个特定的属性。它有以下说明:

在Oracle Database 11g中,如果在要创建的日期列上有索引 用于SQL查询,然后为了获得更快、更准确的结果,您可以 必须按以下方式使用setObject方法:


虽然这是关于jdbc类型的好信息,但对于Oracle日期类型的细节以及如何将其映射到jdbc类型没有帮助。由于这是一个实现细节,因此不需要写下如何实现的内容。要使用Oracle日期类型的细节,您应该退出JavaAPI,使用
Oracle.sql
包。IMHO这里不是这种情况,因为这是在驱动程序内部完成的。这里几乎可以肯定的是,正在处理的列是Oracle日期类型。通过使用标准的jdbc setTimestamp方法,oracle进行了秘密铸造。要获得所需的行为(能够利用索引或分区),必须处理oracle.sql.DATE ojdbc对象。但这是由映射指定的。如果您使用
java.sql.Date
将使用Date,从另一方面来说,当您使用
java.sql.Timestamp
时,将使用
TIMESTAP
但如果您在
Date
列上使用setTimestamp。JDBC在
oracle.sql.Timestap
的实例上创建并传递它。因为
时间戳
宽4字节(纳秒)。在准备执行计划期间,引擎无法找到类型
TIMESTAP
的索引,因此它将不使用它。这意味着决策是在数据库级别而不是jdbc上进行的。结论用户应该确保从API调用有效的方法,正确性基于发布的映射。另一种方法是将参数直接传递给语句,正如您在回答中所描述的那样。但是我们仍然必须知道类型是DB,如果我们使用
oracle.sql.DATE
我们将成功,但是如果我们使用
oracle.sql.TIMESTAP
我们将以OP相同的方式失败。