2011-12-10 2 views
2

다음 코드를 사용하여 Oracle에서 가상 열을 만들었습니다.
가상 열 -보기에서보기 (Oracle)

CREATE OR REPLACE function email_address (ID_ varchar2) 
return varchar2 
deterministic 
as 

lname varchar2 (256); 
snumber varchar2 (256); 
email varchar2 (256); 
    BEGIN 
    select substr(p.name, instr(p.name, ' ', -1) + 1) into lname 
    from person p where p.id = id_; 

    SELECT regexp_replace(p.service_no, '[^0-9]*', '') into snumber 
    FROM person p where p.ID = id_; 

    email:= snumber||lname||'@met.af'; 

return email; 
end email_address; 


가상 열은 잘 작동하고 내가 가상 열에서 acheive 원하는 것을 채워 않습니다. 하지만 문제는 가상 컬럼의 테이블을 사용하여 뷰를 만들 때 발생합니다. 성능이 실제로 나빠집니다 (뷰의 인구). 여기, 나는 함수 (즉, 전자 메일의 빈 열)를 사용하지 않으면 뷰가 완벽하게 작동한다고 언급하고 싶습니다. 보기의 코드는 무엇 내가 가정하는 것은 내가 가상 컬럼을 할 때, 오라클은 강제가 너무 크거나 무거운 만들기, therby, 4000 데이터 유형의 길이를 유지하기 위해 나에게 묻는 것입니다

select distinct 
    person.SERVICE_NO as Service_No, 
    person.CNIC_NO as CNIC, person.NAME as NAME , 
    card.CPLC_SERIAL_NO as Card_Number, 
    child_dc.NAME as Child_DC, 
    root_dc.NAME as Root_DC, person.OU as OU, 
    person.EMAIL as Email 
from 

person_card inner join person 
on person_card.PERSON_ID = person.ID 
inner join card 
on person_card.CARD_ID = card.ID 
    left outer join child_dc 
on person.CHILD_DC_ID = child_dc.ID 
    left outer join root_dc 
on child_dc.ID = root_dc.ID; 


아래로이다 채우다. 보기를 채우려면 어떻게해야합니까? 응용 프로그램에서 전자 메일을 입력하지 않으므로 가상 열이 있어야합니다. 도움말이 필요합니다.

답변

7

필자는 열의 크기 (btw : "추정치"테스트하지 않음)라고 생각하지 않습니다.

제 생각에는 함수의 결과에서 각 행에 대해 함수가 반복적으로 호출된다는 것입니다. 결과의 각 행에 대해 person 테이블에서 두 개 (!) 선택을하십시오.

편집 : 나는 위의 진술에 틀 렸습니다. 가상 컬럼의 기능은 그것이 기반으로하는 컬럼이 갱신 될 때만 호출됩니다.

select substr(p.name, instr(p.name, ' ', -1) + 1), 
     regexp_replace(p.service_no, '[^0-9]*', '') 
    into lname, snumber 
from person p where p.id = id_; 

하지만 추천 할 것입니다 단순히보기에 그 논리를 넣어하고 뷰 내부의 이메일 문자열을 만들 :

당신은 약간에만 함수에 하나의 SELECT를 수행하여 있음을 향상시킬 수 있습니다

select distinct 
     person.SERVICE_NO as Service_No, 
     person.CNIC_NO as CNIC, person.NAME as NAME , 
     card.CPLC_SERIAL_NO as Card_Number, 
     child_dc.NAME as Child_DC, 
     root_dc.NAME as Root_DC, person.OU as OU, 
     regexp_replace(p.service_no, '[^0-9]*', '')||substr(p.name, instr(p.name, ' ', -1) + 1)||'@met.af' as email 
from person_card 
inner join person 
on person_card.PERSON_ID = person.ID 
inner join card 
on person_card.CARD_ID = card.ID 
    left outer join child_dc 
on person.CHILD_DC_ID = child_dc.ID 
    left outer join root_dc 
on child_dc.ID = root_dc.ID; 

그런 식으로 추가 선택이 필요 없으며 잘 작동해야합니다.

+0

와우! 너 한테 모자 벗었 어. 정말로 굉장한 –