我有一筆 GUID:01FB0335-768E-4BCB-AB5B-35AA2DF7195A
,想知道它是否出現在 Oracle 資料庫中某個表的某個欄位。這不像查一張特定表那麼直覺,因為我要搜尋的是「整個 schema 所有表、所有欄位的值」,不只是 DDL、也不只是一個表。
這需求很像找針,但還是找得出來。
我先執行以下 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
...
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 整理段落 |
我要搜尋一筆 GUID 是否出現在 Oracle 資料庫某個 schema 裡所有表格的任何欄位中,要怎麼做?
用 SQL 自動產出一系列查詢語句來比對欄位值,要怎麼寫才能避免最後的 UNION ALL 語法錯?
TOAD 輸出結果有亂斷行,怎麼在 VS Code 用正則整理回正常的 SQL?