重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1422|回复: 0
打印 上一主题 下一主题

[Oracle] 创建物化视图时出现ORA-12054告警

[复制链接]
跳转到指定楼层
楼主
发表于 2022-11-11 13:17:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题描述:创建物化视图时出现ORA-12054告警,如下所示:
数据库:oracle19.12 64
异常现象:
SQL>desc emp
Name                                                 Null?    Type
------------------------------------------------------------- ------------------------------------
EMPLOYEE_ID                                           NOTNULL NUMBER(6)
FIRST_NAME                                                    VARCHAR2(9)
LAST_NAME                                            NOT NULL VARCHAR2(25)
EMAIL                                                 NOT NULL VARCHAR2(25)
PHONE_NUMBER                                                  VARCHAR2(20)
HIRE_DATE                                            NOT NULL TIMESTAMP(6)
JOB_ID                                                NOT NULL VARCHAR2(12)
SALARY                                                        NUMBER(8,2)
COMMISSION_PCT                                                NUMBER(2,2)
MANAGER_ID                                                    NUMBER(6)
DEPARTMENT_ID                                                 NUMBER(4)
SQL>select count(*) from emp;
  COUNT(*)
----------
        20
SQL>create materialized view v_emp
  2 refresh force on commit
  3  as
  4 select employee_id,first_name,last_name,email,phone_number,hire_datefrom emp;
selectemployee_id,first_name,last_name,email,phone_number,hire_date from emp
                                                                         *
ERROR atline 4:
ORA-12054:cannot set the ON COMMIT refresh attribute for the materialized view
说明:如上所示,ORA-12054告警异常重现.
异常原因:
创建物化视图的基表没有主键.
解决过程:
emp表是否存在主键.
SQL>SELECT                                                                 
  2      col.column_name
  3  FROM
  4      user_constraints con,user_cons_columns col
  5 WHERE
  6      con.constraint_name=col.constraint_name and con.constraint_type='P'
  7      and col.table_name='EMP';
no rowsselected
emp表添加主键.
SQL>alter table emp add constraint pk_emp_employee_id primary key (employee_id);
Table altered.
SQL>SELECT                                                                 
  2      col.column_name
  3  FROM
  4      user_constraints con,user_cons_columns col
  5 WHERE
  6      con.constraint_name=col.constraint_name and con.constraint_type='P'
  7      and col.table_name='EMP';
COLUMN_NAME
--------------------
EMPLOYEE_ID
确定表emp存在主键后,再次创建物化视图,无异常发生.
SQL>create materialized view v_emp
  2 refresh force on commit
  3  as
  4 select employee_id,first_name,last_name,email,phone_number,hire_datefrom emp;
Materializedview created.
SQL>select segment_name,segment_type,segment_subtype,tablespace_name,bytes fromuser_segments where segment_name like '%PK_EMP_EMPLOYEE_ID%' orsegment_name='V_EMP'
SEGMENT_NAME                        SEGMENT_TYPE       SEGMENT_SU TABLESPACE_NAME      BYTES
----------------------------------------------------- ---------- --------------- ----------
PK_EMP_EMPLOYEE_ID                  INDEX              ASSM       USERS                65536
SYS_C_SNAP$_5PK_EMP_EMPLOYEE_ID     INDEX              ASSM       USERS                65536
V_EMP                               TABLE              ASSM       USERS                65536
说明:如上所示,物化视图创建好后实则为实实在在的表,而且系统会自动产生名为SYS_C_SNAP$_5PK_EMP_EMPLOYEE_ID的索引,都会也会占用空间.这是与普通视图最大的区别.
SQL>update emp set email='aaaa' where employee_id=100;
1 rowupdated.
SQL>select * from v_emp where employee_id=100;
EMPLOYEE_IDFIRST_NAM LAST_NAME                EMAIL                     PHONE_NUMBER         HIRE_DATE
-------------------- ------------------------- --------------------------------------------- ------------------------------
        100 Steven    King                      SKING                     515.123.4567         17-JUN-11 12.00.00.000000 AM
SQL>commit;
Commitcomplete.
SQL>select * from v_emp where employee_id=100;
EMPLOYEE_IDFIRST_NAM LAST_NAME                EMAIL                    PHONE_NUMBER         HIRE_DATE
-------------------- ------------------------- --------------------------------------------- ------------------------------
        100 Steven    King                      aaaa                      515.123.4567         17-JUN-11 12.00.00.000000 AM
SQL>update v_emp set email='bbbb' where employee_id=100;
updatev_emp set email='bbbb' where employee_id=100
       *
ERROR atline 1:
ORA-01732:data manipulation operation not legal on this view
说明:一旦提交更新主表emp相关信息后,物化视图v_emp同样也会更新信息.

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-9-28 03:52 , Processed in 0.077932 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表