ORA-06512: at "SYS.XMLTYPE" 问题记录

本文介绍了一个在Oracle 11.2.0.4版本中执行SQL语句时遇到的ORA-27163内存溢出错误。通过设置特定事件'SYS.XMLTYPE',成功解决了XML类型数据处理时的内存不足问题。

执行SQL报错:

SQL> 
SELECT COUNT(cl.enable_flg) FROM cont_ledger cl 
 INNER JOIN project_project pp ON cl.project_cd=pp.org_cd
  INNER JOIN res_approve_info rai ON rai.res_approve_info_id=cl.res_approve_id
   INNER JOIN res_approve_content rac ON rac.res_approve_info_id=rai.res_approve_info_id
  WHERE cl.enable_flg='1'  AND pp.is_virtual='0'
  AND cl.created_date>to_date('2016-01-01','yyyy-mm-dd')
  AND cl.created_date<to_date('2017-01-01','yyyy-mm-dd')
  8     AND EXTRACTVALUE(xmltype(rac.approve_content), '/templet/content/isMonopoly') ='true';
   AND EXTRACTVALUE(xmltype(rac.approve_content), '/templet/content/isMonopoly') ='true'
                    *
ERROR at line 8:
ORA-27163: out of memory
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1


select count(cl.cont_ledger_id) from cont_ledger cl 
 inner join project_project pp on cl.project_cd=pp.org_cd
  inner join res_approve_info rai on rai.res_approve_info_id=cl.res_approve_id
   inner join res_approve_content rac on rac.res_approve_info_id=rai.res_approve_info_id
  where cl.enable_flg='1'  and pp.is_virtual='0'
  and cl.created_date>to_date('2016-01-01','yyyy-mm-dd')
  and cl.created_date<to_date('2017-01-01','yyyy-mm-dd')
  8     and extractvalue(xmltype(rac.approve_content), '/templet/content/isMonopoly') ='true';
   and extractvalue(xmltype(rac.approve_content), '/templet/content/isMonopoly') ='true'
                    *
ERROR at line 8:
ORA-27163: out of memory
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1


google到解决办法,说是11.2.0.4的一个小bug,需要设置一个事件才能避免

SQL> ALTER SESSION SET EVENTS '31156 trace name context forever, level 0x400';

Session altered.

SQL> 

OK,可以执行成功了,如下所示:

SQL> 
select count(cl.cont_ledger_id) from cont_ledger cl 
 inner join project_project pp on cl.project_cd=pp.org_cd
  inner join res_approve_info rai on rai.res_approve_info_id=cl.res_approve_id
   inner join res_approve_content rac on rac.res_approve_info_id=rai.res_approve_info_id
  where cl.enable_flg='1'  and pp.is_virtual='0'
  and cl.created_date>to_date('2016-01-01','yyyy-mm-dd')
  and cl.created_date<to_date('2017-01-01','yyyy-mm-dd')
  8     and extractvalue(xmltype(rac.approve_content), '/templet/content/isMonopoly') ='true';

COUNT(CL.CONT_LEDGER_ID)
------------------------
		    1091

SQL> 
### ORA-06512错误在使用sqlplus执行脚本时的解决方法及与SYS.UTL_FILE相关的日志文件保存位置 ORA-06512错误通常与PL/SQL程序中的堆栈跟踪信息相关,表示错误发生的程序单元和行号。当使用 `SYS.UTL_FILE` 包进行文件操作时,如果发生错误(如目录权限问题、文件路径不存在、文件无法写入等),ORA-06512会指示错误的具体位置。这种错误本身不会提供具体的文件操作失败原因,因此需要结合其他错误信息(如ORA-29283、ORA-29285等)进行分析。 在使用 `sqlplus` 执行脚本时,若调用了 `SYS.UTL_FILE` 包进行日志写入,日志文件的保存位置由 `UTL_FILE_DIR` 参数或 Oracle 目录对象(`CREATE OR REPLACE DIRECTORY`)定义。通常情况下,这些日志文件存储在数据库服务器的文件系统中,路径由数据库管理员指定。例如: ```sql CREATE OR REPLACE DIRECTORY log_dir AS '/u01/app/oracle/logs'; ``` 在 PL/SQL 代码中使用 `UTL_FILE.FOPEN('LOG_DIR', 'my_log_file.log', 'w')` 打开文件时,日志文件将被写入 `/u01/app/oracle/logs` 目录下。确保该目录存在且 Oracle 用户具有读写权限是避免 ORA-29283 和 ORA-06512 错误的关键条件之一。 处理 ORA-06512 错误时,应首先检查以下方面: - **文件路径是否存在**:确认 `UTL_FILE_DIR` 或目录对象指向的路径在数据库服务器上真实存在。 - **权限设置是否正确**:确保 Oracle 用户对目标目录具有读写权限。 - **文件是否已打开或被其他进程占用**:避免在多个会话中同时写入同一个文件。 - **文件大小限制**:检查文件系统是否已满或达到文件大小限制。 - **日志文件命名是否唯一**:避免因重复使用相同文件名导致文件写入失败。 例如,以下 PL/SQL 脚本展示了如何安全地使用 `UTL_FILE` 包并捕获异常: ```sql DECLARE file_handle UTL_FILE.FILE_TYPE; BEGIN file_handle := UTL_FILE.FOPEN('LOG_DIR', 'test.log', 'w'); UTL_FILE.PUT_LINE(file_handle, 'This is a test log entry.'); UTL_FILE.FCLOSE(file_handle); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error occurred: ' || SQLERRM); IF UTL_FILE.IS_OPEN(file_handle) THEN UTL_FILE.FCLOSE(file_handle); END IF; RAISE; END; ``` 在执行 `sqlplus` 脚本时,建议将 PL/SQL 块封装在异常处理结构中,以确保错误能够被捕获并输出到控制台或日志文件中。若脚本中涉及文件操作,应确保 `UTL_FILE` 所依赖的目录对象配置正确,且路径可访问。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值