在Oracle 11g中为列创建可写别名

时间:2016-02-24 21:26:04

标签: oracle oracle11g

所以,我有一张桌子,例如:

CREATE TABLE FOO (
    id INTEGER PRIMARY KEY,
    blah VARCHAR2(20) NOT NULL
);

并且我想将列blah重命名为bleh - barbaz表中的等效列称为bleh,并且正在制作跨表的名称统一允许我简化访问此数据库的一些代码。但是,仅使用ALTER TABLE重命名列将不起作用,因为生成的架构更改向后与不经过修改以匹配它的代码不兼容。

所以,我想这样做,以便我bleh作为blah的别名。起初,虚拟列似乎是实现此目的的一种方式:

ALTER TABLE FOO ADD (bleh AS blah);

但是,生成的bleh列无法更新或插入,这使其不适合我的目的。 有没有办法在Oracle 11gR2中创建可写(可更新/可插入)列别名?

2 个答案:

答案 0 :(得分:1)

有两种选择。

选项1是将foo重命名为foo_base,在foo上创建一个视图foo_base,然后将foo中的列公开为blah bleh视图中有1}}和alter table foo rename to foo_base; alter table foo_base rename column blah to bleh; create view foo as select id, bleh as blah, bleh as bleh from foo_base;

blah

只要您不尝试在同一bleh声明中更新foo中的updatebleh,我就不会期望这会导致任何问题。

选项2是将update列添加到表中,然后编写触发器以使两个列在插入或更新行级触发器之前保持同步。这意味着如果00000000 00000000 00000000 01000101 //The number 69, stored in a 32 bit object 00000000 00000000 01010000 00000000 //shifted left by 8 语句试图更新两列,数据将被复制并且逻辑会有点痛苦。只要您只更新一个或另一个列,那就应该没问题。

答案 1 :(得分:0)

只需创建一个视图,然后在此视图中为列' blah`定义别名blee
然后使用此视图而不是表。

简单示例:

CREATE TABLE FOO (
    id INTEGER PRIMARY KEY,
    blah VARCHAR2(20) NOT NULL
);

CREATE VIEW foooo as
SELECT id, blah as blee 
FROM foo;

insert into foooo( id, blee ) values ( 1, 'aaaa' );

update foooo set blee = 'bbbb' where id = 1;

select * from foo;
        ID BLAH               
---------- --------------------
         1 bbbb