为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:win10
【CPU】:
【问题描述】*:如何一次性获取某一模式下,所有自增列的信息(种子,增长值这些)以及 是否是虚拟列,
select
sf_get_schema_name_by_id(st.schid) as table_owner, -- 模式名
st.name as table_name, -- 表名
sco.name as column_name, -- 列名
sco.type$ as column_type , -- 列类型
ident_current(sf_get_schema_name_by_id(st.schid)||'.'||st.name) as ident_current, -- 自增列当前值
ident_seed(sf_get_schema_name_by_id(st.schid)||'.'||st.name) as ident_seed, -- 种子值(起始值)
ident_incr(sf_get_schema_name_by_id(st.schid)||'.'||st.name) as ident_increment -- 增量值
from syscolumns sco
join sysobjects st on sco.id = st.id and st.subtype$='UTAB'
where bitand(sco.info2, 0x0001) = 1
order by 1,2;
如果是自增列了,它就不可能是虚拟列,所以也没必要查了。如果单查虚拟列,估计就是单看syscolumns的defval字段。
你先查一下下面这个SQL
select * from v$ifun where name = 'AUTO_INCREMENT_CUR'
如果有返回记录,则说明你使用的DM版本支持这个新释出的系统函数,然后就可以用下面的SQL获取你需要的信息,且能够避免遇到“无效的表名”这个奇怪的问题。
SELECT /*+ CASE_WHEN_CVT_IFUN(8)*/
USR.NAME AS USER_NAME
,SCH.NAME AS SCHEMA_NAME
,TAB.NAME AS TABLE_NAME
,COL.COLID + 1 AS COLUMN_ID
,COL.NAME AS COLUMN_NAME
,SF_GET_TYPE_WITH_LENGTH(COL.TYPE$, COL.LENGTH$, COL.SCALE) AS DATATYPE
,CAST(CASE WHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') THEN 22
WHEN COL.SCALE = 7 AND UNICODE() = 1 THEN COL.LENGTH$ * 4
WHEN COL.SCALE = 7 AND UNICODE() = 0 THEN COL.LENGTH$ * 2
ELSE COL.LENGTH$ END
AS NUMBER
) AS DATA_LENGTH
,CAST(CASE WHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') THEN CASE WHEN COL.LENGTH$ = 0 THEN NULL ELSE COL.LENGTH$ END
WHEN COL.TYPE$ IN ('INTERVAL YEAR TO MONTH','INTERVAL YEAR','INTERVAL MONTH','INTERVAL DAY','INTERVAL DAY TO HOUR','INTERVAL DAY TO MINUTE','INTERVAL DAY TO SECOND','INTERVAL HOUR','INTERVAL HOUR TO MINUTE','INTERVAL HOUR TO SECOND','INTERVAL MINUTE','INTERVAL MINUTE TO SECOND','INTERVAL SECOND') THEN ((COL.SCALE & 0XF0)>>4)
END
AS NUMBER
) AS DATA_PRECISION
,CAST(CASE WHEN COL.TYPE$ IN ('NUMERIC','NUMBER','DEC','DECIMAL') AND COL.LENGTH$=0 THEN NULL
WHEN COL.TYPE$ IN ('INTERVAL YEAR TO MONTH','INTERVAL YEAR','INTERVAL MONTH','INTERVAL DAY','INTERVAL DAY TO HOUR','INTERVAL DAY TO MINUTE','INTERVAL DAY TO SECOND','INTERVAL HOUR','INTERVAL HOUR TO MINUTE','INTERVAL HOUR TO SECOND','INTERVAL MINUTE','INTERVAL MINUTE TO SECOND','INTERVAL SECOND') THEN (COL.SCALE & 0X0F)
ELSE COL.SCALE
END
AS NUMBER
) AS DATA_SCALE
,COL.NULLABLE$ AS NULLALBE
,COL.DEFVAL AS DATADEFAULT
,CASE WHEN SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID) = 1 THEN 'Y' END AS PRIMARY_KEY
,CASE WHEN COLINFO.INFO1 IS NOT NULL AND COLINFO.INFO1&0x01 = 0x01 THEN 'Y' END AS IS_VIRTUAL_COLUMN
,CASE WHEN COL.INFO2 & 0x01 = 1 AND LENGTH(TAB.INFO6) > 24 THEN DECODE(SUBSTRBB(TAB.INFO6,25,1),1,'IDENTITY',2,'AUTO_INCREMENT') END AS INCREMENT_TYPE
,CASE WHEN COL.INFO2 & 0x01 = 1 AND LENGTH(TAB.INFO6) > 24 THEN DECODE(SUBSTRBB(TAB.INFO6,25,1),1,IDENT_CURRENT(SCH.NAME||'.'||TAB.NAME),2,AUTO_INCREMENT_CUR(TAB.ID)) END AS IDENTITY_CURRENT
,CASE WHEN COL.INFO2 & 0x01 = 1 AND LENGTH(TAB.INFO6) > 24 THEN SF_BIN_GET_BIGINT(TAB.INFO6,0) END AS IDENTITY_SEED
,CASE WHEN COL.INFO2 & 0x01 = 1 AND LENGTH(TAB.INFO6) > 24 THEN SF_BIN_GET_BIGINT(TAB.INFO6,8) END AS IDENTITY_INCR
,COLCOMM.COMMENT$ AS COMMENTS
FROM SYSOBJECTS TAB
JOIN SYSOBJECTS SCH ON SCH.TYPE$ = 'SCH' AND SCH.ID = TAB.SCHID
JOIN SYSOBJECTS USR ON USR.TYPE$ = 'UR' AND USR.ID = SCH.PID
JOIN SYSCOLUMNS COL ON COL.ID = TAB.ID
LEFT JOIN SYSCOLUMNCOMMENTS COLCOMM ON COLCOMM.SCHNAME = SCH.NAME AND COLCOMM.TVNAME = TAB.NAME AND COLCOMM.COLNAME = COL.NAME
LEFT JOIN SYSCONS CONS ON CONS.TYPE$ = 'P' AND CONS.TABLEID = TAB.ID
LEFT JOIN SYSINDEXES IDXINFO ON IDXINFO.ID = CONS.INDEXID
LEFT JOIN SYSCOLINFOS COLINFO ON COLINFO.ID = COL.ID AND COLINFO.COLID = COL.COLID
--WHERE SCH.NAME = '模式名'
-- AND TAB.NAME = '表名'
ORDER BY 1,2,3,4
select
b.table_name ,
a.name COL_NAME,
IDENT_CURRENT(b.owner
||'.'
||b.table_name) 目前值,
IDENT_SEED(b.owner
||'.'
||b.table_name) 种子值,
IDENT_INCR(b.owner
||'.'
||b.table_name) 增值
from
SYS.SYSCOLUMNS a,
all_tables b ,
sys.sysobjects c
where
a.INFO2 & 0x01 = 0x01
and a.id =c.id
and c.name = b.table_name
and b.owner ='SYSDBA';