Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我正在尝试添加检查约束以检查年龄和出生日期_Sql_Oracle - Fatal编程技术网

Sql 我正在尝试添加检查约束以检查年龄和出生日期

Sql 我正在尝试添加检查约束以检查年龄和出生日期,sql,oracle,Sql,Oracle,但这个查询不起作用。 请帮我解决您遗漏了圆函数的一个参数 CREATE TABLE "TEST"."AB_EMPLOYEE22" ( "NAME" VARCHAR2(20 BYTE), "AGE" NUMBER, "SALARY" NUMBER, "DOB" DATE ) alter table "TEST"."AB_EMPLOYEE22" add constraint Age_check check((ROUND((sysdate-DOB)

但这个查询不起作用。
请帮我解决

您遗漏了圆函数的一个参数

CREATE TABLE "TEST"."AB_EMPLOYEE22" 
   (    "NAME" VARCHAR2(20 BYTE), 
    "AGE" NUMBER, 
    "SALARY" NUMBER, 
    "DOB" DATE
   ) 

alter table "TEST"."AB_EMPLOYEE22" add constraint
Age_check check((ROUND((sysdate-DOB)/365)) = AGE) ENABLE  

您遗漏了round函数的一个参数

CREATE TABLE "TEST"."AB_EMPLOYEE22" 
   (    "NAME" VARCHAR2(20 BYTE), 
    "AGE" NUMBER, 
    "SALARY" NUMBER, 
    "DOB" DATE
   ) 

alter table "TEST"."AB_EMPLOYEE22" add constraint
Age_check check((ROUND((sysdate-DOB)/365)) = AGE) ENABLE  

您遗漏了round函数的一个参数

CREATE TABLE "TEST"."AB_EMPLOYEE22" 
   (    "NAME" VARCHAR2(20 BYTE), 
    "AGE" NUMBER, 
    "SALARY" NUMBER, 
    "DOB" DATE
   ) 

alter table "TEST"."AB_EMPLOYEE22" add constraint
Age_check check((ROUND((sysdate-DOB)/365)) = AGE) ENABLE  

您遗漏了round函数的一个参数

CREATE TABLE "TEST"."AB_EMPLOYEE22" 
   (    "NAME" VARCHAR2(20 BYTE), 
    "AGE" NUMBER, 
    "SALARY" NUMBER, 
    "DOB" DATE
   ) 

alter table "TEST"."AB_EMPLOYEE22" add constraint
Age_check check((ROUND((sysdate-DOB)/365)) = AGE) ENABLE  

不可能在约束中使用诸如“Sysdate”之类的系统变量。 链接:


建议使用具有相同逻辑的触发器

不可能在约束中使用“Sysdate”等系统变量。 链接:


建议使用具有相同逻辑的触发器

不可能在约束中使用“Sysdate”等系统变量。 链接:


建议使用具有相同逻辑的触发器

不可能在约束中使用“Sysdate”等系统变量。 链接:

建议使用具有相同逻辑的触发器。免责声明:这不是问题的直接答案

现在,不要在表中存储派生的、最重要的是不断变化的数据,例如
age
。而是在查询时动态计算(例如,使用视图)

以下是演示免责声明:这不是对问题的直接回答

现在,不要在表中存储派生的、最重要的是不断变化的数据,例如
age
。而是在查询时动态计算(例如,使用视图)

以下是演示免责声明:这不是对问题的直接回答

现在,不要在表中存储派生的、最重要的是不断变化的数据,例如
age
。而是在查询时动态计算(例如,使用视图)

以下是演示免责声明:这不是对问题的直接回答

现在,不要在表中存储派生的、最重要的是不断变化的数据,例如
age
。而是在查询时动态计算(例如,使用视图)


下面是演示

忘记使用SYSDATE,因为它无效,或者使用触发器作为解决方法。我会给你看一个便宜的把戏

将sysdate写入列并使用它进行验证。此列可能是您的审核列(例如:创建日期)


忘记使用SYSDATE,因为它无效,或者使用触发器作为解决方法。我会给你看一个便宜的把戏

将sysdate写入列并使用它进行验证。此列可能是您的审核列(例如:创建日期)


忘记使用SYSDATE,因为它无效,或者使用触发器作为解决方法。我会给你看一个便宜的把戏

将sysdate写入列并使用它进行验证。此列可能是您的审核列(例如:创建日期)


忘记使用SYSDATE,因为它无效,或者使用触发器作为解决方法。我会给你看一个便宜的把戏

将sysdate写入列并使用它进行验证。此列可能是您的审核列(例如:创建日期)


不能在检查约束中使用SYSDATE。根据Oracle文档-

无法设置检查约束的条件 包含以下构造:

  • 子查询和标量子查询表达式
  • 对非确定性函数的调用(当前日期,
    当前时间戳,DBTIMEZONE,
    LOCALTIMESTAMP,SESSIONTIMEZONE,
    SYSDATE、系统时间戳、UID、用户和 用户环境)
  • 对用户定义函数的调用
  • REF列的取消引用(例如,使用DEREF函数)
  • 嵌套表列或属性
  • 伪列CURRVAL、NEXTVAL、LEVEL或ROWNUM
  • 未完全指定的日期常量
因此,在这种情况下,您可以使用
Trigger
获得所需的输出。以下是触发器,它将根据您的要求正常工作:

CREATE TABLE "AB_EMPLOYEE22"
(
   "NAME"     VARCHAR2 ( 20 BYTE ),
   "AGE"      NUMBER,
   "SALARY"   NUMBER,
   "DOB"      DATE,
   "DOJ"      DATE DEFAULT SYSDATE
);

Table Created    

ALTER TABLE "AB_EMPLOYEE22" ADD CONSTRAINT
AGE_CHECK CHECK((ROUND((DOJ-DOB)/365)) = AGE) ENABLE;

Table Altered
创建或替换触发器测试检查日期
在插入或更新AB_员工之前22
每行
开始
IF(ROUND((sysdate nvl(:NEW.DOB,:OLD.DOB))/365)nvl(:NEW.AGE,:OLD.AGE))
然后
提出申请错误(-20001,“您的出生日期和年龄不匹配”);
如果结束;
结束;

如果您发现此触发器有任何困难,请随时写评论。

您不能在检查约束中使用SYSDATE。根据Oracle文档-

无法设置检查约束的条件 包含以下构造:

  • 子查询和标量子查询表达式
  • 对非确定性函数的调用(当前日期,
    当前时间戳,DBTIMEZONE,
    LOCALTIMESTAMP,SESSIONTIMEZONE,
    SYSDATE、系统时间戳、UID、用户和 用户环境)
  • 对用户定义函数的调用
  • REF列的取消引用(例如,使用DEREF函数)
  • 嵌套表列或属性
  • 伪列CURRVAL、NEXTVAL、LEVEL或ROWNUM
  • 未完全指定的日期常量
因此,在这种情况下,您可以使用
Trigger
获得所需的输出。以下是触发器,它将根据您的要求正常工作:

CREATE TABLE "AB_EMPLOYEE22"
(
   "NAME"     VARCHAR2 ( 20 BYTE ),
   "AGE"      NUMBER,
   "SALARY"   NUMBER,
   "DOB"      DATE,
   "DOJ"      DATE DEFAULT SYSDATE
);

Table Created    

ALTER TABLE "AB_EMPLOYEE22" ADD CONSTRAINT
AGE_CHECK CHECK((ROUND((DOJ-DOB)/365)) = AGE) ENABLE;

Table Altered
创建或替换触发器测试检查日期
在插入或更新AB_员工之前22
每行
开始
IF(ROUND((sysdate nvl(:NEW.DOB,:OLD.DOB))/365)nvl(:NEW.AGE,:OLD.AGE))
然后
提出申请错误(-20001,“您的出生日期和年龄不匹配”);
如果结束;
结束;

如果您发现此触发器有任何困难,请随时写评论。

您不能在检查约束中使用SYSDATE。根据Oracle文档-

无法设置检查约束的条件 包含以下构造:

  • 子查询和标量子查询表达式
  • 调用