用于创建实例化视图的Oracle DDL错误PLS-00103

时间:2019-11-19 14:45:55

标签: oracle stored-procedures plsql ddl

我通过TOAD在Oracle 13.0中的存储过程中具有以下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错误进行编译。

完整的错误消息如下:

“ [错误] PLS-00103(329:5):PLS-00103:在预期以下情况之一时遇到符号“ CREATE”: (如果循环模式为null,pragma引发return select select update,则开始时声明goto的结束异常退出)“

如果有人可以共享解决方案以正确编译这些语句,我将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

您不能直接在DDL块中使用任何PL/SQL。您必须使用EXECUTE IMMEDIATE在动态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>

干杯!

答案 1 :(得分:0)

除非在表示DDL的字符串变量上使用EXECUTE IMMEDIATE,否则您不能在PL / SQL块中执行DDL。