在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仍然识别其为可空字段
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仍然识别其为可空字段
解决方案 »
- oracle基础问题
- 如何把一个vector的数据传给存储过程
- 请大家帮忙:如何写一个orcle 存储过程,要求输入一组数据
- 想在一个包(存储过程)中select v$session 和 v$sqltext
- 关于最大日期字段数据与前一天数据比较的sql语句
- 无法启动OracleOra81HomeMangermentServer服务!(高分求救)
- 紧急求救——触发器相关!!!!!!!!!!
- 经典问题!:)
- oracle 805 data block corrupted,急用
- rman 备份和CONTROL_FILE_RECORD_KEEP_TIME有多大关系
- 函数中执行DML语句问题
- oracle 存储过程需要调用包里的函数,如何实现呢
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>
谢谢回复~不过这样是没用的
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是无效的