🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例
前言
在企業級系統開發中,我們常會將複雜的商業邏輯封裝成 Oracle PL/SQL
的儲存過程(Stored Procedure),以便重複使用並確保邏輯一致性。
這次的案例是
修改 Updlcmremark 儲存過程,目的是讓產出的
REMARK
欄位在資料庫中具有「換行」格式,而不只是用逗號分隔,方便報表與前端顯示。
問題背景
原本的
Updlcmremark
過程中,對於某些資料(例如來自
APS_Z_LCM_CHECK
的
process_step
與
eq
),是直接用字串拼接的方式:
這種寫法的缺點是:
-
資料之間沒有任何分隔符號,閱讀性差。
-
若要在前端或報表中換行,必須額外處理,不方便。
-
如果一個
SEQ_NO
有多筆資料,這種寫法只會取到第一筆(FETCH
單筆),其他資料會被忽略。
改進需求
參考同系統的另一支儲存過程 Updmremark,該過程在拼接文字時不僅使用逗號分隔,還加上換行符號:
這樣在資料庫中儲存的內容,就會自帶換行,即使直接查詢或匯出到 Excel 報表,也能保有可讀性。
解決方案
方案一:簡單版(單筆取值加換行)
如果
unknown
游標一次只需要取一筆資料,可以直接在原本字串後加上逗號與換行符號:
這樣每筆 remark 都會以「逗號 + 換行」結尾。
方案二:完整版(多筆累加加換行)
如果
unknown
游標可能有多筆資料,則應該使用
FOR rec_unknown IN ... LOOP
迴圈將所有資料串接起來:
優點:
-
不會漏掉多筆資料。
-
每筆資料佔一行,報表與查詢結果清楚易讀。
-
格式與
Updmremark
一致,維護性高。
CHR(10) 在 Oracle 的作用
CHR(10)
在 Oracle 代表
換行符號(Line Feed, LF),它等同於 ASCII Code 的 10,通常在 Unix/Linux 系統下就是換行的意思。
如果在 Windows 環境中需要 CRLF(\r\n
),則可以使用:
其中:
-
CHR(13)
:Carriage Return (CR) -
CHR(10)
:Line Feed (LF)
最終效果
假設 process_step
與
eq
分別為:
儲存後的 REMARK
欄位會是:
每一筆後面都有逗號和換行,查詢與匯出時的格式將非常清晰。
結論
這次的改動雖小,但卻大幅提升了資料的可讀性與維護性,特別是在報表輸出與前端顯示上,可以直接利用資料庫原始內容呈現換行,而不需要額外處理字串格式。
關鍵重點:
-
用
CHR(10)
在 Oracle 中加換行。 -
如果有多筆資料,記得用
FOR LOOP
累加而不是單筆FETCH
。 -
去除最後一筆多餘的分隔符號,避免格式不整齊。
留言
張貼留言