有一个序列,我需要找出哪个table.column获取它的值。据我所知,Oracle并没有跟踪这种关系。因此,查找源代码中的序列将是唯一的方法。是对的吗?哪个Oracle表使用序列?
任何人都知道某种方式来找出这个序列表关系?
有一个序列,我需要找出哪个table.column获取它的值。据我所知,Oracle并没有跟踪这种关系。因此,查找源代码中的序列将是唯一的方法。是对的吗?哪个Oracle表使用序列?
任何人都知道某种方式来找出这个序列表关系?
在数据库中的一个,你可以搜索所有存储的代码在你的架构是这样的:
select type, name, line, text
from all_source
where owner = 'MYSCHEMA'
and upper(text) like '%MYSEQ.NEXTVAL%';
在SQL Developer中,有一个报告可以做到这一点。
这不会处理像“SELECT MYSEQ。NEXTVAL FROM dual”这样的情况。 – jva
确实如此,这对文本搜索来说总是一个问题。您可以使用'%MYSEQ%。%NEXTVAL%',但这可能会导致'MYSEQ2.NEXTVAL'等误报。没有简单的答案! –
问题是Oracle允许我们使用一个序列填充多个表中的列。可能需要的场景包括超类型/子类型的实现。
您可以使用数据字典中的依赖关系来确定关系。举例来说,如果你使用触发器来分配值,则该查询将帮助您:
select ut.table_name
, ud.referenced_name as sequence_name
from user_dependencies ud
join user_triggers ut on (ut.trigger_name = ud.name)
where ud.type='TRIGGER'
and ud.referenced_type='SEQUENCE'
/
如果使用PL/SQL,那么你可以写TYPE in ('PACKAGE BODY', 'PROCEDURE', 'FUNCTION')
类似的东西,但你仍然需要通过源一些拖网代码分配表和顺序,当你有多个命中。
如果您有sequence_name,并且您想通过触发器检查它正在使用哪个表,则可以使用上面的查询,并使用指定序列名称的多个“and”条件:从user_dependencies中选择ut.table_name ,ud.referenced_name as sequence_name UD 加入USER_TRIGGERS UT斯达康上(ut.trigger_name = ud.name) 其中ud.type = 'TRIGGER' 和ud.referenced_type = 'SEQUENCE' 和ud.referenced_name = 'YOUR_SEQ_NAME'; – nanosoft
我想添加background关于序列的信息。
Oracle不会跟踪它,因为除了惯例之外,没有这种关系。这就是为什么你通常使用某种命名约定,例如表XYZ具有序列SEQ_XYZ。 –