oracle - 动态选择分区

标签 oracle oracle10g

我有一张有几百个分区的表,我通常对最新的 35 个分区感兴趣。

因此,我正在尝试创建可以动态访问这些 View 的 View 。即始终使用最新的以防创建。

查询:

  select PARTITION_NAME,
  PARTITION_POSITION,
  NUM_ROWS,
  AVG_ROW_LEN
  from all_tab_partitions
    where
    table_name = 'MY_TABLE'
    AND PARTITION_NAME <> 'P_LAST'
    AND PARTITION_POSITION < (SELECT MAX(PARTITION_POSITION) 
    FROM all_tab_partitions) - 35
    order by 2 DESC
    ;

似乎返回了我感兴趣的分区名称,但是,我无法使用它的结果来选择分区。例如。:
CREATE OR REPLACE VIEW MY_VIIEW AS
WITH t AS ( [Above query] )
SELECT * FROM 
MY_TABLE PARTITION (SELECT /*+ FIRST_ROWS(1) */ PARTITION_NAME 
                    from t);

(不是实际 View ,只是一个例子)

那我该怎么做呢?如何创建一个始终访问最新分区的 View (“MAX”的执行)?

我正在使用 Oracle 10g

谢谢

最佳答案

您只能使用 PL/SQL 来完成

create or replace package my_table_ is
  type t_records is table of my_table%rowtype;
  function getpart(c_parts sys_refcursor) return t_records pipelined;
end;

create or replace package body my_table_ is
  function getpart(c_parts sys_refcursor) return t_records pipelined is
  v_partition all_tab_partitions.partition_name%type;
  v_row my_table%rowtype;
  c_mytab sys_refcursor;
  begin
    loop
      fetch c_parts into v_partition;
      exit when c_parts%notfound;
      open c_mytab for 'select * from my_table partition ('||v_partition||')';
      loop
        fetch c_mytab into v_row;
        exit when c_mytab%notfound;
        pipe row (v_row);
      end loop;
    end loop;
  end;
end;

现在你可以
select * from table(my_table_.getpart(cursor(<QUERY_RETURNING_PARTITION_NAMES>)));

关于oracle - 动态选择分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22357232/

相关文章:

oracle10g - 如何从oracle数据库获取24小时格式的日期时间?

SQL查找最近的数字

mysql - 将现有值插入新列

sql - PLSQL - 字符串中所有字符的计数

oracle - ORA-12805 :parallel query server died unexpectedly

java - java中OraclePreparedStatement方法setStringForClob

sql - 指示 LINQ to Entities 生成与 Oracle 兼容的 SQL

entity-framework - Entity Framework - 在 Oracle 10g 中删除实体 { 由于对象的当前状态,操作无效}

sql - 从另一个表更新一个表,但也插入

java - 尝试使用 OCI 连接到 Oracle 时 JVM 崩溃