2016-05-11 10 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と100 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

をその関数の3番目の引数は位置であり、かつ'i'ます再贈与は第五でなければならない、match_param。オラクルは、文字としてiを数値として解釈しようとしています。これは、位置引数に1つが必要であるため、エラーとなります。

あなたは:例えば、あまりにも私はあなたががそのための大文字と小文字を区別しないフラグが必要かわからない

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

を位置や発生の引数を指定する必要があります。あなたはABBEY、Abbey、修道院などとマッチしたいので、REGEXP_LIKEのために行いますが、部分文字列の抽出には役に立たないようです。

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

あなたは間違いなく正しいと私はこれまでに行っています。私はregexp_likeをはるかに頻繁に使用していますので、私はこの形式に慣れています。 – DanSask

関連する問題