【发布时间】:2019-11-19 14:45:55
【问题描述】:
我在 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)*
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 错误进行编译。
完整的错误信息如下:
"[ERROR] PLS-00103 (329: 5):PLS-00103:在预期以下情况之一时遇到符号“CREATE”: (begin case declare end exception exit for goto if loop mod null pragma raise return select update while with)"
如果有人能分享正确编译这些语句的解决方案,我将不胜感激。
谢谢。
【问题讨论】:
-
您不能在存储过程中直接使用 DDL。每个 DDL 语句都必须是动态 SQL 语句(即,对每个语句使用
execute immediate)。您确定要位图索引吗?您确定要每次都删除并重新创建物化视图,而不是仅仅刷新它吗? -
嗨贾斯汀,我只是想知道除了位图之外还有更好的方法来创建索引吗?抱歉,这对我来说有点新鲜。
标签: oracle stored-procedures plsql ddl