我正在尝试在我的应用程序中调整物化视图。我开始执行:
dbms_advisor.tune_mview()
过程,并将以下代码写入Oracle SQL Developer的SQL_Worksheet:
variable mvtask varchar2(100);
variable mvddl varchar2(4000);
execute :mvtask := 'MV_FOO_BAR';
execute select query into :mvddl from user_mviews where view_name = 'MV_FOO_BAR';
execute dbms_advisor.tune_mview(:mvtask, :mvddl);
select * from user_tune_mview;
显然,物化视图已经创建(使用refresh fast on commmit
,但运行速度慢得令人无法接受)。顾问报告以下错误:
Error report: ORA-13600: error encountered in Advisor QSM-03112: Invalid CREATE MATERIALIZED VIEW statement ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86 ORA-06512: at "SYS.PRVT_ACCESS_ADVISOR", line 202 ORA-06512: at "SYS.PRVT_TUNE_MVIEW", line 1026 ORA-06512: at "SYS.DBMS_ADVISOR", line 754 ORA-06512: at line 1 13600. 00000 - "error encountered in Advisor\n%s" *Cause: An error occurred in the Advisor. This message will be followed by a second message giving more details about the nature of the error. *Action: See the Advisor documentation for an explanation of the second error message.
但是,没有更多报道,没有第二条错误消息的痕迹。有谁知道这里的问题是什么?我已经更加惊讶,因为MV已经存在并且在数据库中工作,虽然很慢。
在相关的说明中,有没有人知道如何在SQL Developer中输入多行字符串。当我尝试类似的东西时:
execute :mvddl :='create materialized view MV_FOO_BAR
build immediate
refresh fast on commit
...
';
SQL Developer在第一行窒息。字符串串联在我脑海中浮现,但我有几个100到150行的MV,我讨厌为每一行手动操作。
答案 0 :(得分:6)
(1)当错误13600的文本引用“第二错误消息”时,表示堆栈中的下一个错误 - 在本例中为QSM-03112。
(2)我认为错误的原因是调用TUNE_MVIEW的第二个参数是CREATE MATERIALIZED VIEW语句的全文,但是你只传递查询文本。
(3)对于多行问题,我希望如果你使用显式的PL / SQL匿名块而不是“执行”,它将会起作用,例如:
BEGIN
:mvddl := 'create materialized view MV_FOO_BAR
build immediate
refresh fast on commit
...
';
END;
/