你的位置:首页 > 数据库

[数据库]SQL 报错信息整理及解决方案(持续更新)


整理一下自己遇见过的 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 Plusstartup //启动ORACLE

      最后附上关闭ORACLE的命令说明,以免造成错误的关闭操作:

      • shutdown normal(所有连接断开后关闭数据库)
      • shutdown transactional(所有事务结束后主动断开连接,并关闭数据库)
      • shutdown immediate(主动断开连接和事务)
      • shutdown abort(立即关闭数据库,由于该操作不会同步数据,清空回滚段,不触发检查点,所以比较危险,每次启动需要实例恢复)
  • 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;