2017-04-15 70 views
1

這是從Oracle Database 12 documentation INSERT語句:甲骨文插入使用check選項

WITH CHECK OPTION

WITH CHECK OPTION指定表明,Oracle數據庫禁止 任何表或改變該視圖將生成子查詢中不包含的 的行。在用於DML 語句的子查詢中時,可以在FROM 子句中的子查詢中指定此子句,但不在WHERE子句中的子查詢中指定此子句。

我不能作出最後一句的意義:

當一個DML語句的子查詢中使用,你可以在FROM子句指定一個子查詢這個 條款,但沒有在子查詢在 WHERE子句中。

它似乎意味着WITH CHECK OPTION應該直接在FROM子句之後,當插入有子查詢時。但它不起作用。恰恰相反。

當WITH CHECK OPTION位於WHERE子句之後時,它能正常工作,併產生預期的ORA-01402錯誤。

但是,如果直接放在FROM子句之後,它會產生一個「ORA-00907:缺少右括號」的錯誤。即正如文檔所述,將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> 

是文檔錯誤還是我錯過了什麼?

+3

也許「*不在子查詢中的WHERE子句*」是指類似於'where id in(select ... with check option ..)' –

+0

可能。它只是覺得內部選擇將被稱爲子查詢,但我真的不知道。 – johanrex

+1

我會調用內部選擇一個「派生表」,而不是子查詢 –

回答

1

我認爲「WITH CHECK OPTION」是爲VIEWS而設計的,但是可以在像VIEW一樣工作的INSERT子查詢中使用。

去與你的例子:

SQL> create table t1 
    2 (
    3 col1 number 
    4 ); 

Table created. 

SQL> create table t2 
    2 (
    3 col1 number 
    4 ); 

Table created. 

SQL> INSERT INTO t2 VALUES (1); 

1 row inserted. 

SQL> INSERT INTO t1 
2 SELECT col1 
3 FROM (SELECT col1 FROM t2 WHERE col1 = 1 WITH CHECK OPTION); 

1 row inserted. 

我想這是僞裝成一個視圖的子查詢。