oracle 数据库查询操作时出错 1455,请帮助!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 数据库查询操作时出错 1455,请帮助!相关的知识,希望对你有一定的参考价值。

在程序中获取某单位的8月交易金额,金额单位为分即1元表示为100
select sum(count_num),sum(sum_amount),sum(unique_num) from T_SNCHARGE_DAYTRANS_SUM
where plat_date >= '20130801' and plat_date <= '20130831' and lflag = 1
and busi_no = '1301'
and tran_req_brch='33006300'
直接sql得到的结果如下
SUM(COUNT_NUM) SUM(SUM_AMOUNT) SUM(UNIQUE_NUM)
-------------- --------------- ---------------
182416 4342303411 181798
但是在程序中执行时,当金额SUM(SUM_AMOUNT)值大于2147483648(2^31)时,程序出现如下oracle错误
01455, 00000, "converting column overflows integer datatype"
// *Cause:
// *Action:
求高手解答!谢谢!问题解决了追加50分

这个提示的意思是转换失败,不一定是这一列数据的问题,可以做如下检查:
1、是否其他两列存在异常数据?查询条件中是否有需要转换的数据,或者查询的数据中存在异常数据。这个先要检查一下。
2、找到一些SUM之后超过2147483648(2^31)的数据,看是否也报错;
3、在PLSQL中执行一下SQL,如果PL/SQL中报错,肯定是数据中有问题了,SUM函数不会限制这个数据的大小,至少不会限制在2147483648(2^31)。
4、如果实在程序中使用的SQL,检查一下接收查询结果的变量定义,如果这个变量定义的有问题,那么可能也会报这个错误的。
5、来源数据表T_SNCHARGE_DAYTRANS_SUM是否是视图,如果是视图,检查一下该视图定义。
6、检查一下是否有字段定义不是number类型,Oracle默认数学运算的时候自动转换非NUMBER型数据为NUMBER类型。
具体情况可以再探讨,希望对你解决问题有帮助。
参考技术A 1. 通过dba_tables 和 dba_indexes 来查看对应表的值。 即num_rows值,看是否超过了2^31-1。

如果表的numrows超过了,可以手工的修改表的这个值,如:
SQL> execute sys.dbms_stats.set_table_stats( 'SCOTT', 'EMP', numrows => 1000000000000);
该命令格式:
DBMS_STATS.SET_TABLE_STATS(<owner>, <table_name>, <statistic_field> => <new lower value>)
2. 删除对应的统计信息
表:
SQL>ANALYZE TABLE <table_name> DELETE STATISTICS
索引:
SQL>ANALYZE INDEX <index_name> DELETE STATISTICS
或者使用:
execute sys.dbms_stats.delete_index_stats(ownname => 'scott', indname => 'my_indx_1');
execute dbms_stats.delete_table_stats(ownname => 'scott', tabname=>'table_name')
参考技术B 1.select sum(count_num),sum(sum_amount/10000),sum(unique_num) from ...
结果出来以后再乘上10000
2.select sum(count_num),cast(sum(sum_amount/10000) as number(32,2)),sum(unique_num) from ...
用cast转换一下数据类型
试试吧~追问

你说的第一种我试过了,有一些客观原因不能使用,
至于第二种 忘记说了,我的sum_amount字段为number(20,2)应该不是字段长度和类型的问题

我想试试to_char()这个试试,但是我的环境是32位的linux,long=atol(str)可能又会遇到2^31的问题。

追答

还是用cast把,cast(sum(sum_amount/10000) as float)

本回答被提问者采纳

平时使用oracle时,为啥会锁表

数据库事务及隔离级别

隔离级别:脏读、幻读、一致读、不可重复读、更新丢失

1.脏读(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚

2.幻读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的

3.不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交

4.两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效

5.更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开

20、锁是什么?

锁:在所有的DBMS(数据库管理系统)中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

锁分为行级锁和表锁。

行级锁:主要是在执行操作过程中,锁定指定的行。

主要的锁行语句有:insert ,update,delete ,及select ....for update。

表锁:指在运行操作指令过程中,由用户指定锁定某张表。lock table XXX in mode share;

共享锁,排他锁,共享排它,行共享,行排他。

锁模式包括?

共享锁:(读取)操作创建的锁。其他用户可以并发读取数据,但任何事物都不能获取数据上的排它锁,直到已释放所有共享锁。

排他锁(X锁):对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

更新锁:更新 (U) 锁可以防止通常形式的死锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则两个事务需都要转换共享锁为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。

若要避免这种潜 在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。

锁的粒度主要有以下几种类型:

行锁: 粒度最小,并发性最高

页锁:一次锁定一页。25个行锁可升级为一个页锁。

表锁:粒度大,并发性低

数据库锁:控制整个数据库操作

乐观锁:乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。一般的实现乐观锁的方式就是记录数据版本。

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁。

20、数据库的乐观锁和悲观锁是什么? oracle 是行级锁

数据库管理系统(DBMS)中,并发控制的任务是:确保在多个事务同时存取同一数据时,不破坏事务的隔离性和统一性以及数据库的统一性。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

21、悲观锁和乐观锁的区别,怎么实现

悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。

乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作。
参考技术A 简单地说,锁是为了保证数据的一致性,锁不止存在于oracle,其他数据库一样有,只不过机制上可能大相径庭。

至于什么样的操作会锁表,其实锁的种类很多,你所说的锁表大概说的是行级锁——也就是事务锁吧。比如一个update语句,被update的行上会有锁——能阻塞其他事务对这些行进行修改的锁,虽然这时候这张表上也有表级锁,但这个表级锁并不影响其他事务对表中的其他行进行修改,只是会阻碍对这张表的DDL操作。

以上是关于oracle 数据库查询操作时出错 1455,请帮助!的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库并行查询出错的解决方法

oracle定时任务(dbms_job)

执行 Oracle Ad Hoc 查询时绑定参数出错; ORA-00907: 缺少右括号

写入控制文件时出错 ORA-00221 oracle

使用 sqoop 从 Oracle 获取数据到 hive 时出错

映射数据类型 Oracle 和 C# 时出错