2010-03-02 40 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