【问题标题】:Does XOR work in trigger and check-constraints in oracle 11g?XOR 是否适用于 oracle 11g 中的触发器和检查约束?
【发布时间】:2018-08-16 00:06:51
【问题描述】:

我正在尝试找出是否可以在触发器和检查约束中使用 XOR。我已经在 PL/SQL 中看到了实现,但还没有完全弄清楚是否可以在触发器和检查约束中使用 XOR 函数。 我尝试在检查约束中使用它:

 CREATE TABLE my_table
 (
    tableid          NUMBER  PRIMARY KEY,
    foreignkey1      NUMBER,
    foreignkey2      NUMBER,
    CONSTRAINT check_anleger CHECK( XOR( foreignkey1 IS NULL, foreignkey2 IS NULL));
 );

但不幸的是它不起作用(出现“缺少右括号”-异常,只有在我删除约束命令时才解决)。

XOR 函数是否在触发器和检查约束中工作?

【问题讨论】:

    标签: oracle oracle11g triggers


    【解决方案1】:

    Oracle 数据库(与 PL/SQL 相对)一开始就没有布尔数据类型,因此它不支持 XOR 等逻辑函数。这意味着您不能在约束中使用它。但是您可以重写条件,只需使用标准的andornot 和括号。触发器(大部分)是 PL/SQL,所以 XOR 应该是可用的。但是,如果您可以使用约束而不是触发器来做某事,那几乎总是一个更好的选择,即使代码更繁琐。

    【讨论】:

    • 谢谢!但是,当检查约束不使用布尔数据类型时,它是如何工作的呢?
    • SQL 使用隐式布尔值,但没有布尔数据类型。请参阅文档:docs.oracle.com/cloud/latest/db112/LNPLS/datatypes.htm#LNPLS348
    • @watchme - 与“条件”在所有 Oracle SQL 中的工作方式相同。 Oracle 有逻辑“条件”,但它们不能用作“表达式”——您不能有数据类型为布尔、“逻辑”或“条件”的列。 Oracle SQL 中的一个令人讨厌的区别(据我所知,在大多数商业 SQL 实现中)。似乎没有人完全实现的 SQL 标准需要对布尔数据类型的支持。
    猜你喜欢
    • 2011-11-29
    • 2014-12-12
    • 2012-03-12
    • 2015-11-07
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多