概述

本文回答五個關於 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 autoincrement
  • CHAR(40) 轉換為 char(40) collate rtrim
  • today 轉換為 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