2013-08-19 12 views
1

例如我們有一個大型的數據庫包含大量的oracle軟件包,現在我們想查看特定表在源代碼中的抵抗力。源代碼存儲在user_source表中,我們所需的表被稱爲「公司」。如何通過使用'regexp'找到包含用戶來源所需表名的所有源代碼行

通常情況下,我想用:

select * from user_source 
where upper(text) like '%COMPANY%' 

這將返回一個包含「公司」所有的話,像

121 company cmy 
14  company_id, idx_name %% end of coding 
453 ;companyname 
1253 from db.company.company_id where 
989 using company, idx, db_name, 

那麼如何使用正則表達式來解析,使這個結果更智能所有的源代碼行與一個有意義的表名匹配(意味着編譯器有table)?

所以通常我們允許匹配字包含像.;,''""但不_

任何人都可以做這項工作字符?

+0

'like'支持字符串內的完整正則表達式嗎? –

+0

@HippoMatrix - 我已經更新了我的答案,所以它會忽略標點符號;對不起,我最初錯過了。 –

回答

1

要了解公司的「全字」用正則表達式:

SELECT * FROM user_source 
WHERE REGEXP_LIKE(text, '(^|\s)company(\s|$)', 'i'); 

i第三個參數使得REGEXP_LIKE搜索不區分大小寫。

至於忽視的人物.;,''"",您可以使用REGEXP_REPLACE在做比較之前出來的字符串吸:

SELECT * FROM user_source 
WHERE REGEXP_LIKE(REGEXP_REPLACE(text, '[.;,''"]'), '(^|\s)company(\s|$)', 'i'); 

附錄:下面的查詢將也有助於查找表格參考。它不會給源線,但它是一個開始:

SELECT * 
FROM user_dependencies 
WHERE referenced_name = 'COMPANY' 
    AND referenced_type = 'TABLE'; 
+0

謝謝,恐怕這不是我的觀點。我想要的是找出'源代碼',通常是一個觸發器,proc等包含一個有意義的'表',而不是一個表作爲一個整體詞。因爲結果也可以是db.company.company_name或company; ,等...........和任何其他有意義的表...... – HippoMatrix

+0

我不完全理解。你想找出哪些代碼引用特定的表?如果是這樣,'user_dependencies'視圖可能是一個更好的地方:'SELECT * FROM user_dependencies WHERE referenced_name ='COMPANY'and referenced_type ='TABLE''。 –

+0

非常感謝我剛拿到這個賬號所以沒有權限投票了~~ – HippoMatrix

0

如果你想找出是指你的表中的對象,你可以從數據字典的信息:

select * 
from all_dependencies 
where referenced_owner = 'DB' 
and referenced_name = 'COMPANY' 
and referenced_type = 'TABLE'; 

您無法從中獲取單獨的行號,但您可以查看user_source或在特定源代碼上使用正則表達式,這樣至少可以減少誤報。

+0

謝謝,這已經完成了我的第一步。第二步是將結果'table'設置回'code line'。 – HippoMatrix

0
SELECT * FROM user_source 
WHERE REGEXP_LIKE(text,'([^_a-z0-9])company([^_a-z0-9])','i') 

謝謝@Ed Gibbs,這個修改後的答案可能會更聰明一點。

相關問題