2010-03-02 59 views
6

有一个序列,我需要找出哪个table.column获取它的值。据我所知,Oracle并没有跟踪这种关系。因此,查找源代码中的序列将是唯一的方法。是对的吗?哪个Oracle表使用序列?

任何人都知道某种方式来找出这个序列表关系?

+1

Oracle不会跟踪它,因为除了惯例之外,没有这种关系。这就是为什么你通常使用某种命名约定,例如表XYZ具有序列SEQ_XYZ。 –

回答

2

在数据库中的一个,你可以搜索所有存储的代码在你的架构是这样的:

select type, name, line, text 
from all_source 
where owner = 'MYSCHEMA' 
and upper(text) like '%MYSEQ.NEXTVAL%'; 

在SQL Developer中,有一个报告可以做到这一点。

+0

这不会处理像“SELECT MYSEQ。NEXTVAL FROM dual”这样的情况。 – jva

+0

确实如此,这对文本搜索来说总是一个问题。您可以使用'%MYSEQ%。%NEXTVAL%',但这可能会导致'MYSEQ2.NEXTVAL'等误报。没有简单的答案! –

2

如果您的序列用于触发器,触发器将列在序列的“引用者”列表中。

如果您的序列仅用于源代码查询中,那么比浏览代码是唯一方法。

+0

如果存储过程'sp_something'引用序列'seq_something',那么'sp_something'肯定会出现在'seq_something'的“引用者”列表中? – mcrisc

+0

@Jaú:是的,它会的。 – Quassnoi

1

使用grep扫描您的整个源“myseq.NextVal” - myseq是你正在寻找....

+0

这一直是我的方法。 'grep -Prine“myseq \”。 .'在整个代码库上。麻烦的是,人们没有版本控制下的所有代码。我认为有很多代码(过程)只存储在数据库中。 – mcrisc

+0

如果您只能参考DB中存储的代码,请尝试使用'ALL_SOURCE'。如果您使用10g,请使用'REGEXP_LIKE'功能进行搜索。 – Guru

+0

@大师它是9i。但无论如何,很高兴知道'REGEX_LIKE'。谢谢。 – mcrisc

7

问题是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')类似的东西,但你仍然需要通过源一些拖网代码分配表和顺序,当你有多个命中。

+0

如果您有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