概述
本文回答五個關於 Genero 應用程式中 SQL 執行的重要偵錯問題:
- 實際送至資料庫的 SQL 陳述式是什麼?
- 傳遞給資料庫的參數值是什麼?
- 程式碼中的 SQL 與實際執行的 SQL 有何差異?
- SQL 執行花了多少時間?
- SQL 陳述式的原生錯誤碼為何?
主題:FGLSQLDEBUG 環境變數
作者強調:「FGLSQLDEBUG 是一個可在程式執行前設定的環境變數」,並具有可設定的詳細程度。設為最高值(3)可獲得最完整的輸出,但會產生大量資料。另一種做法是先設為 -1 來定位錯誤,再進行深入調查。
偵錯策略
開發人員可建立輔助函式來切換偵錯輸出:
FUNCTION fgl_sqldebug_on()
CALL fgl_sqldebug(3)
END FUNCTION
FUNCTION fgl_sqldebug_off()
CALL fgl_sqldebug(0)
END FUNCTION
這些函式可整合至偵錯器(命令列或 Genero Studio 的圖形化偵錯器)中,以便在執行時期控制偵錯輸出。
FGLSQLDEBUG 可揭露的資訊
輸出內容包括:
- 原始的 4GL SQL 陳述式
- 資料庫特定的轉換後陳述式(透過 ODI 層)
- 參數值與型別
- 包含資料型別和值的結果集
- 原生錯誤碼和描述
- 4GL 錯誤碼和行號
- 執行時間測量
重要發現:SQL 語法轉換
文章示範了 Informix 語法如何轉換為資料庫特定語法。以 SQLite 為例:
SERIAL轉換為integer primary key autoincrementCHAR(40)轉換為char(40) collate rtrimtoday轉換為date('now')
錯誤處理範例
當查詢參照到不存在的資料表時,輸出會顯示:
- 原生資料庫錯誤碼和訊息
- 對應的 4GL/Informix 錯誤碼(
-6372) - SQLCA 診斷記錄的填入情況
工具資源
文章提及 GitHub 上的工具(tool_fglsqldebug),可將偵錯輸出解析為視覺化的 Genero 應用程式介面,提供原始文字分析之外的替代方案。
範例程式碼說明
文章包含一個完整的 4GL 程式示範:
- 資料庫連線
- 建立資料表
- 含 SERIAL 欄位的 INSERT 操作
- 靜態 SQL 查詢
- 游標操作(DECLARE、OPEN、FETCH)
- 刻意製造的錯誤情境
所有範例皆使用記憶體內的 SQLite 資料庫作為示範用途。
原文:https://4js.com/ask-reuben/ig-83/
· 有任何 Genero 技術問題或翻譯疑問,歡迎來信
support@t100.app