Oracle DDL错误PLS-00103,用于创建物化视图
在Oracle 13.0至TOAD的存储过程中,我有以下Oracle DDL代码:Oracle DDL错误PLS-00103,用于创建物化视图,oracle,stored-procedures,plsql,ddl,Oracle,Stored Procedures,Plsql,Ddl,在Oracle 13.0至TOAD的存储过程中,我有以下Oracle DDL代码: --BUILD AND POPULATE MATERIALIZED VIEWS BEGIN EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW WORK.Work1_MV'; EXCEPTION WHEN OTHERS THEN NULL; END; --Create Materialized View (PLS-00103 Error)* CREA
--BUILD AND POPULATE MATERIALIZED VIEWS
BEGIN
EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW WORK.Work1_MV';
EXCEPTION
WHEN OTHERS
THEN NULL;
END;
--Create Materialized View (PLS-00103 Error)*
CREATE MATERIALIZED VIEW WORK.Work1_MV
NOLOGGING
BUILD DEFERRED
AS
SELECT *
FROM WORK.WorkA_V
;
BEGIN
DBMS_MVIEW.REFRESH ('WORK.Work1_MV', 'C', ATOMIC_REFRESH => FALSE);
END;
COMMIT;
--Create Index on Materialized View (PLS-00103 Error)*
CREATE BITMAP INDEX WORK.Work1_MV_MAP1 ON WORK.Work1_MV
(ELEMENT_NAME)
NOLOGGING
COMPUTE STATISTICS;
--Create 2nd Index on Materialized View (PLS-00103 Error)*
CREATE BITMAP INDEX WORK.Work1_MV_MAP2 ON WORK.Work1 MV
(MAP_ID)
NOLOGGING
COMPUTE STATISTICS;
当以上各项单独运行时,它们似乎起作用。但是,当嵌入到存储过程中时;它们无法编译PLS-00103错误,这些错误与我在上述代码中注释的部分有关
完整的错误消息如下所示:
“[错误]PLS-00103(329:5):PLS-00103:在预期以下情况之一时遇到符号“创建”:
(如果循环mod null pragma raise return select update with with with with,则开始案例声明结束异常退出goto)
如果有人能分享正确编译这些语句的解决方案,我将不胜感激
谢谢。除非对表示DDL的字符串变量使用EXECUTE IMMEDIATE,否则不能在PL/SQL块中执行DDL。不能在
PL/SQL
块中直接使用任何DDL
。您必须使用executeimmediate
在动态SQL中使用它。我为您创建了以下内容:
SQL> CREATE OR REPLACE PROCEDURE YEN_CHING_PROC AS
2 --BUILD AND POPULATE MATERIALIZED VIEWS
3 BEGIN
4 BEGIN
5 EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW WORK.Work1_MV';
6 EXCEPTION
7 WHEN OTHERS THEN
8 NULL;
9 END;
10
11 --Create Materialized View (PLS-00103 Error)*
12 EXECUTE IMMEDIATE 'CREATE MATERIALIZED VIEW WORK.Work1_MV
13
14 NOLOGGING
15 BUILD DEFERRED
16 AS
17 SELECT *
18 FROM WORK.WorkA_V
19 '
20 ;
21 --BEGIN
22 DBMS_MVIEW.REFRESH('WORK.Work1_MV', 'C', ATOMIC_REFRESH => FALSE);
23 --END;
24 COMMIT;
25
26 --Create Index on Materialized View (PLS-00103 Error)*
27 EXECUTE IMMEDIATE 'CREATE BITMAP INDEX WORK.Work1_MV_MAP1 ON WORK.Work1_MV
28 (ELEMENT_NAME)
29 NOLOGGING
30 COMPUTE STATISTICS'
31 ;
32
33 --Create 2nd Index on Materialized View (PLS-00103 Error)*
34 EXECUTE IMMEDIATE 'CREATE BITMAP INDEX WORK.Work1_MV_MAP2 ON WORK.Work1 MV
35 (MAP_ID)
36 NOLOGGING
37 COMPUTE STATISTICS';
38
39 END YEN_CHING_PROC;
40 /
Procedure created.
SQL>
干杯 不能在存储过程中直接使用DDL。每个DDL语句都必须是动态SQL语句(即,对每个语句使用
executeimmediate
)。确实要位图索引吗?你确定每次都要删除并重新创建物化视图,而不是仅仅刷新它吗?嗨,贾斯汀,我只是想知道除了位图之外,还有没有更好的方法来创建索引?抱歉,这对我来说有点新鲜。非常感谢Tejash!我真的很感激。这似乎奏效了。