- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们有一个很大的现有脚本,可以在我们的客户数据库(的克隆)中删除和重新创建表。我们的客户可能稍微更改了表或索引定义,因此我们的脚本尝试使用 dbms_metadata.get_ddl
的输出来重新创建表,但我们在使用基于函数的索引和时间戳表达式时遇到了问题。模拟客户表的简约示例:
create table t(a timestamp, b timestamp);
create index idx_ta on t (nvl(a, TO_DATE('2010-01-02 03:04:05','YYYY-MM-DD HH24:MI:SS')));
create index idx_tb on t (nvl(b, TO_DATE('2010-01-02 03:04:05','YYYY-MM-DD HH24:MI:SS')));
我们的脚本试图通过处理 dbms_metadata.get_ddl
的输出来查看现有数据库。例如:
select dbms_metadata.get_ddl('INDEX','IDX_TA') from dual;
输出(裁剪):CREATE INDEX "MYUSER"."IDX_TA"ON "MYUSER"."T"(NVL("A",TIMESTAMP' 2010-01-02 03:04:05'))
我们的脚本读取此输出并尝试使用它来重新创建表和索引,如下所示(我将在此处将我们的脚本创建的克隆称为 U 以区分重新创建的版本与原始版本):
create table u(a timestamp, b timestamp);
create index idx_ua on u (nvl(a, TIMESTAMP' 2010-01-02 03:04:05'));
create index idx_ub on u (nvl(b, TIMESTAMP' 2010-01-02 03:04:05'));
idx_ua
创建时没有错误消息,但是 create index idx_ub
失败并显示:
SQL Error: ORA-01882: tidszoneregionen blev ikke fundet
01882. 00000 - "timezone region not found"
一般来说,创建 idx_ua
后一切都会失败,例如 insert into u values (null,null);
失败并显示相同的错误消息。
idx_ua
看起来像这样(来自 get_ddl 的裁剪输出):CREATE INDEX "MYUSER"."IDX_UA"ON "MYUSER"."U"(NVL("A",TIMESTAMP' 2010-01-02 03:04:05,000000000'))
我们尝试执行 alter session set nls_timestamp_tz_format=...
以确保 get_ddl
的输出将使用预定的时间戳格式,但它没有效果。事实上,get_ddl
为不同的索引输出不同的时间戳格式,尽管据我们所知,我们所有的索引都是以相同的方式创建的。我们怀疑这取决于用于创建索引的客户端。这也意味着 get_ddl
的输出在涉及时间戳时基本上是无用的。
我们在 Oracle 11 和 12 上都进行了尝试。此处的示例仅使用 SQL Developer。
我们需要一种(更)可靠的方法来自动删除和重新创建上述表格。使用 get_ddl 的替代方法,调整一些影响 get_ddl 的参数,对包含时间戳的索引运行一些额外的查询 - 完成工作的一切。
最佳答案
作为解决方法,请在应用索引之前执行以下操作。
alter session set NLS_NUMERIC_CHARACTERS = ',.';
该错误由 Oracle 错误 16731148 引起,发生在您创建基于函数的索引(涉及时间戳)而您的 NLS_NUMERIC_CHARACTERS 设置不是“,.”之后。由于 NLS 设置,该错误导致 Oracle 在时间戳表示形式 (TIMESTAMP' 2010-01-02 03:04:05,000000000') 中错误地生成逗号,即使时间戳应该具有独立于 NLS 的语法。 11.2存在该错误,12.2.0.3修复。
如果您的数据库已经损坏,您必须删除相关索引,然后在如上所述设置 NLS_NUMERIC_CHARACTERS 后重新创建它们。如果简单的 select 1 from T
导致 ORA-01882 错误,您可以快速确定表 T 是否有损坏的索引。
关于database - 使用来自 dbms_metadata.get_ddl 的 TIMESTAMP 表达式创建基于函数的索引后出现 ORA-01882,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29772491/
标题基本上说明了一切。 我主要对更新案例感兴趣。假设我们正在尝试更新具有时间戳记字段的记录,并且我们希望将该字段设置为记录更新的时间戳记。有没有办法做到这一点? 最佳答案 经过一些实验,我找到了合适的
我正在学习一门类(class),其中我必须将日期转换为 unix 时间戳。 import pandas as pd df = pd.read_csv('file.csv') print type(df
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
bson.timestamp.Timestamp需要两个参数:time 和 inc。 time 显然是存储在 Timestamp 中的时间值。 什么是公司?它被描述为递增计数器,但它有什么用途呢?它应
2016-08-18 04:52:14 是我从数据库中获取的时间戳,用于跟踪我想从哪里加载更多记录,这些记录小于该时间 这是代码 foreach($explode as $stat){
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我是 Java 新手。我正在使用两个 Timestamp 对象 dateFrom和dateTo 。我想检查是否dateFrom比 dateTo早 45 天。我用这个代码片段来比较这个 if(dateF
在将 panda 对象转换为时间戳时,我遇到了这个奇怪的问题。 Train['date'] 值类似于 01/05/2014,我正在尝试将其转换为 linuxtimestamp。 我的代码: Train
我正在努力让我的代码运行。时间戳似乎有问题。您对我如何更改代码有什么建议吗?我看到之前有人问过这个问题,但没能成功。 这是我在运行代码时遇到的错误:'Timestamp' object has no
我正在尝试运行以下查询: SELECT startDate FROM tests WHERE startDate BETWEEN TIMESTAMP '1555248497'
我正在使用 Athena 查询以 bigInt 格式存储的日期。我想将其转换为友好的时间戳。 我试过了: from_unixtime(timestamp DIV 1000) AS readab
最近进行了一些数据库更改,并且 hibernate 映射出现了一些困惑。 hibernate 映射: ...other fields 成员模型对象: public class Mem
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
我必须在我的数据库中保存 ServerValue.TIMESTAMP 但它必须是一个字符串。当我键入 String.valueOf(ServerValue.TIMESTAMP); 或 ServerVa
在我的程序中,每个表都有一列 last_modified: last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp)
我想将此时间戳对象转换为日期时间此对象是在数据帧上使用 asfreq 后获得的这是最后一个索引 Timestamp('2018-12-01 00:00:00', freq='MS') 想要的输出 2
我有一个包含时间序列传感器数据的大表。大型是指分布在被监控的各个 channel 中的从几千到 10M 的记录。对于某种传感器类型,我需要计算当前读数和上一个读数之间的时间间隔,即找到当前读数之前的最
我是一名优秀的程序员,十分优秀!