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

Preserving type information in an Oracle view when using functions?

我有这样的看法:

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

这可能吗?如果可能,怎么做?

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

您可能希望完全避免插入 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