在Oracle中新建了一個視圖,視圖創建腳本如下:
CREATE OR REPLACE FORCE VIEW MES.V_PP_YIELD
AS
SELECT ROWNUM AS ID,
lots.MatDati,
lots.DatiQty,
defs.Dati,
defs.DefQty
FROM ( SELECT TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD') AS MatDati,
SUM (lot.QTY) AS DatiQty
FROM MM_LOT lot
GROUP BY TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD')) lots
JOIN
( SELECT TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD') AS Dati,
SUM (defe.DEF_QTY) AS DefQty
FROM MM_LOT lot, LOT_DEFECT defe
WHERE lot.LOT_NO = defe.LOT_NO
GROUP BY TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD')) defs
ON lots.MatDati = defs.Dati;
結果創建出的視圖各個欄位都是可空的,如下圖所示

視圖里用到的表欄位lot.MAT_DATE是非空的,結果因為TO_CHAR函式的使用,oracle在視圖中將其對應的列識別為可空欄位
因為現在需要在VS中用EF匯入資料庫模型,這要求視圖中必須有非空欄位,所以現在這樣的話不行
備注:ROWNUM 列是我想額外加上一個非空列,結果它也被識別為可空的……
求大神相助,如何在Oracle視圖中創建非空欄位?
可以是新建一個非空欄位的方法,也可以是修改已有欄位為非空的方法……
再備注:不用說NVL函式這種方法了,雖然資料上可以保證其非空,但oracle仍然識別其為可空欄位
uj5u.com熱心網友回復:
-- 看看這個對你有沒有參考價值
SQL> create table t1(c1 int not null, c2 varchar(10) not null, c3 varchar(10) );
create view v1
as
select 100 id, c1, c2, c3
from (select c2, sum(c1) c1, max(c3) c3 from t1 group by c2) ;
desc v1;
drop view v1;
drop table t1;
Table created.
SQL> SQL> 2 3 4
View created.
SQL> SQL> Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
C1 NUMBER
C2 NOT NULL VARCHAR2(10)
C3 VARCHAR2(10)
SQL> SQL>
View dropped.
SQL>
Table dropped.
SQL>
uj5u.com熱心網友回復:
謝謝回復~不過這樣是沒用的
Oracle視圖判別是否可空確實依賴參考表的欄位是否可空~
但原來的欄位經過某些函式處理后,非空欄位就可能變為可空欄位
您給的例子里視圖中仍然使用的是c2欄位本身
針對我最上面的例子,如果我進行如下修改
( SELECT TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD') AS MatDati,
SUM (lot.QTY) AS DatiQty
FROM MM_LOT lot
GROUP BY TO_CHAR (lot.MAT_DATE, 'YYYY-MM-DD')) lots
將這句話修改成下面這樣
( SELECT lot.MAT_DATE AS MatDati,
SUM (lot.QTY) AS DatiQty
FROM MM_LOT lot
GROUP BY lot.MAT_DATE) lots
那么生成的視圖中對應欄位確實就變成了 NOT NULL
也就是說本來非空的lot.MAT_DATE經過TO_CHAR函式的運算就被識別為可空欄位~
所以現在感徑訓是不修改已有欄位,而是新建一個非空新欄位更可行些,只是暫時仍不知該如何新建一個非空新欄位,不過已知用Rownum是無效的
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/93555.html
標籤:高級技術
上一篇:領料單關聯生產訂單取成本物件
