У меня есть связанный 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, и никаких числовых операций (которые я знаю) не выполняется. Итак, почему ошибка недопустимого числа и как я могу ее исправить?
Вы абсолютно правы, и я сделал это раньше. Я использую regexp_like гораздо чаще, поэтому я использовал этот формат. – DanSask