2016-10-28 2 views
1

私はOracleに初心者です。テーブルにはファーストネームとラストネームが含まれています(メールは空です)。私の質問は、これらの要件を持つPL/SQL(プロシージャ)を書くことです。がデフォルトの文字列(プロシージャOracle)と連結されています

a)firstnameの最初の文字はlastname(Dan Smilze - > DSmilze)と連結されています。

b)すべてのアクセントが削除されます(ä - > a、ö - > o、...)。

c)2つの等しい電子メールが表示された場合、firstname 2の1文字の代わりに、最初の文字が使用されます(Dan Smilze - > DaSmilze)。

e)のユーザー名は「@ gmail.com」

結果がどうあるべきと連結されています

FIRSTNAME  LASTNAME EMAIL 

Dan   Smilze  [email protected] 
Ceo   Jürisoo  [email protected] 

私のコードです:

CREATE OR REPLACE PROCEDURE merge_email 
IS 
BEGIN 
UPDATE emails set Email = (select CONCAT(substr(firstname,1,1),convert(lastname,'US7ASCII')) from email_lphanvan); 
END merge_email; 

私は自分のコードが十分ではなかったことを知っています何とか間違っています。この手続きを理解するのを手伝ってもらえますか?どうもありがとうございます!

+0

「Ed O'Neill」のような名前はどうなりますか? –

+0

この場合、私は動作しません。私の国でちょうど普及した名前btw。 @WernfriedDomscheit –

+1

"Peter Smith"が2人いるとどうなりますか? –

答えて

0

ご迷惑をかけて申し訳ありません。それは素敵なソリューションではありませんが、それは動作します:

create table emails (name varchar2(20), surname varchar2(20), email varchar2(40)); 
insert into emails values ('Jan', 'Kowalski',''); 
insert into emails values ('Jan', 'Nowak',''); 
insert into emails values ('Jan', 'Ścigalski',''); 
insert into emails values ('Stefan', 'Kowalski',''); 
insert into emails values ('Stefan', 'Kowalski',''); 
insert into emails values ('Stefan', 'Kowalski',''); 
insert into emails values ('Józef', 'Błazen',''); 
insert into emails values ('Jan', 'Nowak',''); 
commit; 

begin 
for x in (select rowid, name, surname, row_number() over (partition by name, surname order by name) r from emails) loop 
UPDATE emails set Email = convert(substr(x.name,1,x.r),'US7ASCII') || convert(x.surname,'US7ASCII') || '@gmail.com' where rowid = x.rowid; 
end loop; 
commit; 
end; 
/

あなたは、テーブル内の任意のidを持っている場合は、代わりrowididを使用してください。

+0

ありがとうございました:)))。私はそれをテストします。 –