[英]how to find partition of record oracle
I have a table and there is a partition on it. 我有一张桌子,上面有一个分区。
There are 16 hash partition which is starting from SUBSCRIBER_01 .. etc 从SUBSCRIBER_01开始有16个哈希分区。
Table name: SUBSCRIBER 表格名称:SUBSCRIBER
Partition Column: CUSTOMER_ID (VARCHAR2 10) 分区列:CUSTOMER_ID(VARCHAR2 10)
Database : 11g 数据库:11克
How can I find partition of a record? 如何找到记录的分区?
Like Customer_ID=933587 像Customer_ID = 933587
Select the rowid for the row, and the DBMS_RowID.RowID_Object()
procedure will extract the data object id. 选择该行的rowid,然后
DBMS_RowID.RowID_Object()
过程将提取数据对象ID。
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm#i997153 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm#i997153
Look up that data object id in the data dictionary and read the subobject_name. 在数据字典中查找该数据对象ID并读取subobject_name。
For example: 例如:
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
You can using this script: 您可以使用以下脚本:
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
;
I think you can only find the partition name where cust_id = 123... allocated: 我认为您只能找到cust_id = 123 ...分配的分区名称:
SELECT partition_name, tablespace_name
FROM user_tab_partitions
WHERE table_name = your_table;
try this, 尝试这个,
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)
I am using hash partitioning here. 我在这里使用哈希分区。
I found the answer. 我找到了答案。
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.