【问题标题】:Preserving type information in an Oracle view when using functions?使用函数时在 Oracle 视图中保留类型信息?
【发布时间】:2016-02-21 07:39:44
【问题描述】:

我有这样的看法:

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

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

【问题讨论】:

    标签: sql oracle types oracle12c sql-view


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2023-03-26
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多