[记录]数据库出错解决

–MySQL问题

1. Operation not allowed after ResultSet closed

自己重构项目优化代码,在数据库工具类DBUtil类中关闭了Connection和PrepareStatement,再使用ResultSet对象赋值return传递结果在另一个文件接收ResultSet结果,系统报错如题。搜索后了解到

Closing aStatement object will close and invalidate any instances of ResultSet producedby that Statement object. The resources held by the ResultSet object may not bereleased until garbage collection runs again, so it is a good practice to explicitlyclose ResultSet objects when they are no longer needed.

关闭statement对象将关闭该语句对象生成的ResultSet的任何实例并使其失效。在垃圾回收再次运行之前,resultset对象所持有的资源可能不会重新分配,因此当不再需要resultset对象时,最好明确地循环这些对象。
因此,如果想让Preparestatement执行结果的ResultSet不失效,就不能先关闭PrepareStatement。需要在提取完ResultSet结果值再关闭。

–Oracle问题

1. ORA-01031: insufficient privileges

意为权限不足,在自己的安装目录下找到oradba.exe并执行即可(1s就执行完了并自动关闭窗口)。我的文件目录是在“‪C:\OracleServer\product\11.2.0\dbhome_1\database\oradba.exe”。
当然网上还有其他方法,我是因为遇到了“ORA-011033: ORACLE initialization or shutdown in progress”,导致不能登录,试了其他方法不行,这个比较适合我我才用的。

2. ORA-01779: cannot modify a column which maps to a non key-preserved table

意为:无法修改与非键值保存表对应的列。
可以检查下自己操作的对象是不是多表视图,就是和多张表有关联。如果是的话,那就是因为多表视图不允许被修改(只和一张表关联的视图是可以被修改的);如果不是,可以网上搜索其他原因。

3. database not open或者ORA-01110: data file 22:

造成原因:在Oracle的表空间路径手动删除表空间文件
解决过程:在删除和当前用户无关的表空间文件后执行SQL,最开始是报错:database not open。之后找到解决办法:通过sqlplus登录sys用户,然后执行alter database open;但是又提示:ORA-01110: data file 22:某文件。因此应该就是自己删除这个文件造成的。恢复表空间文件,回退执行前述步骤就好了。

4. identifier ‘DBMS_SHARED_POOL.PURGE’ must be declared

操作过程:在PL/SQL上执行语句:exec dbms_shared_pool.purge('B8CA070C,3496997491','C'); 报错:identifier ‘DBMS_SHARED_POOL.PURGE’ must be declared。
解决过程:需要安装安装dbmspool.sql脚本,一般在Oracle安装目录\RDBMS\ADMIN下,该脚本要通过Sqlplus执行,PL/SQL不行。
1.打开CMD窗口,执行sqlplus sys/sys用户的密码 as sysdba
2.运行下面命令行:@?/rdbms/admin/dbmspool.sql
完成!

5. sql字段值包含字符&,导致插入总是让你输入值

当我们尝试执行类似SQL:
insert into table_bank(id, name) values(1, ‘中国银行&123’);
在name字段值’中国银行&123’中含有字符’&‘,导致你在插入时总是让你输入值,但是’&‘值又是你所需要的不能删除
这时候可以通过’||‘连接符实现目的,SQL改为
insert into table_bank(id, name) values(1, ‘中国银行’||’&'||‘123’);
OK了!

6. ORA-12899: 列 “CISSBH”.“ACC_INVESTTARGET”.“ACCNO” 的值太大 (实际值: 37, 最大值: 30)

这个乍一看就知道是因为isnert时值超过目标表字段定义长度了, 然后用length(原表字段)>30去查找不符合长度的数据,但是始终过滤不出来。
实际上用length去判断长度就进入了一个误区:length算的是字符长度,如果包含汉字那么也只算做一个字符长度,而Oracle数据库符集是ZHS16GBK,一个汉字占两个字节;因此如果原数据的字段包含多个中文使用length是肯定找不到超长的数据的。
这时候应该使用lengthb,它计算的是字节长度,这样才能过滤出来,以后使用时需要注意。
最后, 觉得文章对你有用的话,给个下面的三连吧(点赞,收藏,打赏) !

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值