1

我正在尝试在我的应用程序中执行物化视图的调整。我开始执行:

 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,但是运行速度慢得令人无法接受)。顾问报告以下错误:

错误报告:
ORA-13600: 在 Advisor 中遇到错误
QSM-03112:无效的 CREATE MATERIALIZED VIEW 语句
ORA-06512: 在“SYS.DBMS_SYS_ERROR”,第 86 行
ORA-06512:在“SYS.PRVT_ACCESS_ADVISOR”,第 202 行
ORA-06512:在“SYS.PRVT_TUNE_MVIEW”,第 1026 行
ORA-06512:在“SYS.DBMS_ADVISOR”,第 754 行
ORA-06512: 在第 1 行
13600. 00000 - “顾问遇到错误\n%s”
*原因:顾问中发生错误。
           此消息之后将有第二条消息给出
           有关错误性质的更多详细信息。
*行动:请参阅顾问文档
           有关第二条错误消息的说明。

但是,没有更多的报告,没有第二条错误消息的痕迹。有谁知道这里有什么问题?我更加惊讶,因为 MV 已经存在并且在数据库中工作,尽管速度很慢。

在相关说明中,有谁知道如何在 SQL Developer 中输入多行字符串。当我尝试类似的事情时:

execute :mvddl :='create materialized view MV_FOO_BAR
build immediate
refresh fast on commit
...
';

SQL Developer 在第一行窒息。字符串连接闪过我的脑海,但我有几个 100-150 行的 MV,我讨厌为每一个手动做。

4

1 回答 1

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;
/
于 2009-03-20T15:32:39.457 回答