2012-03-09 16 views
0

ターゲット・スキーマアドレスここで、plzは数値であり、plzはvarchar2のソース・スキーマです。pl/sql-ORA-01702 - 無効な番号

次のコードは、ORA-01722 - 数値エラーが無効ですが、理由を特定できません。 '26189'や '38108'のような約30のplzと5つのヌル値があります。あなたは私たちを与えた

create or replace 
procedure f1_get_adresses is 
    cursor c_adresse is 
    select id, strasse, hausnummer, to_number(to_nchar(postleitzahl)) 
    as postleitzahl, ort, land 
    from db2_lsg2.f1_adresse; 
    rec c_adresse%rowtype; 
    counter number(10); 
    val_plz number(10); 
begin 
    for rec in c_adresse 
    loop 

    -- PLZ 
    select count(*) into counter from postleitzahl 
     where plz = rec.postleitzahl and ort = rec.ort; 
    if counter = 0 then 
     if rec.postleitzahl is null then 
     val_plz := 0; 
     else 
     val_plz := rec.postleitzahl; 
     end if; 
     insert into postleitzahl (plz, ort) values (rec.ort, val_plz); 
    end if; 

    -- Land 
    select count(*) into counter from land 
     where land_name = rec.land; 
    if counter = 0 then 
     insert into land (land_name) values (rec.land); 
    end if; 

    --Adresse 
    select count(*) into counter from adresse 
     where strasse = rec.strasse 
     and hausnummer = rec.hausnummer 
     and plz = rec.postleitzahl 
     and (select land_name from land where land_name = rec.land) = rec.land; 
    if counter = 0 then 
     insert into adresse (strasse, hausnummer, plz, land_id) 
     values (
     rec.strasse, 
     rec.hausnummer, 
     rec.postleitzahl, 
     (select land_id from land where land_name = rec.land) 
    ); 
    end if; 
    end loop; 
end; 
+0

すべきではありませんか? – Flukey

+0

番号として郵便番号(PLZ)を保存するのはなぜですか?そうすれば、数字は先行ゼロで保存されていないので、 '01067'のようなPLZを保存することはできませんが、正しいPLZでは先行ゼロが必要です。ターゲット表のデータ型を 'varchar2'にも変更する必要があります。 –

答えて

3

あまり詳細は、そうrec.ortの種類は何ですか..さんは推測してみましょうか?

insert into postleitzahl (plz, ort) values (rec.ort, val_plz); 

それが(異なる順序)、それは正確にエラーを投げている

insert into postleitzahl (plz, ort) values (val_plz, rec.ort); ? 
関連する問題