【发布时间】:2020-12-31 18:50:43
【问题描述】:
在查询下运行时(在 sproc 内)oracle..
SELECT
index_name,
index_description,
ltrim(sys_connect_by_path(index_keys,','),',') as Index_Keys,
include_cols,
index_filter,
data_compression,
allow_page_locks,
table_name,
index_type
from
(
Select t.*,
row_number() over (partition by INDEX_NAME order by COLUMN_POSITION) as rn
from
(
SELECT
di.index_name AS "INDEX_NAME",
CASE
WHEN di.index_type = 'IOT - TOP' THEN 'clustered'
ELSE 'nonclustered'
END
||
CASE
WHEN di.uniqueness = 'UNIQUE' AND
substr (
di.index_name,
1,
3
) = 'PK_' THEN ', unique, primary key'
WHEN di.uniqueness = 'UNIQUE' THEN ', unique'
END
||
CASE
WHEN di.uniqueness = 'NONUNIQUE' THEN ''
ELSE ''
END
||
' located on PRIMARY' AS "INDEX_DESCRIPTION",
ci.column_name AS "INDEX_KEYS",
NULL AS "INCLUDE_COLS",
NULL AS "INDEX_FILTER",
NULL AS "DATA_COMPRESSION",
NULL AS "ALLOW_PAGE_LOCKS",
di.table_name AS "TABLE_NAME",
CASE
WHEN di.index_type = 'IOT - TOP' THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END
AS "INDEX_TYPE",ci.column_position
FROM
dba_indexes di
JOIN dba_ind_columns ci
ON ci.index_owner = di.owner AND
ci.index_name = di.index_name
WHERE
di.table_owner = '****' AND
di.table_name = '******' AND
partitioned = 'NO'
UNION ALL
SELECT
di.index_name AS "INDEX_NAME",
CASE
WHEN di.index_type = 'IOT - TOP' THEN 'clustered'
ELSE 'nonclustered'
END
||
CASE
WHEN di.uniqueness = 'UNIQUE' AND
substr (
di.index_name,
1,
3
) = 'PK_' THEN ', unique, primary key'
WHEN di.uniqueness = 'UNIQUE' THEN ', unique'
END
||
CASE
WHEN di.uniqueness = 'NONUNIQUE' THEN ''
ELSE ''
END
||
' located on PRIMARY' AS "INDEX_DESCRIPTION",
ci.column_name AS "INDEX_KEYS",
NULL AS "INCLUDE_COLS",
NULL AS "INDEX_FILTER",
NULL AS "DATA_COMPRESSION",
NULL AS "ALLOW_PAGE_LOCKS",
di.table_name AS "TABLE_NAME",
CASE
WHEN di.index_type = 'IOT - TOP' THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END
AS "INDEX_TYPE",ci.column_position
FROM
dba_indexes di
JOIN dba_ind_partitions dip
ON dip.index_owner = di.owner AND
dip.index_name = di.index_name
JOIN dba_ind_columns ci
ON ci.index_owner = di.owner AND
ci.index_name = di.index_name
WHERE
di.table_owner = '*******' AND
di.table_name = '******' AND
di.partitioned = 'YES' AND
dip.composite != 'YES'
UNION ALL
SELECT
di.index_name AS "INDEX_NAME",
CASE
WHEN di.index_type = 'IOT - TOP' THEN 'clustered'
ELSE 'nonclustered'
END
||
CASE
WHEN di.uniqueness = 'UNIQUE' AND
substr (
di.index_name,
1,
3
) = 'PK_' THEN ', unique, primary key'
WHEN di.uniqueness = 'UNIQUE' THEN ', unique'
END
||
CASE
WHEN di.uniqueness = 'NONUNIQUE' THEN ''
ELSE ''
END
||
' located on PRIMARY' AS "INDEX_DESCRIPTION",
ci.column_name AS "INDEX_KEYS",
NULL AS "INCLUDE_COLS",
NULL AS "INDEX_FILTER",
NULL AS "DATA_COMPRESSION",
NULL AS "ALLOW_PAGE_LOCKS",
di.table_name AS "TABLE_NAME",
CASE
WHEN di.index_type = 'IOT - TOP' THEN 'CLUSTERED'
ELSE 'NONCLUSTERED'
END
AS "INDEX_TYPE",ci.column_position
FROM
dba_indexes di
JOIN dba_ind_partitions dip
ON dip.index_owner = di.owner AND
dip.index_name = di.index_name
JOIN dba_ind_subpartitions dis
ON dis.index_owner = di.owner AND
dis.index_name = di.index_name AND
dis.partition_name = dip.partition_name
JOIN dba_ind_columns ci
ON ci.index_owner = di.owner AND
ci.index_name = di.index_name
WHERE
di.table_owner = '***' AND
di.table_name = '*****' AND
di.partitioned = 'YES' AND
dip.composite = 'YES' ) t
)
where connect_by_isleaf = 1
connect by index_name = prior index_name
and rn = prior rn+1
start with rn =1 ;
它给出以下输出..
![在此处输入图片描述][1]
AI_TESTORACLE_TEMP_27977 和 AI_TESTORACLE_TEMP_27978 的索引键当前显示功能索引的 column_name,即来自 dba_ind_columns 的 SYS_NC00023$ 和 SYS_NC00024$,而我们期望它应该是“TestInt, lower(TestShortString)”和“TestSmallInt, UPPER(TestShortString)”。 ..这是列表达式,可以从 dba_col_expressions 视图中派生出来..
Name Null? Type
----------------------------------------------------------------------- -------- -----------------------------
INDEX_OWNER NOT NULL VARCHAR2(128)
INDEX_NAME NOT NULL VARCHAR2(128)
TABLE_OWNER NOT NULL VARCHAR2(128)
TABLE_NAME NOT NULL VARCHAR2(128)
COLUMN_EXPRESSION LONG
COLUMN_POSITION NOT NULL NUMBER
SQL> desc dba_ind_Columns;
Name Null? Type
----------------------------------------------------------------------- -------- ----------------------
INDEX_OWNER NOT NULL VARCHAR2(128)
INDEX_NAME NOT NULL VARCHAR2(128)
TABLE_OWNER NOT NULL VARCHAR2(128)
TABLE_NAME NOT NULL VARCHAR2(128)
COLUMN_NAME VARCHAR2(4000)
COLUMN_POSITION NOT NULL NUMBER
COLUMN_LENGTH NOT NULL NUMBER
CHAR_LENGTH NUMBER
DESCEND VARCHAR2(4)
COLLATED_COLUMN_ID NUMBER
只需要在此查询中进行微小更改即可输出列表达式而不是列名作为 index_keys 仅用于功能索引(这有点棘手).. REST NO CHANGE 在其他列中.. 在这里寻求所有专家的帮助..
INDEX_TYPE 作为基于函数的 NORMAL 或 NORMAL 可以从 DBA_INDEXES 中获取
SQL> select column_Expression from dba_ind_expressions where table_name='TESTORACLE_TEMP' AND TABLE_OWNER='ROLLOUT';
COLUMN_EXPRESSION
--------------------------------------------------------------------------------
LOWER("TESTSHORTSTRING")
UPPER("TESTSHORTSTRING")
SQL> select column_name from dba_ind_columns where table_owner='ROLLOUT' and table_name='TESTORACLE_TEMP';
COLUMN_NAME
----------------------------------------------------------------------------------------------------------------
KEYTESTORACLE
TESTTINYINT
TESTSMALLINT
TESTUNIQUEIDENTIFIER
TESTINT
SYS_NC00023$
TESTSMALLINT
SYS_NC00024$
UPDDATE
9 rows selected.
[![在此处输入图片描述][2]][2]
添加 index_keys 列(当前输出和预期) [1]:https://i.stack.imgur.com/fsg0z.png [2]:https://i.stack.imgur.com/SeewU.jpg
【问题讨论】:
-
你能提供一个小提琴吗?