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
相关产品推荐
相关产品推荐

