暂无图片
分享
2023-05-26
10G创建MV的异常ORA-00912: input parameter too long

ERROR at line 2:

ORA-00912: input parameter too long

ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 1732

ORA-06512: at line 1

环境:

oracle10G里创建MV,数据源是:oracle19.16 RAC;

SQL:

CREATE MATERIALIZED VIEW FWSZP.FWCATNS_FILFINISHMATERIAL TABLESPACE FWSPDAT_SD NOCACHE LOGGING NOCOMPRESS NOPARALLEL BUILD DEFERRED USING INDEX TABLESPACE FWSPIDX_SD REFRESH FAST WITH PRIMARY KEY AS
select * from FWSZP.FWCATNS_FILFINISHMATERIAL@SZMESP;

收藏
分享
7条回答
默认
最新
好好学习

在AS和SELECT之间添加空格。

暂无图片 评论
暂无图片 有用 2


这么多空格了,还是不行。是个BUG,但19.16又解决不了这个问题。

暂无图片 评论
暂无图片 有用 0
Thomas

原表是DBLINK的远端表,REFRESH FAST WITH PRIMARY KEY,可以实现吗?我只是有点疑惑。

暂无图片 评论
暂无图片 有用 0
题主
2023-05-28
不应该是dblink吗,你有其它方法吗?

1. 将SELECT语句拆分成多条语句,分别创建多个物化视图,然后通过UNION ALL将它们联合在一起。

2. 使用dbms_snapshot填充字段列表。如:

CREATE MATERIALIZED VIEW FWSZP.FWCATNS_FILFINISHMATERIAL TABLESPACE FWSPDAT_SD 
    NOCACHE LOGGING NOCOMPRESS NOPARALLEL BUILD DEFERRED USING INDEX 
    TABLESPACE FWSPIDX_SD
    REFRESH FAST WITH PRIMARY KEY  
AS
SELECT * FROM 
   (SELECT * FROM FWSZP.FWCATNS_FILFINISHMATERIAL@SZMESP)
   WHERE 1=2 
   UNION ALL
SELECT * 
FROM FWSZP.FWCATNS_FILFINISHMATERIAL@SZMESP;

3. 分割CREATE MATERIALIZED VIEW语句,使用dbms_metadata获取完整的DDL:

DECLARE
    sql_stmt VARCHAR2(32000);
BEGIN
    FOR cur IN (SELECT piece FROM 
                 (SELECT dbms_metadata.get_ddl('MATERIALIZED_VIEW', 
                                              'FWSZP.FWCATNS_FILFINISHMATERIAL', 
                                              'SZMESP') 
                  AS ddl 
                     FROM   dual)
                 CONNECT BY LEVEL <= dbms_metadata.get_number_pieces(ddl))
    LOOP
        sql_stmt := sql_stmt || cur.piece;
    END LOOP;
    EXECUTE IMMEDIATE sql_stmt;
END; 
暂无图片 评论
暂无图片 有用 1
Thomas

楼上给的建议,能否解释一下:

1、SELECT * FROM 

   (SELECT * FROM FWSZP.FWCATNS_FILFINISHMATERIAL@SZMESP)
   WHERE 1=2 
   UNION ALL
SELECT * 
FROM FWSZP.FWCATNS_FILFINISHMATERIAL@SZMESP;

为何要这么写呢?union all前面的SQL,显然不会输出任何记录,那这样写的目的何在?

2、为了得到MV的DDL,那简单地:

set long 5000;

SELECT dbms_metadata.get_ddl('MATERIALIZED_VIEW', 

                                              'FWSZP.FWCATNS_FILFINISHMATERIAL', 
                                              'SZMESP')  FROM DUAL;

不就可以了么?

暂无图片 评论
暂无图片 有用 0

已经解决,MOS上给出说解决方法:

在数据源DB里,创建mlog时,先对session做:

alter session set events '10978 trace name context forever, level 512';

--2.19CProd Drop Mlog:
DROP MATERIALIZED VIEW LOG ON FWSZP.FWCATNS_FILFINISHMATERIAL;
--3.19CProd Create Mlog:
CREATE MATERIALIZED VIEW LOG ON FWSZP.FWCATNS_FILFINISHMATERIAL tablespace SNAPLOG WITH PRIMARY KEY;

---4.然后创建MV:

CREATE MATERIALIZED VIEW FWSZP.FWCATNS_FILFINISHMATERIAL TABLESPACE FWSPDAT_SD NOCACHE LOGGING NOCOMPRESS NOPARALLEL BUILD DEFERRED USING INDEX TABLESPACE FWSPIDX_SD REFRESH FAST WITH PRIMARY KEY AS 
select * from FWSZP.FWCATNS_FILFINISHMATERIAL@SZMESP

暂无图片 评论
暂无图片 有用 0
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏