使用函数时在 Oracle 视图中保留类型信息?
Preserving type information in an Oracle view when using functions?
我有这样的看法:
SELECT NVL(foo, 0) foo FROM bar
不幸的是,这种观点忽略了 bar.foo
是 NUMBER(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
我有这样的看法:
SELECT NVL(foo, 0) foo FROM bar
不幸的是,这种观点忽略了 bar.foo
是 NUMBER(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