当前位置: 代码迷 >> Oracle开发 >> 这点代码哪里有有关问题
  详细解决方案

这点代码哪里有有关问题

热度:74   发布时间:2016-04-24 06:27:11.0
这点代码哪里有问题?
自己写了个存储过程,打算弄成JOBS每天执行,目地是删除分区表TRACE_BASE_INFO_ASK中旧分区,只保留5个最新的分区。
如果删除分区是出错,则将异常信息记录到表ExpTable中
现在创建这存储过程后,系统提示该存储过程处于无效状态,但不知道存储过程哪里出的错,有劳高手指明

代码如下:

CREATE OR REPLACE procedure SYSTEM.AutoDrop_ASKPart
as
BEGIN

    declare i_rowcount int;
    
    begin 

        SELECT count(1) into i_rowcount FROM ALL_TAB_PARTITIONS WHERE TABLE_NAME='TRACE_BASE_INFO_ASK' AND PARTITION_NAME LIKE 'SYS_%';

        if i_rowcount>5 then
            declare cursor c_job is
            SELECT PARTITION_NAME FROM ALL_TAB_PARTITIONS 
            WHERE TABLE_NAME='TRACE_BASE_INFO_ASK' and PARTITION_NAME like 'SYS_%' and rownum<=(i_rowcount-5);

            c_row c_job%rowtype;
            begin
                for c_row in c_job loop
                begin
                    execute immediate 'alter table TRACE_BASE_INFO_ASK drop partition ' || c_row.PARTITION_NAME;  
                    exception 
                    when others then
                    insert into ExpTable(ExpText)VALUES(SQLERRM);
                end;
                end loop;

            end;
            
        end if;

    end;
    
END; 
------解决思路----------------------
随意给你调整了下 (未编译测试)

CREATE OR REPLACE PROCEDURE system.autodrop_askpart IS
  i_rowcount NUMBER;
  CURSOR c_job(p_rowcount) IS
    SELECT partition_name
      FROM all_tab_partitions
     WHERE table_name = 'TRACE_BASE_INFO_ASK'
       AND partition_name LIKE 'SYS_%'
       AND rownum <= (p_rowcount - 5);

  c_row c_job%ROWTYPE;
BEGIN

  SELECT COUNT(1)
    INTO i_rowcount
    FROM all_tab_partitions
   WHERE table_name = 'TRACE_BASE_INFO_ASK'
     AND partition_name LIKE 'SYS_%';

  IF i_rowcount > 5 THEN
  
    BEGIN
      OPEN c_job(i_rowcount);
    
      LOOP
        FETCH c_job
          INTO c_row;
        EXIT WHEN c_job%NOTFOUND;
        BEGIN
          EXECUTE IMMEDIATE 'alter table TRACE_BASE_INFO_ASK drop partition ' 
------解决思路----------------------

                            c_row.partition_name;
        EXCEPTION
          WHEN OTHERS THEN
            INSERT INTO exptable
              (exptext)
            VALUES
              (SQLERRM);
        END;
      END LOOP;
      CLOSE c_job;
    
    END;
  
  END IF;

END;


------解决思路----------------------

-- 在 1# 的基础上编辑的
-- 1 。游标的参数,加一个数据类型
--  2。SQLERRM 先赋给一个变量
CREATE OR REPLACE PROCEDURE autodrop_askpart IS
  i_rowcount NUMBER;
  i_error VARCHAR2(500);

  CURSOR c_job(p_rowcount varchar2) IS
    SELECT partition_name
      FROM all_tab_partitions
     WHERE table_name = 'TRACE_BASE_INFO_ASK'
       AND partition_name LIKE 'SYS_%'
       AND rownum <= (p_rowcount - 5);

  c_row c_job%ROWTYPE;
BEGIN

  SELECT COUNT(1)
    INTO i_rowcount
    FROM all_tab_partitions
   WHERE table_name = 'TRACE_BASE_INFO_ASK'
     AND partition_name LIKE 'SYS_%';

  IF i_rowcount > 5 THEN

    BEGIN
      OPEN c_job(i_rowcount);

      LOOP
        FETCH c_job
          INTO c_row;
        EXIT WHEN c_job%NOTFOUND;
        BEGIN
          EXECUTE IMMEDIATE 'alter table TRACE_BASE_INFO_ASK drop partition ' 
------解决思路----------------------

                            c_row.partition_name;
        EXCEPTION
          WHEN OTHERS THEN
            i_error:= SQLERRM;
            INSERT INTO exptable
              (exptext)
            select i_error from dual ;
        END;
      END LOOP;
      CLOSE c_job;

    END;

  END IF;

END;

  相关解决方案