Sql 如何绕过ORA-01722

Sql 如何绕过ORA-01722,sql,oracle,Sql,Oracle,是否有解决方法/更好的方法来做到这一点: 我有一个字段TEREMARKS,它包含一个长字符串,我需要从这个字符串中获取我可以在其中找到的时间和名称。我在遇到以下格式时提取时间和名称:TE= 我的问题是,有时格式后面没有编码器,编码器会抛出ORA-01722。我希望我的程序跳过错误的记录并返回正常的记录。那可能吗?以下是脚本: 创建表: 插入数据: 我的问题是: 最后一条记录10:15导致错误。如何绕过那个? 我也觉得我的脚本太冗长了。非常感谢您的更正、建议和示例。谢谢 正如Alex所评论的,这显

是否有解决方法/更好的方法来做到这一点:

我有一个字段TEREMARKS,它包含一个长字符串,我需要从这个字符串中获取我可以在其中找到的时间和名称。我在遇到以下格式时提取时间和名称:TE=

我的问题是,有时格式后面没有编码器,编码器会抛出ORA-01722。我希望我的程序跳过错误的记录并返回正常的记录。那可能吗?以下是脚本:

创建表:

插入数据:

我的问题是:

最后一条记录10:15导致错误。如何绕过那个?
我也觉得我的脚本太冗长了。非常感谢您的更正、建议和示例。谢谢

正如Alex所评论的,这显然是正则表达式的任务

这里有一个可以处理您当前的数据

它从字符串的开头TE开始匹配,后跟一个=,然后是一个可选空格,两个数字一个可选字符,然后是另外两个数字

秒匹配后跟任意数量的字母,或:在行尾跟任意数量的字母

或者,只需说出时间和姓名,删除所有额外的内容:

with matched as (
 select regexp_substr( teremarks
                    , '^TE=[[:space:]]?[[:digit:]]{2}[[:print:]]?:[[:digit:]]{2}'
                       ) as time
      , regexp_substr( teremarks
                    , '([(][[:alpha:]]+[)]|:[[:alpha:]]+$)'
                        ) as name
   from te_entry
        )
select regexp_replace( time
                    , '[^([:digit:]|:)]')
     , regexp_replace( name
                    , '[^[:alpha:]]')
from matched
给你。还请注意,正则表达式仅在Oracle 10g或更高版本中可用

我想强调的是,虽然这将对您当前的数据有效,但并不意味着它将永远有效。总会有更多你没有想到的案例。如果此查询的结果很重要,则应更改表,使其包含一列,该列的日期不是测量时间,另一列的名称是测量人员


这是确保数据正确的唯一方法。

Hi,您可以使用{}按钮突出显示代码并使其可读。也考虑什么是相关的;例如,我相当确定缓冲池默认值与您的问题完全无关。您的查询完全无法读取。。。我根本不知道发生了什么,为什么。您的问题可能很有趣,但很难看到。请尝试格式化select语句。没有人会费心去理解,在运行SELECT或INSERT时会出现错误吗?我建议您从查看正则表达式开始,解析出正确格式的值,而不是使用多个case和instr构造。是否有解决方法/更好的方法来做到这一点。每当我们发现自己嵌套数据类型转换函数并部署扩展剪切粘贴时,我们都知道一定有更好的方法。谢谢Ben!你太棒了:D还感谢Ashish的编辑和善良D
Insert into HPACC.TE_ENTRY (TENUMBER, TEREMARKS, TEUPDATEBY, TETRXDT)
Values ('115118002', 'TE=10:03 CU ANTI SEIZZURE ', 'ME1', TO_DATE('08/24/2012 10:00:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into HPACC.TE_ENTRY (TENUMBER, TEREMARKS, TEUPDATEBY, TETRXDT)
Values ('1151180025 ', 'TE= 10:19 ON AND OFF FEVER', 'ME2', TO_DATE('08/24/2012 10:01:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into HPACC.TE_ENTRY (TENUMBER, TEREMARKS, TEUPDATEBY, TETRXDT)
Values ('1153053592', 'TE=10:40(DIANE)   PRE''EMP', 'ME1', TO_DATE('08/24/2012 10:05:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into HPACC.TE_ENTRY (TENUMBER, TEREMARKS, TEUPDATEBY, TETRXDT)
Values ('1157019820', 'TE=10:45(KRISTEN), CU,MONITORING,RASHE,FEVER LAST MONDAY  ', 'ME1', TO_DATE('08/24/2012 10:12:00', 'MM/DD/YYYY HH24:MI:SS'));
Insert into HPACC.TE_ENTRY (TENUMBER, TEREMARKS, TEUPDATEBY, TETRXDT)
Values ('1157019832', 'TE=11-:13 PRE EMP EXTRACTED BY:CAMILLA', 'ME3', TO_DATE('08/24/2012 10:15:00', 'MM/DD/YYYY HH24:MI:SS'));
SELECT TO_CHAR(DECODE(ORIGTIME, '1', '13','2', '14','3', '15','4', '16',ORIGTIME),'FM00') ATIME
      , DONEBY
      , COUNT(TENUMBER) AS CTOTAL 
FROM ( 
SELECT TENUMBER
        , (CASE WHEN (INSTR(UPPER(TEREMARKS),'TE=',1,1) <> 0) 
                  AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,1)+3,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,1)),':',1,1))-4)
   , ' +-.0123456789', ' '))) IS  NULL) 
     THEN TO_NUMBER(REPLACE(TO_CHAR(TO_NUMBER(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,1)+3,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,1)),':',1,1))-4)),'FM99'),'-')) 
   ELSE 0 END) AS ORIGTIME
 , (CASE WHEN (INSTR(UPPER(TEREMARKS),'(',1,1) <> 0) 
    AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,1)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,1)+1),')',1,1))-1), ' +-.0123456789', ' '))) IS NULL) 
   THEN SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,1)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,1)+1),')',1,1))-1) 
  ELSE TEUPDATEBY END) AS DONEBY 
FROM HPACC.TE_ENTRY 
  Where TETRXDT BETWEEN TO_DATE('08-24-2012 10:00:00','MM-DD-YYYY HH24:MI:SS') AND TO_DATE('08-24-2012 10:59:59','MM-DD-YYYY HH24:MI:SS') 
GROUP BY TENUMBER, TEREMARKS, TEUPDATEBY 
UNION
SELECT TENUMBER
    , (CASE WHEN (INSTR(UPPER(TEREMARKS),'TE=',1,2) <> 0) 
     AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,2)+3,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,2)),':',1,1))-4), ' +-.0123456789', ' '))) IS NULL) 
      THEN TO_NUMBER(REPLACE(TO_CHAR(TO_NUMBER(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,2)+3,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,2)),':',1,1))-4)),'FM99'),'-'))
   ELSE 0 END) AS ORIGTIME
 ,  (CASE WHEN (INSTR(UPPER(TEREMARKS),'(',1,2) <> 0) 
     AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,2)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,2)+1),')',1,1))-1), ' +-.0123456789', ' '))) IS NULL) 
 THEN SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,2)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,2)+1),')',1,1))-1) 
Else 'NONE' END) AS DONEBY 
FROM HPACC.TE_ENTRY 
Where TETRXDT BETWEEN TO_DATE('08-24-2012 10:00:00','MM-DD-YYYY HH24:MI:SS') AND TO_DATE('08-24-2012 10:59:59','MM-DD-YYYY HH24:MI:SS') 
GROUP BY TENUMBER, TEREMARKS 
UNION  
SELECT TENUMBER
     , (CASE WHEN (INSTR(UPPER(TEREMARKS),'TE=',1,3) <> 0)
 AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,3)+3, (INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,3)),':',1,1))-4), ' +-.0123456789', ' '))) IS NULL) 
THEN TO_NUMBER(REPLACE(TO_CHAR(TO_NUMBER(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,3)+3, (INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,3)),':',1,1))-4)),'FM99'),'-')) 
ELSE 0 END) AS ORIGTIME
, (CASE WHEN (INSTR(UPPER(TEREMARKS),'(',1,3) <> 0) 
  AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,3)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,3)+1),')',1,1))-1), ' +-.0123456789', ' '))) IS NULL) 
THEN SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,3)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,3)+1),')',1,1))-1) 
Else 'NONE' END) AS DONEBY 
FROM HPACC.TE_ENTRY 
Where TETRXDT BETWEEN TO_DATE('08-24-2012 10:00:00','MM-DD-YYYY HH24:MI:SS') AND TO_DATE('08-24-2012 10:59:59','MM-DD-YYYY HH24:MI:SS') GROUP BY TENUMBER, TEREMARKS 
UNION 
SELECT TENUMBER
 , (CASE WHEN (INSTR(UPPER(TEREMARKS),'TE=',1,4) <> 0) 
 AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,4)+3, (INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,4)),':',1,1))-4), ' +-.0123456789', ' '))) IS NULL) 
 THEN TO_NUMBER(REPLACE(TO_CHAR(TO_NUMBER(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,4)+3, (INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,4)),':',1,1))-4)),'FM99'),'-')) 
ELSE 0 END) AS ORIGTIME, 
(CASE WHEN (INSTR(UPPER(TEREMARKS),'(',1,4) <> 0)
 AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,4)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,4)+1),')',1,1))-1), ' +-.0123456789', ' '))) IS NULL) 
 THEN SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,4)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,4)+1),')',1,1))-1) 
Else 'NONE' END) AS DONEBY 
FROM HPACC.TE_ENTRY
Where TETRXDT BETWEEN TO_DATE('08-24-2012 10:00:00','MM-DD-YYYY HH24:MI:SS') AND TO_DATE('08-24-2012 10:59:59','MM-DD-YYYY HH24:MI:SS')
GROUP BY TENUMBER, TEREMARKS 
UNION 
SELECT TENUMBER
, (CASE WHEN (INSTR(UPPER(TEREMARKS),'TE=',1,5) <> 0) 
AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,5)+3,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,5)),':',1,1))-4), ' +-.0123456789', ' '))) IS NULL) 
 THEN TO_NUMBER(REPLACE(TO_CHAR(TO_NUMBER(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,5)+3,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'TE=',1,5)),':',1,1))-4)),'FM99'),'-'))
 ELSE 0 END) AS ORIGTIME
, (CASE WHEN (INSTR(UPPER(TEREMARKS),'(',1,5) <> 0) AND (LENGTH(TRIM(TRANSLATE(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,5)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,5)+1),')',1,1))-1), ' +-.0123456789', ' '))) IS NULL) 
THEN 
 SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,5)+1,(INSTR(SUBSTR(TEREMARKS,INSTR(UPPER(TEREMARKS),'(',1,5)+1),')',1,1))-1) 
   Else 'NONE' END) AS DONEBY
FROM HPACC.TE_ENTRY Where TETRXDT BETWEEN TO_DATE('08-24-2012 10:00:00','MM-DD-YYYY HH24:MI:SS') AND TO_DATE('08-24-2012 10:59:59','MM-DD-YYYY HH24:MI:SS') 
GROUP BY TENUMBER, TEREMARKS
) 
Where ORIGTIME <> 0 
Group By ORIGTIME, DONEBY 
Order By TO_CHAR(TO_NUMBER(ATIME),'FM00') , DONEBY;
select regexp_substr( teremarks
                   , '^TE=[[:space:]]?[[:digit:]]{2}[[:print:]]?:[[:digit:]]{2}')
     , regexp_substr( teremarks
                   , '([(][[:alpha:]]+[)]|:[[:alpha:]]+$)')
from te_entry
with matched as (
 select regexp_substr( teremarks
                    , '^TE=[[:space:]]?[[:digit:]]{2}[[:print:]]?:[[:digit:]]{2}'
                       ) as time
      , regexp_substr( teremarks
                    , '([(][[:alpha:]]+[)]|:[[:alpha:]]+$)'
                        ) as name
   from te_entry
        )
select regexp_replace( time
                    , '[^([:digit:]|:)]')
     , regexp_replace( name
                    , '[^[:alpha:]]')
from matched