iT邦幫忙

0

🔍Oracle 全欄位搜尋技巧:我如何查出 GUID 藏在哪張表裡?

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250715/2015510339oRXulXLB.png

🧱需求出現:查某個值到底存在哪一欄?

我有一筆 GUID:01FB0335-768E-4BCB-AB5B-35AA2DF7195A,想知道它是否出現在 Oracle 資料庫中某個表的某個欄位。這不像查一張特定表那麼直覺,因為我要搜尋的是「整個 schema 所有表、所有欄位的值」,不只是 DDL、也不只是一個表。

這需求很像找針,但還是找得出來。


🛠 查詢策略:用 SQL 自動產出 SQL 查詢語句

我先執行以下 SQL 來產出一系列查詢語句(針對所有文字欄位):

SELECT 
  'SELECT ''' || table_name || ''' AS table_name, ''' || column_name || ''' AS column_name, COUNT(*) AS match_count FROM ' ||
  table_name || ' WHERE UPPER(' || column_name || ') = ''01FB0335-768E-4BCB-AB5B-35AA2DF7195A'' HAVING COUNT(*) > 0 UNION ALL' AS q
FROM user_tab_columns
WHERE data_type IN ('VARCHAR2', 'CHAR')

這會輸出類似以下格式:

SELECT 'TABLE1' AS table_name, 'COL1' AS column_name, COUNT(*) AS match_count FROM TABLE1 WHERE UPPER(COL1) = '01FB...' HAVING COUNT(*) > 0 UNION ALL
SELECT 'TABLE2' AS table_name, 'COL2' AS column_name, COUNT(*) AS match_count FROM TABLE2 WHERE UPPER(COL2) = '01FB...' HAVING COUNT(*) > 0 UNION ALL
...

✨ VS Code 清理與執行步驟

TOAD 輸出這段 SQL 通常會亂斷行,因此我在 VS Code 做了以下整理流程:

1️⃣ 貼上 SQL 結果後,先移除最後一個 UNION ALL

Find:     ^(.*)(UNION ALL)(?![\s\S]*UNION ALL)
Replace:  $1

2️⃣ 移除中間亂斷行(保留 SELECT 開頭行)

Find:     (?<!\bSELECT)\r?\n
Replace:  ␣(空白)

3️⃣ 強制每段 SELECT 開頭換行以利閱讀與執行

Find:     \bSELECT
Replace:  \nSELECT

4️⃣ 手動刪除 TOAD 輸出中的 Q --- 等多餘雜訊

這類標註通常出現在第一行或分隔區,需人工刪除。


✅ 成功查出結果

整理後的查詢成功列出有命中 GUID 的欄位,例如:

TABLE_NAME COLUMN_NAME MATCH_COUNT
ACC_ROLE_MEMBER USER_CODE 2

這讓我能迅速定位該值出現的位置,而不是一表一表猜。


📌 常見錯誤與對應解法

錯誤情境 解法說明
最後一個 UNION ALL 多出來 用正則移除最後一個 UNION ALL
欄位大小寫錯誤 (ORA-00904) 產生查詢時統一使用 UPPER(column_name)
查詢語句過長 (ORA-01489) 改用每行一段查詢,避免用 LISTAGG 拼成一整行
TOAD 輸出多餘換行與註記 VS Code 正則處理斷行與 SELECT 整理段落

🧠 適合詢問 GPT 的 prompt

我要搜尋一筆 GUID 是否出現在 Oracle 資料庫某個 schema 裡所有表格的任何欄位中,要怎麼做?
用 SQL 自動產出一系列查詢語句來比對欄位值,要怎麼寫才能避免最後的 UNION ALL 語法錯?
TOAD 輸出結果有亂斷行,怎麼在 VS Code 用正則整理回正常的 SQL?


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言