执行即时指导
Posted
技术标签:
【中文标题】执行即时指导【英文标题】:Execute immediate guidance 【发布时间】:2020-06-24 06:27:32 【问题描述】:我有一个程序,我想定期运行以更新 Oracle 需要的任何内容,以便有效地运行。此过程计算每晚构建的表的统计信息、更新和重建索引。
它会查找以模式开头的表和索引,并构建更新统计信息、重建索引等命令,以便我立即执行。
过去我收到一个 ORA 错误,说我或它缺乏运行权限,但我想知道我是否可以直接执行这些事情。
begin
-- Would add EXECUTE immediate lsql below, but there is some permission issue
-- -execute immediate lsql;
for sc_hub_indexes_record in hub_indexes_cursor
loop
lsql:='alter index '||sc_hub_indexes_record.table_owner||'.'||sc_hub_indexes_record.index_name||' rebuild online parallel;';
dbms_output.put_line(lsql);
execute immediate lsql;
lsql:='DBMS_STATS.GATHER_INDEX_STATS(ownname => ''SC_REPORT_NEW'', indname => '||apostrophe||sc_hub_indexes_record.index_name||apostrophe||';';
dbms_output.put_line(lsql);
execute immediate lsql;
end loop;
for sc_hub_tables_record in hub_tables_cursor
loop
quoted_owner := apostrophe||'SC_REPORT_NEW'||apostrophe;
quoted_table := apostrophe||sc_hub_tables_record.table_name||apostrophe;
lsql:='dbms_stats.gather_table_stat ( ownname => '||quoted_owner||', tabname => '||quoted_table||', estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE );';
dbms_output.put_line(lsql);
-- This gives an error for lack of permission. Not yet sure why.
execute immediate lsql;
end loop;
end;
请注意,如果我只运行 begin alter index;end;/ 输入内容,我的帐户就会工作,只有当我使用它执行执行语句时它才会失败。但是,我不知道如何动态构建这些语句。
【问题讨论】:
只是一个建议。将您的 PL/SQL 代码生成的 SQL 语句写入文件,即 SQL 脚本。然后运行脚本。 调用包不需要动态 SQL,即execute immediate
。直接调用DBMS_STATS.GATHER_INDEX_STATS(ownname => 'SC_REPORT_NEW', indname => sc_hub_indexes_record.index_name);
如果我只运行 begin alter index;end;/ type things,我的帐户就可以工作 - 不确定你的意思,因为 PL/SQL 没有 alter
关键字,所以它必须使用execute immediate
/dbms_sql
。
根据@pifor 的声明,绝对不需要重建索引。并且无需创建工作来收集统计数据。 Oracle 已经有一个每天运行的默认统计作业,并且对需要完成的工作更加智能。你正在努力解决一个不存在的问题。
我想感谢所有答案,因为我从每个人那里学到了一些东西。 @Abra这通常是我所做的,我所有的脚本都被检入源代码管理并单独运行,我只是想显示我运行的内容的sn-p。
【参考方案1】:
“缺少权限”可能是因为默认情况下未启用存储的 PL/SQL 角色:您必须被授予直接权限(无角色)。这不适用于匿名 PL/SQL。见https://asktom.oracle.com/Misc/RolesAndProcedures.html。
旁注:一般情况下,Oracle 中不需要重建索引。
来自AskTom:
询问他们重建的技术原因。
当他们说“当然是表现”时——询问他们的表现 他们在重建之前和重建之后采取的指标。他们不会 有任何(从来没有人这样做,似乎没有人考虑这样做)。 他们会说“相信我会更快”。
当他们说“当然是回收空间”时——问他们“但是要多久 是否需要在指数像之前一样大之前 重建”。你看到他们没有回收任何空间——索引将 再次增长,最终达到它喜欢的稳定状态大小 成为。
如果您需要重建索引,则需要 2 倍的空间 - 您将 有一段时间的旧索引和新索引。如果你这样做 在线,您需要额外的空间来保存所做的更改 在重建期间也是如此。
【讨论】:
以上是关于执行即时指导的主要内容,如果未能解决你的问题,请参考以下文章