暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 读取AUD $ 时,ORA-22835缓冲区太小,CLOB无法CHAR或BLOB转换为RAW

ASKTOM 2018-11-28
1950

问题描述

你好,汤姆,
我正在尝试从AUD $ 中读取sqltext。但是,我跳过了32k,而sql给了我一个ORA错误。ORA-22835缓冲液太小,使CLOB无法CHAR或BLOB转换为RAW (实际4664,最大4000)。Sql是:

选择TO_CHAR(NTIMESTAMP #,'dd-MM-YYYY HH24:MI:SS.FF3 ') 作为扩展 _timestamp,
会话id,
用户id,
用户主机,
进程 # 作为事务id,
OBJ $ CREATOR作为OBJECT_SCHEMA,
OBJ $ 名称为OBJECT_NAME,
CAST(SQLTEXT AS VARCHAR2(1000)) SQLTEXT
从系统。澳元
按1订购;

感谢您的期待
最佳规则
安托万



更多说明:

SYS.AUD $.SQLTEXT是一个CLOB包含15573的最大长度,在varchar2中读取它太多了。现在,我们需要将数据从AUD $ 传递到内部审核,每当达到varchar2可以容纳的最大长度时,我们都会遇到障碍。我们需要完整地提取CLOB列sqltext的内容,并传递给内部审核。那是在一个螺母壳中,我们需要从sys.aud $ 中获取数据,包括整个sqltext列。

非常感谢
安托万

专家解答

“传递给内部审核” 是这里的关键-就您通过它所使用的内容而言。

如果你可以传递一个clob,这是最好的方法,即不需要强制转换sqltext列-你只需传递它。

如果您 * 不能 * 传递clob并且只能传递varchar2,那么您可能需要将列分成多个部分并分别传递它们,例如

(我在这里使用V $ SQL代替sys.aud $)

with data as 
 ( select sql_fulltext, dbms_lob.getlength(sql_fulltext) len from v$sql )
select
  dbms_lob.substr(sql_fulltext,4000,1) piece1,
  case when len > 4000 then dbms_lob.substr(sql_fulltext,4000,4001) end piece2,
  case when len > 8000 then dbms_lob.substr(sql_fulltext,4000,8001) end piece3,
  case when len > 12000 then dbms_lob.substr(sql_fulltext,4000,12001) end piece4,
  case when len > 16000 then dbms_lob.substr(sql_fulltext,4000,165001) end piece5
from data


文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论