【发布时间】:2017-04-15 09:47:51
【问题描述】:
这是来自插入语句的Oracle Database 12 documentation:
带有检查选项
指定 WITH CHECK OPTION 表示 Oracle 数据库禁止 对表或视图进行的任何会产生不符合要求的行的更改 包含在子查询中。在 DML 的子查询中使用时 语句,您可以在 FROM 中的子查询中指定此子句 WHERE 子句中的子查询,但不在子查询中。
我无法理解最后一句话:
在 DML 语句的子查询中使用时,您可以指定此项 FROM 子句中的子查询中的子句,但不在子查询中的子查询中 WHERE 子句。
当插入有子查询时,似乎暗示 WITH CHECK OPTION 应该直接出现在 FROM 子句之后。但它不起作用。恰恰相反。
当 WITH CHECK OPTION 放在 WHERE 子句之后时,它可以正常工作并产生预期的 ORA-01402 错误。
但是当直接放在 FROM 子句之后时,它会产生“ORA-00907:缺少右括号”错误。 IE。如文档所述,将 WITH CHECK OPTION 放在 FROM 子句之后不是有效的 SQL。
SQL> create table t1
2 (
3 col1 number
4 );
Table created.
SQL> insert into
2 (
3 select * from t1
4 where col1 = 1
5 with check option
6 )
7 values (2);
select * from t1
*
ERROR at line 3:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL> insert into
2 (
3 select * from t1
4 with check option
5 where col1 = 1
6 )
7 values (2);
where col1 = 1
*
ERROR at line 5:
ORA-00907: missing right parenthesis
SQL>
是文档有误还是我遗漏了什么?
【问题讨论】:
-
也许“不在 WHERE 子句中的子查询中”指的是
where id in (select ... with check option ..) -
可能。只是感觉内部选择会被称为子查询,但我真的不知道。
-
我将内部选择称为“派生表”,而不是子查询
-
内部
SELECT是一个子查询,但 ISTM 在WHERE子句中使用此类子查询存在限制 - 它没有指定WITH CHECK OPTION在它是子查询。CREATE VIEW语法表示WITH CHECK OPTION在WHERE子句之后。
标签: sql oracle sql-insert