AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 9018
Accepted
Femme Fatale
Femme Fatale
Asked: 2011-12-11 06:19:09 +0800 CST2011-12-11 06:19:09 +0800 CST 2011-12-11 06:19:09 +0800 CST

虚拟列 - 在视图中使用它 (Oracle)

  • 772

我使用以下代码在 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; 

虚拟列工作正常,它确实填充了我想要在虚拟列中实现的目标。但是当我使用虚拟列的表创建视图时出现了问题;视图的数量需要大量时间(最多 5 分钟)。在这里,我想提一下,如果我不使用该功能(即电子邮件的空列),该视图将完全正常工作。查看代码如下

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,从而使其太大或太重而无法填充。我应该怎么做才能填充视图。我需要一个虚拟列,因为应用程序没有输入电子邮件。需要帮助。

stored-procedures oracle-11g-r2
  • 1 1 个回答
  • 798 Views

1 个回答

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2011-12-11T09:00:32+08:002011-12-11T09:00:32+08:00

    我不认为这是列的大小(顺便说一句:不要“假定”,测试)。

    我敢打赌,结果中的每一行都会一遍又一遍地调用该函数。因此,对于结果中的每一行,您都会在人员表上进行两次(!)选择。

    编辑:我上面的说法是错误的。虚拟列的函数仅在其所基于的列更新时调用。

    您可以通过在函数中仅执行一次 SELECT 来稍微改进一下:

    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  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; 
    

    这样就不需要额外的选择,它应该运行得很好。

    • 3

相关问题

  • 数据泵导出如何在 Linux 上限制其资源使用?

  • MySQL 存储例程中的动态 SQL

  • 为什么操作系统身份验证被认为是 Oracle 数据库的低安全性?

  • 您如何对 Oracle 数据库更改进行版本控制?

  • 有没有办法允许代理连接在公共数据库链接中使用通过的身份验证?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve