🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例

 

前言

在企業級系統開發中,我們常會將複雜的商業邏輯封裝成 Oracle PL/SQL 的儲存過程(Stored Procedure),以便重複使用並確保邏輯一致性。
這次的案例是 修改 Updlcmremark 儲存過程,目的是讓產出的 REMARK 欄位在資料庫中具有「換行」格式,而不只是用逗號分隔,方便報表與前端顯示。




問題背景

原本的 Updlcmremark 過程中,對於某些資料(例如來自 APS_Z_LCM_CHECKprocess_stepeq),是直接用字串拼接的方式:

v_remark := NVL(v_process_step, '') || '' || NVL(v_eq, '');

這種寫法的缺點是:

  1. 資料之間沒有任何分隔符號,閱讀性差。

  2. 若要在前端或報表中換行,必須額外處理,不方便。

  3. 如果一個 SEQ_NO 有多筆資料,這種寫法只會取到第一筆(FETCH 單筆),其他資料會被忽略。




改進需求

參考同系統的另一支儲存過程 Updmremark,該過程在拼接文字時不僅使用逗號分隔,還加上換行符號:

|| ' ,' || CHR(10)

這樣在資料庫中儲存的內容,就會自帶換行,即使直接查詢或匯出到 Excel 報表,也能保有可讀性。




解決方案

方案一:簡單版(單筆取值加換行)

如果 unknown 游標一次只需要取一筆資料,可以直接在原本字串後加上逗號與換行符號:

v_remark := NVL(v_process_step, '') || ' ' || NVL(v_eq, '') || ' ,' || CHR(10);

這樣每筆 remark 都會以「逗號 + 換行」結尾。




方案二:完整版(多筆累加加換行)

如果 unknown 游標可能有多筆資料,則應該使用 FOR rec_unknown IN ... LOOP 迴圈將所有資料串接起來:

v_remark := ''; FOR rec_unknown IN unknown(rec_data.SEQ_NO, rec_data.APS_VERSION) LOOP v_remark := v_remark || NVL(rec_unknown.process_step, '') || ' ' || NVL(rec_unknown.eq, '') || ' ,' || CHR(10); END LOOP; -- 去掉最後一筆多餘的逗號 IF SUBSTR(v_remark, -2, 1) = ',' THEN v_remark := SUBSTR(v_remark, 1, LENGTH(TRIM(v_remark)) - 2) || ' '; END IF;

優點:

  1. 不會漏掉多筆資料。

  2. 每筆資料佔一行,報表與查詢結果清楚易讀。

  3. 格式與 Updmremark 一致,維護性高。




CHR(10) 在 Oracle 的作用

CHR(10) 在 Oracle 代表 換行符號(Line Feed, LF),它等同於 ASCII Code 的 10,通常在 Unix/Linux 系統下就是換行的意思。
如果在 Windows 環境中需要 CRLF(\r\n),則可以使用:

CHR(13) || CHR(10)

其中:

  • CHR(13):Carriage Return (CR)

  • CHR(10):Line Feed (LF)




最終效果

假設 process_stepeq 分別為:

"檢測""EQ01" "包裝""EQ02"

儲存後的 REMARK 欄位會是:

檢測 EQ01 , 包裝 EQ02 ,

每一筆後面都有逗號和換行,查詢與匯出時的格式將非常清晰。




結論

這次的改動雖小,但卻大幅提升了資料的可讀性與維護性,特別是在報表輸出與前端顯示上,可以直接利用資料庫原始內容呈現換行,而不需要額外處理字串格式。

關鍵重點:

  1. CHR(10) 在 Oracle 中加換行。

  2. 如果有多筆資料,記得用 FOR LOOP 累加而不是單筆 FETCH

  3. 去除最後一筆多餘的分隔符號,避免格式不整齊。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)