You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle unified_audit_trail的SQL_TEXT字段字符串拼接失效问题咨询

问题根因

导致拼接后<CLOSE>标识不显示的核心原因是 unified_audit_trail 视图的 SQL_TEXT 字段末尾默认会追加 ASCII 0(空字符/NULL字符)。这类字符会被Oracle的dbms_output组件以及绝大多数文本处理工具识别为字符串终止符,因此空字符之后的所有内容(包括你追加的<CLOSE>)都不会被渲染展示,并非拼接逻辑本身失效。
你可以将拼接后的v_SP_record写入一张测试表的CLOB字段后用DUMP函数查看内容,即可验证<CLOSE>实际已经被成功拼接,仅输出阶段被截断。

修复方案

方案1:直接清除SQL_TEXT中的空字符(推荐)

使用REPLACE函数移除SQL_TEXT中的所有ASCII 0字符即可正常显示后续拼接内容,修改后的代码如下:

declare 
v_SP_record         clob;
cursor c1 is select * from unified_audit_trail
where sql_text is not null
order by event_timestamp;

begin
  
for rec in c1 loop
v_SP_record := 
'USER: '   || rec.dbusername || ' '  
|| 'TIME: '   || to_char(rec.event_timestamp) || ' ' 
|| 'SQL_TEXT: '  || replace(rec.sql_text, chr(0))  || '<CLOSE>' ;
dbms_output.put_line(v_SP_record);
end loop;
  
end;

如果需要同时清理其他不可见控制字符,可以使用正则表达式批量过滤:

-- 过滤所有ASCII码小于32的控制字符
regexp_replace(rec.sql_text, '['||chr(0)||'-'||chr(31)||']', '')

方案2:仅移除末尾的空字符

如果确认空字符只会出现在SQL_TEXT的末尾,也可以用RTRIM做定向清理,性能更高:

rtrim(rec.sql_text, chr(0))

内容的提问来源于stack exchange,提问作者altink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:54:04