有一個序列,我需要找出哪個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。 –