ITPub博客

首页 > 数据库 > Oracle > 获取Oracle number类型分区表最后一个分区是否存在数据

获取Oracle number类型分区表最后一个分区是否存在数据

原创 Oracle 作者:winnzheng 时间:2025-03-11 15:25:19 0 删除 编辑

--SELECT HOST_NAME  FROM v$instance;

DBMS_OUTPUT.PUT_LINE(CHR(27) || '[31m' || '这是红色文字' || CHR(27) || '[0m');

查看分区表分区键类型为number的

SELECT a.TABLE_NAME ,b.OWNER  FROM ALL_TAB_COLUMNS a,dba_PART_KEY_COLUMNS b

WHERE  a.owner='username' AND b.object_type='TABLE' AND a.TABLE_NAME =b.name AND a.COLUMN_NAME =b.COLUMN_NAME

AND a.DATA_TYPE IN ('NUMBER')

查看所有分区表及分区键类型

SELECT b.*,a.DATA_TYPE  FROM ALL_TAB_COLUMNS a,dba_PART_KEY_COLUMNS b

WHERE  a.owner='username' AND b.object_type='TABLE' AND a.TABLE_NAME =b.name AND a.COLUMN_NAME =b.COLUMN_NAME

ORDER BY a.DATA_TYPE

获取分区键为非时间的分区表:

DECLARE

    CURSOR c_tables IS

        SELECT a.TABLE_NAME ,b.OWNER  FROM ALL_TAB_COLUMNS a,dba_PART_KEY_COLUMNS b

WHERE  a.owner='username' AND b.object_type='TABLE' AND a.TABLE_NAME =b.name AND a.COLUMN_NAME =b.COLUMN_NAME

AND a.DATA_TYPE IN ('NUMBER'); -- 替换为你的模式名称

    v_table_name ALL_TAB_COLUMNS.table_name%TYPE;

    v_owner ALL_TAB_COLUMNS.owner%TYPE;

    v_partition_name VARCHAR2(100);

    v_count INTEGER;

BEGIN

    FOR r_table IN c_tables LOOP

        v_table_name := r_table.table_name;

        v_owner := r_table.owner;

        -- 获取分区信息,查找倒数第10个分区

        SELECT partition_name

        INTO v_partition_name

        FROM (

            SELECT partition_name

            FROM all_tab_partitions

            WHERE table_name = v_table_name AND TABLE_OWNER = v_owner

            ORDER BY partition_position DESC

        )

        WHERE ROWNUM < 21

        OFFSET 9 ROWS FETCH NEXT 1 ROWS ONLY;  -- 取倒数第10个分区

        -- 检查该分区是否有数据 set serveroutput on

       

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_owner || '.' || v_table_name || ' PARTITION(' || v_partition_name || ')' INTO v_count;

        IF v_count > 0 THEN

        DBMS_OUTPUT.ENABLE(1000000);

--DBMS_OUTPUT.PUT_LINE(CHR(27) || '[31m' || '注意,倒数第10个分区存在数据' || CHR(27) || '[0m');

            DBMS_OUTPUT.PUT_LINE(CHR(27) || '[33m' || 'Table: ' || v_table_name || ', Partition: ' || v_partition_name || ' has ' || v_count || ' rows.'  || CHR(27) || '[0m');

        ELSE

        DBMS_OUTPUT.ENABLE(1000000);

--DBMS_OUTPUT.PUT_LINE(CHR(27) || '[34m' || '倒数第10个分区不存在数据' || CHR(27) || '[0m');

            DBMS_OUTPUT.PUT_LINE(CHR(27) || '[32m' || 'Table: ' || v_table_name || ', Partition: ' || v_partition_name || ' is empty.'  || CHR(27) || '[0m');

        END IF;

    END LOOP;

END;

/

查看固定表的分区信息

DECLARE

    CURSOR c_tables IS

        SELECT table_name, owner

        FROM all_part_tables

        WHERE owner = 'username' AND PARTITION_COUNT > 30 and table_name in ('table1','table2'); -- 替换为你的模式名称

    v_table_name all_part_tables.table_name%TYPE;

    v_owner all_part_tables.owner%TYPE;

    v_partition_name VARCHAR2(100);

    v_count INTEGER;

BEGIN

    FOR r_table IN c_tables LOOP

        v_table_name := r_table.table_name;

        v_owner := r_table.owner;

        -- 获取分区信息,查找倒数第10个分区

        SELECT partition_name

        INTO v_partition_name

        FROM (

            SELECT partition_name

            FROM all_tab_partitions

            WHERE table_name = v_table_name AND TABLE_OWNER = v_owner

            ORDER BY partition_position DESC

        )

        WHERE ROWNUM < 21

        OFFSET 9 ROWS FETCH NEXT 1 ROWS ONLY;  -- 取倒数第10个分区

        -- 检查该分区是否有数据 set serveroutput on

       

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_owner || '.' || v_table_name || ' PARTITION(' || v_partition_name || ')' INTO v_count;

        IF v_count > 0 THEN

        DBMS_OUTPUT.ENABLE(1000000);

--DBMS_OUTPUT.PUT_LINE(CHR(27) || '[31m' || '注意,倒数第10个分区存在数据' || CHR(27) || '[0m');

            DBMS_OUTPUT.PUT_LINE(CHR(27) || '[33m' || 'Table: ' || v_table_name || ', Partition: ' || v_partition_name || ' has ' || v_count || ' rows.'  || CHR(27) || '[0m');

        ELSE

        DBMS_OUTPUT.ENABLE(1000000);

--DBMS_OUTPUT.PUT_LINE(CHR(27) || '[34m' || '倒数第10个分区不存在数据' || CHR(27) || '[0m');

            DBMS_OUTPUT.PUT_LINE(CHR(27) || '[32m' || 'Table: ' || v_table_name || ', Partition: ' || v_partition_name || ' is empty.'  || CHR(27) || '[0m');

        END IF;

    END LOOP;

END;

/

查看分区数量大于30的表

DECLARE

    CURSOR c_tables IS

        SELECT table_name, owner

        FROM all_part_tables

        WHERE owner = 'username' AND PARTITION_COUNT > 30 ; -- 替换为你的模式名称

    v_table_name all_part_tables.table_name%TYPE;

    v_owner all_part_tables.owner%TYPE;

    v_partition_name VARCHAR2(100);

    v_count INTEGER;

BEGIN

    FOR r_table IN c_tables LOOP

        v_table_name := r_table.table_name;

        v_owner := r_table.owner;

        -- 获取分区信息,查找倒数第10个分区

        SELECT partition_name

        INTO v_partition_name

        FROM (

            SELECT partition_name

            FROM all_tab_partitions

            WHERE table_name = v_table_name AND TABLE_OWNER = v_owner

            ORDER BY partition_position DESC

        )

        WHERE ROWNUM < 21

        OFFSET 9 ROWS FETCH NEXT 1 ROWS ONLY;  -- 取倒数第10个分区

        -- 检查该分区是否有数据 set serveroutput on

       

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_owner || '.' || v_table_name || ' PARTITION(' || v_partition_name || ')' INTO v_count;

        IF v_count > 0 THEN

        DBMS_OUTPUT.ENABLE(1000000);

--DBMS_OUTPUT.PUT_LINE(CHR(27) || '[31m' || '注意,倒数第10个分区存在数据' || CHR(27) || '[0m');

            DBMS_OUTPUT.PUT_LINE(CHR(27) || '[33m' || 'Table: ' || v_table_name || ', Partition: ' || v_partition_name || ' has ' || v_count || ' rows.'  || CHR(27) || '[0m');

        ELSE

        DBMS_OUTPUT.ENABLE(1000000);

--DBMS_OUTPUT.PUT_LINE(CHR(27) || '[34m' || '倒数第10个分区不存在数据' || CHR(27) || '[0m');

            DBMS_OUTPUT.PUT_LINE(CHR(27) || '[32m' || 'Table: ' || v_table_name || ', Partition: ' || v_partition_name || ' is empty.'  || CHR(27) || '[0m');

        END IF;

    END LOOP;

END;

/

SELECT partition_name

            FROM all_tab_partitions

            WHERE table_name = 'table1' AND TABLE_OWNER = 'username'

            ORDER BY partition_position DESC

select count(*) from username.table2 partition(P35);

SELECT partition_name

                FROM (

            SELECT partition_name

            FROM all_tab_partitions

            WHERE table_name = 'table2' AND TABLE_OWNER = 'username'

            ORDER BY partition_position DESC

        )

        WHERE ROWNUM < 20

        OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;

SELECT table_name, owner,PARTITION_COUNT

        FROM all_part_tables

        WHERE owner = 'username' AND PARTITION_COUNT > 30;

cat check_partition.sh

seq1=`sqlplus -S "/ as sysdba"<<'EOF'

set heading off

set pagesize 0;

set feedback off;

set verify off;

set echo off;

select count(1) from user1.EDC_LOT_SUM_NEW           partition(EDC_LOT_SUM_NEW_202910);

quit;

EOF`

seq3=`sqlplus -S "/ as sysdba"<<'EOF'

set heading off

set pagesize 0;

set feedback off;

set verify off;

set echo off;

select count(1) from user1.OFFLINE_LOT_SUM_NEW       partition(OFFLINE_LOT_SUM_NEW_202910);

quit;

EOF`

seq6=`sqlplus -S "/ as sysdba"<<'EOF'

set heading off

set pagesize 0;

set feedback off;

set verify off;

set echo off;

select count(1) from user1.LOT_QTIME_HIST            partition(LOT_Q_TIME_HIST_202910);

quit;

EOF`

seq10=`sqlplus -S "/ as sysdba"<<'EOF'

set heading off

set pagesize 0;

set feedback off;

set verify off;

set echo off;

select count(1) from user1.OFFLINE_SHOT_NEW          partition(OFFLINE_SHOT_NEW_202910);

quit;

EOF`

seq11=`sqlplus -S "/ as sysdba"<<'EOF'

set heading off

set pagesize 0;

set feedback off;

set verify off;

set echo off;

select count(1) from user1.EDC_WAFER_SUM_NEW         partition(EDC_WAFER_SUM_NEW_202910);

quit;

EOF`

seq18=`sqlplus -S "/ as sysdba"<<'EOF'

set heading off

set pagesize 0;

set feedback off;

set verify off;

set echo off;

select count(1) from user1.EQP_STATUS_HIST           partition(EQP_STATUS_HIST_202910);

quit;

EOF`

if [ $seq1 -eq 0 ]&& [ $seq3 -eq 0 ]&& [ $seq6 -eq 0 ]&& [ $seq10 -eq 0 ]&& [ $seq11 -eq 0 ]&& [ $seq12 -eq 0 ]&& [ $seq13 -eq 0 ]&& [ $seq14 -eq 0 ]&& [ $seq15 -eq 0 ]&& [ $seq18 -eq 0 ] ; then

    echo 0 > /tmp/chk_partition_monitor.log

else

    echo 1 > /tmp/chk_partition_monitor.log

fi


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70031606/viewspace-3075453/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 文件备份传输
请登录后发表评论 登录
全部评论
Happy --开心 Appreciation --心怀感恩 Passion --激情四溢 Performance --出类拔萃 Young --充满活力

注册时间:2023-09-04

  • 博文量
    30
  • 访问量
    24391