在Oracle中创建布尔属性?
在Oracle中创建布尔属性的原因是,Oracle不支持使用CREATE DOMAIN语句来定义布尔数据类型。因此,如果尝试使用类似于上述示例中的CREATE DOMAIN语句来创建布尔属性,将会得到ORA-00901错误,提示无效的CREATE命令。
解决这个问题的方法是使用Oracle提供的CREATE TYPE语句来创建自定义类型。可以参考Oracle的文档CREATE TYPE来了解如何创建类型。
以下是一个可能的解决方法示例:
CREATE TYPE BOOLEAN AS OBJECT ( value NUMBER(1), MEMBER FUNCTION is_true RETURN BOOLEAN ); / CREATE TYPE BODY BOOLEAN AS MEMBER FUNCTION is_true RETURN BOOLEAN IS BEGIN RETURN value = 1; END; END; /
通过使用上述示例中的CREATE TYPE语句,可以创建一个自定义的BOOLEAN类型,并定义了一个is_true函数来判断布尔值。这样就可以在表的列中使用这个自定义类型来表示布尔属性了。
在Oracle中,由于不支持CREATE DOMAIN语句来创建布尔属性,因此需要使用CREATE TYPE语句来创建自定义类型。通过定义自定义类型和相应的函数,可以实现布尔属性的功能。
在Oracle中没有BOOLEAN数据类型。但是我们可以这样表示它:
CREATE TABLE tt (test NUMBER(1) NOT NULL CHECK (test in (0,1)))
哦,好的。那么这个检查的开销怎么样?
但是我可以通过某种方式创建一个名为boolean的类型,然后在我的表中添加boolean字段吗?
是的,但是我们是想要更好的性能和错误处理,还是稍微降低性能和错误处理?
ëlAlthaus: 没有人想要错误,但我没有看到任何错误。你呢?看看我的另一个评论:简单地将所有不为0的值视为true。这在计算机历史上有着悠久的历史。
这不是真正的日常使用实现。我有一个学校项目,我的老师给了我这个模式,其中包含一个布尔属性。
我理解这个观点...我仍然认为让事情变得更简单(myValue = 1与myValue <> 0一样一致)对于布尔表示是一件好事。而且你不能强迫每个人都记住c++的逻辑 😉
- 我的投票是数据一致性。如果一列只能保存1或0,就加上一个检查约束来强制执行。因为如果历史教会我们任何东西,那就是:开发人员将构建基于该列仅保存1或0的代码,当它包含3时,代码将出错。
此外,如果我们要比较性能开销,CHAR(1)占用的空间比NUMBER(1)少。在记录的整个生命周期中,我敢打赌额外的字节比强制执行检查约束的开销更多。
: 关于开发人员的假设,你提到了一个很好的观点。我关于性能的问题实际上是一个真诚的问题,因为我不知道性能影响有多严重。我肯定不是一个微优化者,我只是想知道在高负载场景中是否有什么需要注意的地方。我可能可以更好地表达这个问题 🙂
- 嗯,你知道Knuth关于这个说的。
: 对不起,我不明白你的意思。
"过早优化是万恶之源。" en.wikiquote.org/wiki/Donald_Knuth
: 我以为我已经明确表示我不是这样的人。但这并不意味着了解你使用的技术的性能影响不是一个好主意。