【问题标题】:Need to iterate the result and then execute immediate each result using pl/sql需要迭代结果,然后使用 pl/sql 立即执行每个结果
【发布时间】:2020-08-13 08:49:23
【问题描述】:

所以我有这个查询:

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 每个语句。

【问题讨论】:

    标签: sql oracle loops plsql execute-immediate


    【解决方案1】:

    基本上,您会将写入的SELECT 转换为游标 FOR 循环并执行它。

    方法如下;我无法测试它,但是 - 如果 SELECT 返回你想要的,那就是这样做的方法。

    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>
    

    【讨论】:

    • 我明白了,试了一下说我需要声明 l_alter 标识符:ORA-06550:第 16 行,第 25 列:PLS-00201:必须声明标识符 'L_ALTER' ORA-06550:第 16 行,第 7 列:PL/SQL:语句被忽略
    • 啊,抱歉……应该是EXECUTE IMMEDIATE cur_r.l_alter;
    • 嗯,我不知道是不是因为SQL版本的原因,但是sql delevoper没有识别它,我不得不这样写:“cur_r in l_alter”。即使在那之后它仍然说循环子句有问题,这是错误,它更容易:ORA-06550:第 2 行,第 13 列:PLS-00103:遇到符号“。”当预期以下之一时:在 ORA-06550:第 15 行,第 4 列:PLS-00103:在预期以下之一时遇到符号“LOOP”:),和或
    • 不应该。我连接到我的数据库并运行该代码;工作正常。当然,关于我没有您的索引这一事实,但是 - 该代码中没有 error
    • 好的,那么这方面将不得不挖掘更多,但非常感谢您的帮助!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多