使用函数时在Oracle视图中保留类型信息?

时间:2015-11-19 08:57:14

标签: sql oracle types oracle12c sql-view

我有一个像这样的观点:

SELECT NVL(foo, 0) foo FROM bar

不幸的是,这种观点忽略了bar.fooNUMBER(1)的事实,而只是将其指定为NUMBER。我想保留类型信息,所以我这样做了:

SELECT CAST(NVL(foo, 0) AS NUMBER(1)) foo FROM bar

这很有效,但如果我有很多像foo这样的列,我需要复制类型信息。我是否会改变其中一个的精度,我也必须在视图中更改它,否则可能会失去精度。理想情况下,我想做这样的事情:

SELECT CAST(NVL(foo, 0) AS TYPE(foo)) foo FROM bar

这可能,如果可能,怎么样?

1 个答案:

答案 0 :(得分:2)

我不认为这是可能的,因为在更改基表时会隐式更改视图定义。

您可能希望完全避免插入NULL数据:如果您的业务逻辑允许将列限制为NOT NULL,则可以在客户端实现NLV(foo,0)逻辑或使用BEFORE INSERT触发器将所有NULL插入内容转换为0

CREATE TABLE T1(
  foo NUMBER(1) NOT NULL
  );

CREATE TRIGGER TRG1 BEFORE INSERT ON T1
FOR EACH ROW
BEGIN
  :new.foo := NVL(:old.foo, 0);
END;
/

然后你可以

INSERT INTO T1 VALUES (NULL);

SELECT * FROM T1;

将为您提供0

请参阅Oracle Documentation