【问题标题】:how to find partition of record oracle如何找到记录oracle的分区
【发布时间】:2012-11-19 13:03:09
【问题描述】:

我有一张桌子,上面有一个分区。

有 16 个哈希分区,从 SUBSCRIBER_01 .. 等开始

表名:订阅者

分区列:CUSTOMER_ID (VARCHAR2 10)

数据库:11g

如何找到记录的分区?

点赞 Customer_ID=933587

【问题讨论】:

    标签: database oracle plsql oracle11g database-partitioning


    【解决方案1】:

    选择行的rowid,DBMS_RowID.RowID_Object()过程将提取数据对象id。

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm#i997153

    在数据字典中查找该数据对象 id 并读取 subobject_name。

    例如:

       SELECT dbms_rowid.rowid_object(ROWID) data_object_id
       FROM INVOICE
       WHERE INVOICE_ID = 2268041139:
    
       -- data_object_id = 546512
    
       select * from user_objects where data_object_id = 546512;
    
       -- SUBOBJECT_NAME = 'PART_P2099_P00'     
       -- OBJECT_TYPE = TABLE PARTITION
       -- OBJECT_ID = 464826
       -- DATA_OBJECT_ID = 546512
    

    【讨论】:

      【解决方案2】:

      你可以使用这个脚本:

      SELECT L.*, O.SUBOBJECT_NAME
      FROM 
        (
          SELECT DBMS_ROWID.ROWID_OBJECT(ROWID) DATA_OBJECT_ID, L.*
          FROM YOUR_TABLE L
          --WHERE L.ID = 123
        ) L
        JOIN 
        (
          SELECT SUBOBJECT_NAME, DATA_OBJECT_ID 
          FROM USER_OBJECTS
        ) O ON O.DATA_OBJECT_ID = L.DATA_OBJECT_ID
      ;
      

      【讨论】:

        【解决方案3】:

        我认为你只能找到 cust_id = 123... 分配的分区名称:

        SELECT partition_name, tablespace_name
         FROM user_tab_partitions
        WHERE table_name = your_table;
        

        【讨论】:

          【解决方案4】:

          试试这个,

          select distinct SUBOBJECT_NAME from user_objects where data_object_id = (SELECT distinct dbms_rowid.rowid_object(ROWID) data_object_id FROM <your table name>   WHERE <your partition key> = <partition key value>and rownum=1)
          

          我在这里使用哈希分区。

          【讨论】:

            【解决方案5】:

            我找到了答案。

             DECLARE
                   pi_partition varchar2(50);
                   v_sql        varchar2(250);
                   i            number;
                   sy          number;
                BEGIN
                   FOR i IN 1..16
                   LOOP
                      IF i < 10 THEN
                        pi_partition:= 'SUBSCRIBER_0'||i;
                      ELSE
                        pi_partition:= 'SUBSCRIBER_'||i;
                      END IF;
            
                      sy:=0;
                      v_sql:= 'select count(*) into :say from subscriber partition('||pi_partition||') where customer_ID='||''''||'933564'||'''';
                      --dbms_output.put_line(pi_partition);
                      EXECUTE IMMEDIATE v_sql INTO sa;
            
            
                      IF sy > 0 THEN
            
                        DBMS_OUTPUT.PUT_LINE('Result: ' || sy||pi_partition);
                        EXIT;
                      END IF;
                   END LOOP;
                END;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-18
              • 2014-08-13
              • 2022-12-03
              • 2016-02-11
              相关资源
              最近更新 更多