首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle PL/SQL 宣告包含非表欄位的游標進階應用

     編輯:Oracle 資料庫相關知識

實務開發中,常需建立游標回傳「主表所有欄位 + 關聯表特定欄位」的合併結果集。透過 %ROWTYPE 搭配明確列出關聯欄位,可兼顧彈性與型別安全。

實戰範例

CURSOR sal_data(cp_center_temp_id VARCHAR2) IS
SELECT data.*,                          -- 主表所有欄位
       post.id         emp_post_id,       -- 關聯表欄位加別名
       doc.salary_tax_bd sa_tax_bd,
       batch.bill_year_month,
       batch.id         batch_id,
       post.emp_id      employee_id
FROM   sa_salary_data data
LEFT JOIN sa_salary_batch batch ON data.sa_batch_id = batch.id
LEFT JOIN sa_salary_document doc ON data.sa_doc_id = doc.id
LEFT JOIN pb_emp_post post ON doc.emp_post_id = post.id
LEFT JOIN pb_send send ON post.send_id = send.id
WHERE  send.cost_center_id = cp_center_temp_id;

變數宣告與迴圈處理

salary_data_temp sal_data%ROWTYPE;  -- 自動適配游標回傳結構

OPEN sal_data(center_temp.id);
LOOP
  FETCH sal_data INTO salary_data_temp;
  EXIT WHEN sal_data%NOTFOUND;
  -- 處理邏輯:salary_data_temp.emp_post_id 等均可直接存取
END LOOP;
CLOSE sal_data;

關鍵優勢

  • 結構自適應:主表結構變更(增減欄位),游標與 %ROWTYPE 自動同步,無需修改宣告區。
  • 明確別名:關聯欄位強制別名,避免同名欄位衝突,程式碼可讀性高。
  • 型別安全:編譯期即檢查欄位型別相容,減少執行期錯誤。

注意事項

  1. SELECT * 僅限主表,關聯表務必明確列出欄位並加別名。
  2. 游標參數化(cp_center_temp_id)提升重用性與安全性。
  3. 大量資料建議改用 BULK COLLECT 減少 Context Switch。

此模式在薪資、帳務等多表關聯報表開發中極為實用,推薦納入團隊編碼規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved