oracle 报错01427,Oracle ORA错误

1、ORA-64203

执行代码:to_char(content)

错误如下:ORA-64203: 目标缓冲区太小, 无法容纳字符集转换之后的 CLOB 数据。

报错原因:在网上查询了一下,应该是由于content字段是clob字段,字符长度超过了char类型的缓冲区最大限制,所以才报错的。

解决方法:通过dbms_lob.substr 函数取出子串,然后通过 || 拼接起来,比如:

select DBMS_LOB.SUBSTR(content,4000,1) ||

DBMS_LOB.SUBSTR(content,4000,4001) ||

DBMS_LOB.SUBSTR(content,4000,8001) ||

DBMS_LOB.SUBSTR(content,4000,12001)

from xxx;

2、ORA-30036

执行代码:存储过程

错误如下:ORA-30036: 无法按8扩展段(在还原表空间‘UNDOTBS’中) 。

报错原因:在网上查询了一下,由于commit之前,存储过程中执行了update、insert等操作产生了大量的undo数据,导致undo表空间没有足够的空间来存储事务所产生的undo数据,才报的这个错误。

解决方法:通过扩展undo表空间的大小,就能解决 这个问题,比如:

alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\UNTOTBS_01.DBF'

resize 2048M;

或者给undo表空间增加文件:

alter tablespace UNDOTBS add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\undo02.dbf'

size 100m reuse;

另外,可以通过如下的语句,来查询undo表空间的使用情况,包括:总的空间大小、以用空间、空闲空间、使用率:

SELECT a.tablespace_name AS tablespace_name ,

to_char(b.total / 1024 / 1024, 999999.99) AS "Total(MB)" ,

to_char(( b.total - a.free ) / 1024 / 1024, 999999.99) AS "Used(MB)" ,

to_char(a.free / 1024 / 1024, 999999.99) AS "Free(MB)" ,

to_char(ROUND(( total - free ) / total, 4) * 100, 999.99) AS Used_Rate

FROM ( SELECT tablespace_name ,

SUM(bytes) free

FROM DBA_FREE_SPACE

GROUP BY tablespace_name

) a

INNER JOIN ( SELECT tablespace_name ,

SUM(bytes) total

FROM DBA_DATA_FILES

GROUP BY tablespace_name

) b

ON a.tablespace_name = b.tablespace_name

WHERE a.tablespace_name = 'UNDOTBS1'

ORDER BY a.tablespace_name;

3、ORA-01762

执行代码:with as 写法

错误如下:ORA-01762 – vopdrv: view query block not in FROM

报错原因:由于with 中定义的查询,在后面没有用到,所以报错了,因为在写语句时,是一段一段写的,每写一段,就运行一段,一开始并没有报错(只运行了最后一段),但是越写越多时就报错了,在oracle 11g r2的环境,感觉是个bug。

解决方法:在最后的语句中用到了所有在with中定义的语句,就不报错了。

4、ORA-00947

执行代码:insert into t select 。。。

错误代码:ORA-00947: Not enough values 没有足够的值

报错原因:在执行insert语句时,目标表的列和 要插入的列,个数不一致。

5、ORA-12535

oracle双机热备模式下,tns为何不能监听虚拟ip?

用netca动态设置监听才可以正常访问数据库,否则会出现ora-12535连接超时的错误。

6、ORA-01427

执行存储过程:PROC_STORE_LONLAT_UPDATE

错误代码:ORA-01427: single-row subquery returns more than one row

报错原因:从字面上就可以看出是在单一行的子查询中,返回了多行,这种情况下就要改为 exists,或者是in,或者是表的关联

7、ORA-12899

执行存储过程:call PROC_A_EXCEPTION

错误代码: ORA-12899: value too large for column "TT"."RPT_A_EXCEPTION"."LAST_ST_NAME" (actual: 228, maximum: 200)

报错原因:是由于表中某个字段的长度不够长,由于默认字符集是utf-8,而每个中文字符占用3个字节,所以超过了200个字节,增加字段长度就可以了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`DatabaseError: ORA-01861: 文字与格式字符串不匹配` 错误通常表示日期时间格式不匹配。在使用 `cx_Oracle` 模块将日期时间数据导入 Oracle 数据库时,需要注意以下几点: 1. 确保日期时间格式与 Oracle 数据库的默认日期时间格式一致。Oracle 数据库的默认日期时间格式为 `YYYY-MM-DD HH24:MI:SS`。如果你使用的日期时间格式不同,需要在 SQL 语句中使用 `TO_DATE` 函数将字符串转换为日期时间类型。例如,如果你的日期时间格式为 `YYYY/MM/DD HH:MI:SS`,可以使用以下 SQL 语句将其转换为 Oracle 默认格式: ```sql TO_DATE('2022/01/20 09:30:00', 'YYYY/MM/DD HH24:MI:SS') ``` 2. 确保使用的日期时间格式与 Python 中的 `datetime` 对象的格式化字符串一致。在使用 `cx_Oracle` 模块将日期时间数据导入 Oracle 数据库时,需要先将 `datetime` 对象转换为字符串,然后再将其插入数据库。转换过程中,需要使用正确的格式化字符串。例如,如果你的日期时间格式为 `YYYY/MM/DD HH:MI:SS`,可以使用以下代码将 `datetime` 对象转换为字符串: ```python import datetime # 创建 datetime 对象 dt = datetime.datetime(2022, 1, 20, 9, 30, 0) # 将 datetime 对象转换为字符串 dt_str = dt.strftime('%Y/%m/%d %H:%M:%S') ``` 然后,将字符串 `dt_str` 插入 Oracle 数据库即可。 如果你的日期时间格式与 Oracle 数据库的默认格式不同,或者你无法确定正确的格式化字符串,可以尝试使用 `TO_DATE` 函数将字符串转换为日期时间类型,例如: ```python import cx_Oracle # 建立连接 connection = cx_Oracle.connect('username/password@host:port/service_name') # 获取游标 cursor = connection.cursor() # 准备 SQL 语句 sql = "INSERT INTO my_table(date_column) VALUES (TO_DATE(:1, 'YYYY/MM/DD HH24:MI:SS'))" # 创建 datetime 对象 dt = datetime.datetime(2022, 1, 20, 9, 30, 0) # 将 datetime 对象转换为字符串 dt_str = dt.strftime('%Y/%m/%d %H:%M:%S') # 执行 SQL 语句 cursor.execute(sql, [dt_str]) # 提交事务 connection.commit() # 关闭游标和连接 cursor.close() connection.close() ``` 注意,以上代码中的 `my_table` 和 `date_column` 需要替换为实际的表名和日期列名,`username`、`password`、`host`、`port` 和 `service_name` 需要替换为实际的数据库连接信息,`YYYY/MM/DD HH24:MI:SS` 需要根据实际日期时间格式进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值