创建物化视图 报错 ora-12060:预建表的形式与定义查询不匹配

本文详细介绍了如何在Oracle数据库中使用PREBUILD方式创建物化视图,并通过WITHREDUCEDPRECISION解决精度匹配问题,同时涵盖了物化视图的刷新、触发器设置及主键创建等关键步骤。

如果以PREBUILD方式建立物化视图,除非指定了WITH REDUCED PRECISION语句(在on prebuilt table后面加上with reduced precision就可以了),否则列的精度必须满足SELECT表达式的精度;

--1.在ods用户下创建表,删表空间,主键,添加lastmodifydate 默认系统时间,注释
create table FPGL_FPXX
(
  id           VARCHAR2(32) not null,
  fplx         VARCHAR2(3),
  sksbbh       VARCHAR2(32),
  kpzdbs       VARCHAR2(32),
  fpdm         VARCHAR2(12),
  fphm         VARCHAR2(8),
  skm          VARCHAR2(200 CHAR),
  jym          VARCHAR2(22),
  ewm          VARCHAR2(4000),
  kprq         DATE,
  ghdwmc       VARCHAR2(100 CHAR),
  ghdwsh       VARCHAR2(20),
  ghdwdzdh     VARCHAR2(100 CHAR),
  ghdwyhzh     VARCHAR2(100 CHAR),
  hjje         NUMBER(12,2),
  hjse         NUMBER(12,2),
  jshj         NUMBER(12,2),
  xsdwmc       VARCHAR2(100 CHAR),
  xsdwsh       VARCHAR2(20),
  xsdwdzdh     VARCHAR2(100 CHAR),
  xsdwyhzh     VARCHAR2(100 CHAR),
  skr          VARCHAR2(16 CHAR),
  bz           VARCHAR2(400 CHAR),
  fhr          VARCHAR2(16 CHAR),
  kpr          VARCHAR2(16 CHAR),
  zfsbz        CHAR(1),
  dybz         CHAR(1),
  qdbz         CHAR(1),
  kpbz         CHAR(1),
  zfbz         CHAR(1),
  djly         CHAR(1),
  djid         VARCHAR2(32),
  operate_user VARCHAR2(32),
  operate_time DATE,
  delete_tag   CHAR(1) default 'N',
  enabled      CHAR(1) default 'Y',
  org_id       VARCHAR2(32),
  tenant_id    VARCHAR2(32),
  gfzjlx       VARCHAR2(3),
  gfzjh        VARCHAR2(60),
  gfyx         VARCHAR2(200),
  gfsjh        VARCHAR2(100),
  gfxm         VARCHAR2(100),
  yfpdm        VARCHAR2(12),
  yfphm        VARCHAR2(8),
  zsfs         CHAR(1),
  kce          NUMBER(12,2),
  fpzt         CHAR(1),
  pch          VARCHAR2(80),
  lastmodifydate  date default sysdate
) tablespace ODS_DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
comment on column FPGL_FPXX.lastmodifydate
  is '最后更新日期';
  
--2.在ods用户下改表名
ALTER TABLE FPGL_FPXX RENAME to HX_FPGL_FPXX;

--3.在ods用户下创建物化视图(如果不加with reduced precision,就会报错误:ora-12060:预建表的形式与定义查询不匹配,但是有时候不加也不报错,那是因为建表的时候没有指定类似于这样的精度(VARCHAR2(16 CHAR)))
CREATE MATERIALIZED VIEW HX_FPGL_FPXX ON PREBUILT TABLE with reduced precision REFRESH force ON DEMAND with primary key AS
SELECT
id                           ,
fplx                         ,
sksbbh                       ,
kpzdbs                       ,
fpdm                         ,
fphm                         ,
skm                          ,
jym                          ,
ewm                          ,
kprq                         ,
ghdwmc                       ,
ghdwsh                       ,
ghdwdzdh                     ,
ghdwyhzh                     ,
hjje                         ,
hjse                         ,
jshj                         ,
xsdwmc                       ,
xsdwsh                       ,
xsdwdzdh                     ,
xsdwyhzh                     ,
skr                          ,
bz                           ,
fhr                          ,
kpr                          ,
zfsbz                        ,
dybz                         ,
qdbz                         ,
kpbz                         ,
zfbz                         ,
djly                         ,
djid                         ,
operate_user                 ,
operate_time                 ,
delete_tag                   ,
enabled                      ,
org_id                       ,
tenant_id                    ,
gfzjlx                       ,
gfzjh                        ,
gfyx                         ,
gfsjh                        ,
gfxm                         ,
yfpdm                        ,
yfphm                        ,
zsfs                         ,
kce                          ,
fpzt                         ,
pch
FROM HX_KPXT.FPGL_FPXX@TODHSK;

--4.在ods触发器
CREATE OR REPLACE TRIGGER TG_HX_FPGL_FPXX
---进行更新操作时候
 BEFORE UPDATE ON HX_FPGL_FPXX
---任何一行
FOR EACH ROW
BEGIN
----将修改时间插入datadate中
:NEW.LastModifyDate := SYSDATE;
END; 

--5.全量刷新物化视图(C是全量,F是增量)
call dbms_mview.refresh('HX_FPGL_FPXX','C');

--6.创建主键,表空间   
  alter table HX_FPGL_FPXX
  add constraint PK_HX_FPGL_FPXX primary key (ID)
  using index 
  tablespace ODS_IDX
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
    pctincrease 0
  );

### impdp 报错 ORA-39039 和 ORA-31655 的解决方法 在使用 Oracle 数据泵(`impdp`)进行数据导入时,若出现 `ORA-39039` 和 `ORA-31655` 错误,通常示主加载成功,但未找到可导入的数据或元数据对象。此问题可能由多个因素引起,包括导入参数配置当、DMP 文件内容异常、权限缺失或对象存在等。 #### 常见原因解决方案 1. **未选择有效的导入对象** 若在导入命令中未正确指定对象类型(如 `TABLES`、`SCHEMAS`、`CONTENT` 等),可能导致系统未识别到任何可导入的元数据或数据对象,从而触发 `ORA-31655` 错误。确保在命令中明确指定导入对象,并检查 DMP 文件是否包含对应对象。 示例命令: ```bash impdp username/password directory=dir_name dumpfile=export.dmp schemas=center_admin ``` 若 DMP 文件中未包含 `center_admin` 模式下的任何对象,将导致错误[^3]。 2. **DMP 文件内容异常或完整** 若导出的 DMP 文件缺少有效对象或元数据,也可能导致 `ORA-31655` 错误。可使用 `impdp` 的 `SQLFILE` 参数生成 SQL 脚本,检查导出文件中的对象定义,确认其完整性。 示例命令: ```bash impdp username/password directory=dir_name dumpfile=export.dmp sqlfile=metadata.sql ``` 分析生成的 `metadata.sql` 文件,验证是否包含有效的、索引、约束等定义[^3]。 3. **方案达式配置错误** `ORA-39039` 错误通常 `SCHEMAS` 或 `REMAP_SCHEMA` 参数配置当有关。若指定的 schema 存在或达式格式错误,将导致无法解析有效的导入方案。确保导入命令中使用的 schema 名称 DMP 文件一致,或在目标数据库中已存在。 示例命令: ```bash impdp username/password directory=dir_name dumpfile=export.dmp schemas=JCMSUSR01 remap_schema=JCMSUSR01:JCMSUSR02 ``` 若 `JCMSUSR01` 在目标数据库中存在,需在导入前手动创建该用户,或使用 `REMAP_SCHEMA` 映射到已有 schema[^1]。 4. **导入权限足** 若执行导入的用户缺乏必要的权限(如 `DATAPUMP_IMP_FULL_DATABASE` 角色、`READ` 权限于指定目录),可能导致对象无法正确加载。确保导入用户具备以下权限: ```sql GRANT DATAPUMP_IMP_FULL_DATABASE TO username; GRANT READ ON DIRECTORY dir_name TO username; ``` 此外,若 DMP 文件中引用了存在的角色(如 `SCOTT_READONLY_ROLE`),也应提前创建[^2]。 5. **并行参数设置当** 若使用 `PARALLEL` 参数但未提供足够数量的 DMP 文件,可能引发性能问题或导入失败。确保并行度超过 DMP 文件数量,避免多个线程争用同一文件。 示例命令: ```bash impdp username/password directory=dir_name dumpfile=export1.dmp,export2.dmp parallel=2 ``` 若仅有一个 DMP 文件而设置 `parallel=2`,将导致资源竞争,影响导入流程[^2]。 #### 示例:检查 DMP 文件内容并执行导入 ```bash # 生成 SQL 文件以检查元数据 impdp username/password directory=dir_name dumpfile=export.dmp sqlfile=metadata.sql # 查看生成的 SQL 文件内容 cat metadata.sql # 确认内容无误后执行导入 impdp username/password directory=dir_name dumpfile=export.dmp schemas=center_admin ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值