如何在Oracle中搜索字符串

时间:2019-12-16 16:57:24

标签: sql oracle plsql

  

输入:

Error : -12899-ORA-12899: value too large for column "MILLER"."DAS_PAYSOURCES"."NATIONAL_INSURANCE_NUMBER" (actual: 10, maximum: 9) Record No : 11 Field : PAYROLL_NO Value :'16712'

输出:

Record No, Column Name, Issue, Maximum Allowed Length,Actual Length 
    11, NATIONAL_INSURANCE_NUMBER,Value Too Large,9,10

解决方案

   DECLARE
    V_RECORD_NO  VARCHAR2(2000):='Error:-12899-ORA-12899: value too large for 
  column "MILLER"."DAS_PAYSOURCES"."NATIONAL_INSURANCE_NUMBER" 
  (actual:10,maximum:9)Record No : 11 Field : PAYROLL_NO Value :16712';
   BEGIN

    V_RECORD_NO:=SUBSTR(V_RECORD_NO,INSTR(V_RECORD_NO,'RecordNo'),9)||','||

    SUBSTR(V_RECORD_NO,INSTR(V_RECORD_NO,'PAYROLL_NO'),10)||','||

    SUBSTR(V_RECORD_NO,INSTR(V_RECORD_NO,'12899-ORA-12899'),15);

   DBMS_OUTPUT.PUT_LINE(V_RECORD_NO);
   END;

我使用instr函数进行搜索,但是使用硬编码值进行搜索。

如何在没有硬编码值的情况下进行搜索。

2 个答案:

答案 0 :(得分:0)

您可以使用regexp_replace()来解析此错误消息:

类似的东西:

select regexp_replace(
        'Error : -12899-ORA-12899: value too large for column "MILLER"."DAS_PAYSOURCES"."NATIONAL_INSURANCE_NUMBER" (actual: 10, maximum: 9) Record No : 11 Field : PAYROLL_NO Value :16712',
        '^.*ORA-\d+: (.*) for column (\S+)\s*\(actual\s*:\s*(\d+), maximum\s*:\s*(\d+)\) Record No\s*:\s*(\d+).*$',
        '\5, \2, \1, \3, \4'
    ) parsed 
from dual

Demo on DB Fiddle

| PARSED                                                                            |
| :-------------------------------------------------------------------------------- |
| 11, "MILLER"."DAS_PAYSOURCES"."NATIONAL_INSURANCE_NUMBER", value too large, 10, 9 |

答案 1 :(得分:0)

您可以使用regexp_substr来获取各个列中的所有这些值,如下所示:

with dataa (str) as
(select 'Error:-12899-ORA-12899: value too large for column "MILLER"."DAS_PAYSOURCES"."NATIONAL_INSURANCE_NUMBER" (actual:10,maximum:9)Record No : 11 Field : PAYROLL_NO Value :16712' from dual)
-- your query starts from here
select 
  regexp_substr(str,'Record No : (\d+)',1,1,null,1) as col1,
  regexp_substr(str,'".+"\.".+"\."(.+)"',1,1,null,1) as col2,
  regexp_substr(str,'ORA-\d+: (.+) "',1,1,null,1) as col3,
  regexp_substr(str,'maximum:(\d+)\)',1,1,null,1) as col4,
  regexp_substr(str,'\(actual:(\d+),',1,1,null,1) as col5
from dataa

Db<>fiddle demo

干杯!