oracle中存储过程中的转义单引号
我有一个要求,我必须为物化视图extact ddl并执行它。我已为物化视图创建脚本,如下所示: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
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()可能是用户真正需要的唯一东西(我意识到这是一个假设)。看起来我们现在以存储过程的形式获得了来自用户的上下文,因此这将需要另一种外观。