【发布时间】:2012-01-17 10:14:31
【问题描述】:
我在 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;
虚拟列工作正常,它确实填充了我想要在虚拟列中实现的内容。但是当我使用虚拟列的表进行视图时,问题就出现了;性能变得非常糟糕(视图的人口)。在这里,我想提一下,如果我不使用该功能(即电子邮件的空列),该视图可以正常工作。
视图代码如下
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;
我假设当我创建一个虚拟列时,oracle 强制要求我将数据类型长度保持为 4000,从而使其太大或太重而无法填充。我应该怎么做才能使视图填充。我需要有一个虚拟列,因为应用程序没有输入电子邮件。
需要帮助。
【问题讨论】:
标签: sql oracle function plsql oracle11g