需要迭代结果,然后使用 pl/sql 立即执行每个结果
Need to iterate the result and then execute immediate each result using pl/sql
所以我有这个查询:
select 'alter index '||a.index_owner||'.'||a.index_name|| ' rebuild partition '||a.partition_name
from dba_ind_partitions a
where a.index_name in ('IDX_PI_T_BSCS_CONTRACT_HISTOR2', 'IDX_PI_T_BSCS_CONTRACT_HISTOR3', 'IDX_PI_T_BSCS_RATEPLAN_HIST_C1')
and a.status = 'UNUSABLE'
我需要遍历结果然后 execute immediate
每个语句。
基本上,您会将写入的 SELECT
转换为游标 FOR 循环并 执行 它。
方法如下;我无法测试它,但是 - 如果 SELECT
returns 你想要什么,那就是这样做的方式。
SQL> show user
USER is "SYS"
SQL> BEGIN
2 FOR cur_r
3 IN (SELECT 'alter index '
4 || a.index_owner
5 || '.'
6 || a.index_name
7 || ' rebuild partition '
8 || a.partition_name
9 as l_alter
10 FROM dba_ind_partitions a
11 WHERE a.index_name IN ('IDX_PI_T_BSCS_CONTRACT_HISTOR2',
12 'IDX_PI_T_BSCS_CONTRACT_HISTOR3',
13 'IDX_PI_T_BSCS_RATEPLAN_HIST_C1')
14 AND a.status = 'UNUSABLE')
15 LOOP
16 EXECUTE IMMEDIATE cur_r.l_alter;
17 END LOOP;
18 END;
19 /
PL/SQL procedure successfully completed.
SQL>
所以我有这个查询:
select 'alter index '||a.index_owner||'.'||a.index_name|| ' rebuild partition '||a.partition_name
from dba_ind_partitions a
where a.index_name in ('IDX_PI_T_BSCS_CONTRACT_HISTOR2', 'IDX_PI_T_BSCS_CONTRACT_HISTOR3', 'IDX_PI_T_BSCS_RATEPLAN_HIST_C1')
and a.status = 'UNUSABLE'
我需要遍历结果然后 execute immediate
每个语句。
基本上,您会将写入的 SELECT
转换为游标 FOR 循环并 执行 它。
方法如下;我无法测试它,但是 - 如果 SELECT
returns 你想要什么,那就是这样做的方式。
SQL> show user
USER is "SYS"
SQL> BEGIN
2 FOR cur_r
3 IN (SELECT 'alter index '
4 || a.index_owner
5 || '.'
6 || a.index_name
7 || ' rebuild partition '
8 || a.partition_name
9 as l_alter
10 FROM dba_ind_partitions a
11 WHERE a.index_name IN ('IDX_PI_T_BSCS_CONTRACT_HISTOR2',
12 'IDX_PI_T_BSCS_CONTRACT_HISTOR3',
13 'IDX_PI_T_BSCS_RATEPLAN_HIST_C1')
14 AND a.status = 'UNUSABLE')
15 LOOP
16 EXECUTE IMMEDIATE cur_r.l_alter;
17 END LOOP;
18 END;
19 /
PL/SQL procedure successfully completed.
SQL>