oracle中存储过程中的转义单引号

oracle中存储过程中的转义单引号,oracle,stored-procedures,oracle11g,materialized-views,Oracle,Stored Procedures,Oracle11g,Materialized Views,我有一个要求,我必须为物化视图extact ddl并执行它。我已为物化视图创建脚本,如下所示: CREATE MATERIALIZED VIEW "XXX"."AUD_MV_DCST" ("BUCKET", "ID", "SUM") ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTEN

我有一个要求,我必须为物化视图extact ddl并执行它。我已为物化视图创建脚本,如下所示:

 CREATE MATERIALIZED VIEW "XXX"."AUD_MV_DCST" ("BUCKET", "ID", "SUM")
  ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" 
  BUILD IMMEDIATE
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" 
  REFRESH FAST ON COMMIT
  USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS ENABLE QUERY REWRITE
  AS SELECT TRUNC(STATUS_TIMESTAMP, 'HH24') BUCKET, ID, SUM(1) 
  ..... 
我尝试了以下替换语句,但它不起作用:

select replace(create_script, '''','''''') from dual
打破这个的是什么

'HH24')
打开和关闭大括号。我得到一个错误:

ORA-00907: missing right parenthesis
ORA-06512: at "XXX.createProc", line 67
ORA-06512: at line 2
以下是执行以下操作的存储过程:

create or replace PROCEDURE procPrintOutput
IS
  -- var declarations ....

  BEGIN

    DECLARE
      -- Get the list of Materialized views.
      CURSOR LIST_OF_MatViews
      IS select *
         from user_mviews
         where MVIEW_NAME = 'TEAM_AUD_MV_NR';
      CURSOR CREATE_MatViews
      IS SELECT *
         FROM temp;
    BEGIN
      FOR Mat_View IN LIST_OF_MatViews
      LOOP
        BEGIN
          DBMS_OUTPUT.PUT_LINE('owner : ' || Mat_View.OWNER || ' - name : ' || Mat_View.MVIEW_NAME);

          -- save the create script of views to temp table.
          l_stmt := 'insert into temp SELECT SYS.DBMS_METADATA.get_ddl (''MATERIALIZED_VIEW'', '''
                    || Mat_View.MVIEW_NAME || ''') from dual';

          EXECUTE IMMEDIATE (l_stmt);
          DBMS_OUTPUT.PUT_LINE('inserted ... ');
          -- drop the view.
          --EXECUTE IMMEDIATE (drop_mat_view_logs_stmt || Mat_View.MVIEW_NAME);
          --DBMS_OUTPUT.PUT_LINE('view log dropped ... ');
        END;
      END LOOP;

      -- recreate view using the create script generated in the previous step.
      FOR MV_CREATE_SCRIPT IN CREATE_MatViews
      LOOP
        BEGIN
          DBMS_OUTPUT.PUT_LINE('SCRIPT : ' || MV_CREATE_SCRIPT.matViewLogQuery);
          replace_stmt := 'select replace(''' || MV_CREATE_SCRIPT.matViewLogQuery || ''','';'','' '') from dual';
          DBMS_OUTPUT.PUT_LINE('replace_stmt : ' || replace_stmt);

          EXECUTE IMMEDIATE (replace_stmt) INTO updated_stmt;
          DBMS_OUTPUT.PUT_LINE('Updated SCRIPT ?? ' || updated_stmt);
          --EXECUTE IMMEDIATE(updated_stmt); 
          --DBMS_OUTPUT.PUT_LINE('view recreated ... ');
        END;
      END LOOP;
    END;
  END;

关于如何解决这个问题,有什么建议吗

我尝试了以下方法,但没有任何问题:

SQL> select trunc(current_timestamp, 'HH24') BUCKET from dual;

BUCKET
------------------
20-NOV-15

SQL>
尝试不使用精度说明符并使用:

SQL> select trunc(current_timestamp) BUCKET from dual;

BUCKET
------------------
20-NOV-15

SQL>

HTH

没有上下文,我不确定,但我认为你不想逃避双引号。您希望在
HH24
周围加上单引号,以便让Oracle知道它是一个字符串。是的。我只想转义
HH24
周围的单引号,为什么要转义它们?这将使该语句无效。您是否正在复制DDL并将其粘贴到另一个带引号的字符串中?或者,您是否将DDL的值分配给一个变量,并将该变量传递给
executeimmediate
?如果是后者,不要逃避引用。并打印传递给
executeimmediate
进行调试的值。如果是前者,则查看输出,并获得正确的结果,然后返回到所需的代码更改。如果要将dbms_元数据的结果放入varchar2变量,则无需执行任何操作。引号只需要在文本中转义。如果您只是不加更改地运行它,会发生什么?如果你在复制和粘贴,(a)为什么要使用动态SQL,以及(b)研究交替引用的语法。哦,是的,就是这样。默认情况下,日期和时间戳截断为日期。使用不同的格式模型,您将看到。trunc的默认格式是DD。由于“HH24”)它是返回的脚本的一部分,因此无法工作。Alex Poole和user1860447的观点很好,但我想知道为什么用户只需要截断“hour”。所以(我建议)一个简单的trunc()可能是用户真正需要的唯一东西(我意识到这是一个假设)。看起来我们现在以存储过程的形式获得了来自用户的上下文,因此这将需要另一种外观。