如何用动态SQL创建索引?现有PL/SQL代码报错求排查
动态SQL创建索引的PL/SQL代码错误排查
错误原因分析
你的代码存在几个关键问题:
- Q引用语法错误:Oracle的Q-quoted字符串语法为
q'[分隔符]内容[分隔符]',你写成了q '!(Q与单引号之间多了空格),导致解析器无法识别正确的引用格式,这是触发PLS-00103错误的直接原因。 - 嵌套动态SQL冗余且写法错误:外层已通过
execute immediate调用匿名块,内部无需再嵌套execute immediate执行创建索引语句;最后select 1 from dual的动态SQL完全多余,直接赋值即可。 - 绑定变量使用不规范:外层调用匿名块时,
using out l1的写法不符合匿名块参数传递规则,需在匿名块定义时声明参数。
修正后的代码
declare l1 integer; begin execute immediate q'! begin CREATE INDEX S_ACCNT_ATT_P1 ON S_ACCNT_ATT(ROW_ID) PARALLEL 4; CREATE INDEX S_ACCNT_ATT_U1 ON S_ACCNT_ATT(PAR_ROW_ID, FILE_NAME, FILE_EXT, CONFLICT_ID) PARALLEL 4; :l1 := 1; end;!' using out l1; end; /
额外优化建议
- 若无需返回值
l1,可直接简化代码,去掉变量与参数传递:
begin execute immediate q'! CREATE INDEX S_ACCNT_ATT_P1 ON S_ACCNT_ATT(ROW_ID) PARALLEL 4; CREATE INDEX S_ACCNT_ATT_U1 ON S_ACCNT_ATT(PAR_ROW_ID, FILE_NAME, FILE_EXT, CONFLICT_ID) PARALLEL 4; !'; end; /
- 创建索引后建议执行
ALTER INDEX ... NOPARALLEL;,避免后续查询默认使用并行模式造成资源浪费。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

