输入:
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函数进行搜索,但是使用硬编码值进行搜索。
如何在没有硬编码值的情况下进行搜索。
答案 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
| 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
干杯!