oracle varchar数据分析

针对存储日志监控存在的问题,本文介绍了通过创建临时表和数据处理来解决监控存储运行情况的方法。首先,找到所有需要监控的存储并放入临时表,接着查找正常监控的存储并存入临时表2。在处理过程中,发现由于VARCHAR类型数据可能包含换行符等特殊字符导致长度不一致,通过使用REPLACE函数替换ASCII换行符并重新比对,最终找到异常存储并进行修正,确保监控日志的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

     存储日志监控无法监控存储运行情况

     原因:监控日志和存储名对应,需要修改存储日志

   实现原理:

     存储定时任务-在存储中插入存储日志表,对该存储进行运行监控。

  OUT_ERROR_ID  := 0;
  OUT_ERROR_MSG := '成功';
INSERT INTO [存储监控表]
  VALUES
    (SEQ_AUTO_TASK_MONITOR.NEXTVAL,
     '[存储过程名]',
     SYSDATE,
     'IN',
     '1',
     '运行成功',
     '{存储结果表名}',
     ''||[结果表数据量]||'');
  COMMIT;
EXCEPTION  --异常捕获
  WHEN OTHERS THEN
    ROLLBACK;
    OUT_ERROR_ID  := -1;
    OUT_ERROR_MSG := OUT_ERROR_MSG || SQLCODE || ':' || SQLERRM;
    LC_ERROR_CODE := SQLCODE;
    LC_ERROR_MSG  := 'err' || '->>' || LC_ERROR_CODE || '->>' ||
                     SUBSTR(SQLERRM, 1, 200);
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(LC_ERROR_CODE) || ':' || LC_ERROR_MSG);
        INSERT [存储监控表]
    VALUES
      (SEQ_AUTO_TASK_MONITOR.NEXTVAL,
       '[存储过程名]',
       SYSDATE,
       'DD',
       '2',
       LC_ERROR_MSG,--异常描述
       '{存储结果表名}',
     ''||[结果表数据量]||'');

解决思路:

 

实现:

1.找到全部需要监控的存储并且放入临时表中

----找到全部需要监控的存储并且放入临时表中
CREATE table tmp_1_315 as 
SELECT/*+parallel(8)*/ DISTINCT(a.name) FROM USER_SOURCE a WHERE a.type='PROCEDURE' and a.name like '%BSS30%'

2.找到正常监控的存储放入临时表2中

  2.1目标格式

  2.2查找正常存储

 SELECT/*+parallel(8)*/ ''''||'test'||''',' 格式化测试 FROM  dual

查询:

无结果集返回

原因:考虑存在空格将空格替换

replace(upper(a.TEXT),' ',null)

依然没有结果返回将格式化后的数据拿出来比对一下

 SELECT /*+parallel(8)*/
   replace(a.TEXT,' ',null)
  FROM USER_SOURCE a
 WHERE a.TYPE = 'PROCEDURE'
 and   a.name = 'P_GFX_RPT_JH_JBHB_DAY_BSS30'
 and a.line=521 
 UNION all
  SELECT /*+parallel(8)*/
   ''''||a.name||''','
  FROM USER_SOURCE a
 WHERE a.TYPE = 'PROCEDURE'
 and   a.name = 'P_GFX_RPT_JH_JBHB_DAY_BSS30'
 and a.line=521

执行结果:

看着相同,使用length函数看看字符串长度

 
 SELECT /*+parallel(8)*/
   length(replace(a.TEXT,' ',null))
  FROM USER_SOURCE a
 WHERE a.TYPE = 'PROCEDURE'
 and   a.name = 'P_GFX_RPT_JH_JBHB_DAY_BSS30'
 and a.line=521 
 UNION all
  SELECT /*+parallel(8)*/
  length( ''''||a.name||''',')
  FROM USER_SOURCE a
 WHERE a.TYPE = 'PROCEDURE'
 and   a.name = 'P_GFX_RPT_JH_JBHB_DAY_BSS30'
 and a.line=521

执行结果

字符串长度不相同 考虑USER_SOURCE中TEXT含有换行符,使用replace替换

ascii换行符:chr(10)

length(replace(replace(a.TEXT,' ',null),chr(10),null))

替换后比对

长度一致

重新查找正常存储

 SELECT/*+parallel(8)*/ 
 DISTINCT(a.name)
 FROM 
 USER_SOURCE a
 WHERE a.TYPE = 'PROCEDURE'
 and  a.name like '%BSS30%'
 and  replace(replace(upper(a.TEXT),' ',null),chr(10),null)=''''||upper(a.name)||''',';

执行结果:

创建临时表二

create table  xxx as   .....

3比较两个临时表找出异常稽核监控

select name from tmp_1_315 WHERE name not in  (select * from tmp_2_315)

执行结果

对应存储名去修改存储内的监控日志。并且删除两张临时表。

 

 

总结

USER_SOURCE

SYS.SOURCE$

SELECT/*+parallel(8)*/ COLUMN_NAME,data_type FROM  all_tab_columns  WHERE table_name ='USER_SOURCE

执行结果:

  a.虽然说oracle不区分大小写,但在分析varchar类型数据时要十分关注大小写的问题,对于该类型数据需要大小写统一,使用函数upper和lower进行大小写统一(如果需求需要区分大小写,则跳过这一步)。

  b.注意格式化后字符串长度的变化,关注是否有特殊字符。 当长度不一致,切确定字符对应就需要考虑看不见的字符,使用ASCII()和 CHR() 函数结合替换字符类型函数处理varchar类数据。

ASCII不可以见字符
二进制十进制十六进制缩写名称/意义
0000 0000000NUL空字符(Null)
0000 0001101SOH标题开始
0000 0010202STX本文开始
0000 0011303ETX本文结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认回应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平定位符号
0000 1010100ALF换行键
0000 1011110BVT垂直定位符号
0000 1100120CFF换页键
0000 1101130DCR归位键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启用变换(Shift in)
0001 00001610DLE跳出数据通讯
0001 00011711DC1设备控制一(XON 启用软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK确认失败回应
0001 01102216SYN同步用暂停
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC跳出
0001 1100281CFS文件分割符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值