2016-05-11 2 views
0

У меня есть связанный question и попытка реализовать свой ответ на мою проблему. Когда я пытаюсь использовать их предлагаемое решение, я получаю ORA-01722: неверный номер.Ошибка недопустимого числа

Вот мой стол

CREATE TABLE TEMP_PARSE_EXIST 
( 
PHYS_ST_ADRS  VARCHAR2(64 CHAR), 
PHYS_ADRS_LN2  VARCHAR2(64 CHAR), 
PHYS_COM_NM   VARCHAR2(50 CHAR), 
PROV    VARCHAR2(10 CHAR), 
PSTL_CD    VARCHAR2(16 CHAR), 
CNTRY    VARCHAR2(50 CHAR), 
MAIL_ADRS   VARCHAR2(64 CHAR), 
MAIL_ADRS_LN2  VARCHAR2(64 CHAR), 
MAIL_COM_NM   VARCHAR2(50 CHAR), 
MAIL_PROV   VARCHAR2(10 CHAR), 
MAIL_PSTL_CD  VARCHAR2(16 CHAR), 
ADRS    VARCHAR2(64), 
V_DIRN    VARCHAR2(2),  
V_NUM    VARCHAR2(8), 
V_STREET_NAME  VARCHAR2(64), 
V_SECOND_LINE  VARCHAR2(64), 
V_STREET_TYPE  VARCHAR2(64), 
V_POSTAL   VARCHAR2(7), 
V_COMM_NM   VARCHAR2(64), 
R_REC_TYP_CD  VARCHAR2(1), 
ADT_ACT    VARCHAR2(200 CHAR) 
); 

При выполнении следующей части коды, он приходит после того, как таблица получает усечена и заселена от исходного источника данных. Я всегда убеждаюсь, что усекаюсь и повторно заполняюсь, когда я запускаю тесты, чтобы убедиться, что предыдущие результаты не мешают.

Эти первые обновления предназначены для определения 100 Ave и 100th Ave как действительных.

DECLARE 
    ALLOWED_STREETS VARCHAR2(1400 char) := '(ABBEY|ACRES|WHARF|WOOD|WYND)'; --has been cut down for question 
BEGIN 
--this one is for when the 3rd "word" is one of the street types 
--and the 2nd "word" is purly numbers for a building number like 100 street 
    UPDATE TEMP_PARSE_EXIST 
    SET ADT_ACT = 'CASE 1', V_NUM = REGEXP_SUBSTR(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '\d+$') 
    WHERE REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i'), ALLOWED_STREETS || '$', 'i') --problem line 
    and REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '^\w+(\s?-\s?)\d+$') 
    AND ADT_ACT IS NULL; 

--this one is for when the 3rd "word" is one of the street types 
--and the 2nd "word" is numbered streets like 1st ave 
    UPDATE TEMP_PARSE_EXIST 
    SET ADT_ACT = 'CASE 2', V_STREET_NAME = REGEXP_SUBSTR(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '\d+(ST|ND|RD|TH)$') 
    WHERE REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i'), ALLOWED_STREETS || '$', 'i') --problem line 
    AND REGEXP_LIKE(REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+'), '^\w+(\s?-\s?)\d+(ST|ND|RD|TH)$') 
    AND ADT_ACT IS NULL; 
END; 

Когда линии, отмеченные как проблемы, удаляются, они будут работать, но результаты не то, что я хочу.

Так что я работаю с данными adrs, которые включают в себя номер здания, подразделения, название улицы, тип улицы, направление. В настоящее время я работаю над попыткой разобрать, когда подразделение и номер здания переносятся вместе, а когда нет. Таким образом, условия, которые я буду размещать, будут строгими для различных методов, которые могут существовать.

Так что, пока в данных, с которыми я работаю, есть числа, они хранятся как символы, а поля, в которых они хранятся, - varchar2, и никаких числовых операций (которые я знаю) не выполняется. Итак, почему ошибка недопустимого числа и как я могу ее исправить?

ответ

1

Вы звоните REGEXP_SUBSTR() как:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 'i') 

Как видно из синтаксиса схемы:

the syntax diagram

Третий аргумент этой функции является положение, и 'i' вам «Давление должно быть пятым, match_param. Oracle пытается интерпретировать букву i как число, так как она ожидает одного аргумента позиции, следовательно, ошибки вы получаете.

Вам необходимо предоставить аргументы позиции и появление тоже, например .:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+', 1, 1, 'i') 

я не уверен, что вам нужно флаг регистронезависимое для этого, хотя; вы делаете для REGEXP_LIKE, поскольку вы хотите совместить ABBEY, аббатство, аббатство и т. д., но, похоже, это не полезно для извлечения подстроки; так что вы также можете сделать:

REGEXP_SUBSTR(ADRS, '^\w+(\s?-\s?)\w+\s\w+') 
+0

Вы абсолютно правы, и я сделал это раньше. Я использую regexp_like гораздо чаще, поэтому я использовал этот формат. – DanSask

Смежные вопросы