整理一下自己遇见过的 SQL 各种报错信息及相应解决方法,方便以后查阅,主要平台为 Oracle:
-
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值:
- 原因:插入操作时,数据大于字段设定大小,Oracle 会自动将数据转为 long 型,然后报插入失败错误。
- 解决:更改数据大小,或者将字段设为 clob 或 blob 类型。
-
"ORA-01012: not logged on" 以及 "Connected to an idle instance":
- 原因:重启 Oracle 服务器时,如果在运行 shutdown 指令关闭数据库的时候意外断开连接,后面想再次进入 Oracle 服务器启动时便可能会遇见如下报错:
- 使用
sqlplus /nolog
进入 SQL Plus 后,想连接数据库conn username/password as sysdba
时,会报Connected to an idle instance.
错误。 - 在 SQL Plus 界面,想直接
startup
启动数据库时,会报ORA-01012: not logged on
错误。
通过查阅资料,判断报错原因是在关闭数据库意外退出后,ORACLE一直处于锁定状态,不再允许其他操作。
- 使用
- 解决:
-
先关闭ORACLE进程:
ps -ef|grep ora_dbw0_$ORACLE_SID //找到ORACLE进程
kill -9 PID //通过找到的进程PID号kill掉该进程 -
然后重启ORACLE:
sqlplus /nolog //进入SQL Plus
startup //启动ORACLE
最后附上关闭ORACLE的命令说明,以免造成错误的关闭操作:
- shutdown normal(所有连接断开后关闭数据库)
- shutdown transactional(所有事务结束后主动断开连接,并关闭数据库)
- shutdown immediate(主动断开连接和事务)
- shutdown abort(立即关闭数据库,由于该操作不会同步数据,清空回滚段,不触发检查点,所以比较危险,每次启动需要实例恢复)
-
- 原因:重启 Oracle 服务器时,如果在运行 shutdown 指令关闭数据库的时候意外断开连接,后面想再次进入 Oracle 服务器启动时便可能会遇见如下报错:
-
ORA-00913: 值过多:
- 原因:向表中插入数据时字段个数不匹配,例如
insert into table_1 (?, ?) values (?, ?, ?)
插入值比字段多了一个,则会报该错误
- 解决:插入字段与插入值修改为个数一致就可以解决了
- 原因:向表中插入数据时字段个数不匹配,例如
-
ORA-01791:不是SELECTed表达式错误:
- 原因:用 select 查询语句时,若同时使用distinct去重与order by排序,就会报该错误,如
select distinct a from table1 where ... order by b;
这是因为 order by 根据 b 列排序时与 distinct 产生冲突,distinct 找不到 b 列。
- 解决:查询列中添加b列,即:
select distinct a,b from table1 where ... order by b;
- 原因:用 select 查询语句时,若同时使用distinct去重与order by排序,就会报该错误,如