查询oracle用户下面所有表的字段用到的sequence

一.背景

        半路接手项目,文档资料不全。希望整清楚整个系统有哪些表的字段用了哪些sequence。运维中,oracle导入后出现过sequence的值比数据表里面的值小,原因不详。希望自动把所有sequence都检查一遍。

二.关键sql

        可以查询出所有的表名字、字段名字、触发器名字。

SELECT
	s.tname,
	s.cname,
	s.qname
FROM
	(
		SELECT
			c.table_name AS tname,
			A .sequence_name AS qname,
			SUBSTR (
				b.text,
				INSTR (LOWER(b.text), ':new.') + 5,
				INSTR (LOWER(b.TEXT), 'from') - INSTR (LOWER(b.text), ':new.') - 5
			) AS cname
		FROM
			(
				SELECT
					sequence_name
				FROM
					user_sequences
			) A,
			(
				SELECT
					text,
					NAME
				FROM
					user_source
				WHERE
					TYPE = 'TRIGGER'
			) b,
			(
				SELECT
					table_name,
					TRIGGER_name
				FROM
					user_triggers
			) c
		WHERE
			c.TRIGGER_name = b. NAME
		AND b.text LIKE '%' || A .sequence_name || '%'
		ORDER BY
			table_name ASC
	) s
WHERE
	s.cname IS NOT NULL

三.后续处理

        开发了一个小的应用,思路是遍历前面sql结果。逐一去查sequence的当前值与表中字段最大值比较,如果不大于,就处理sequence的值。处理的方法就是先把sequence的增长步长修改为差值+1,查询一次。再把sequence的步长修改为1。

        主要sql如下:

       1. 查询业务表

select nvl(max(ID ),0)  from  APP_MATERIAL

        2.查询sequence

select SEQ_APP_MATERIAL.NEXTVAL from Dual 

        3.修改步长为差值

alter sequence SEQ_APP_MATERIAL increment by  78

        4.再查询一次

   select SEQ_APP_MATERIAL.NEXTVAL from Dual 

         5.修改步长为1

alter sequence SEQ_APP_MATERIAL increment by  1





猜你喜欢

转载自blog.csdn.net/qq_37372909/article/details/80455415