既然是從 INFORMIX 剝離出來的工具,應該連結資料庫的能力是強大的。本段落我們檢視一下Genero連結資料庫的能力。
市面上常用的資料庫,都有自己努力的強項,個別的指令也稍微有些不同。為了最大化能共通於這些資料庫,以做到『Write Once, Use Everywhere』,Genero FGL具有自開發的『共通性資料庫介面 ODI, Open Database Interface』,以 INFORMIX 指令為基準 (因為來自於 INFOMIX ),將其他資料庫具有的些微差異,利用 ODI 進行轉譯,概略流程如下:
透過 ODI 的轉換,資料庫內包含數據型態、SQL語法、指令等,能在最大限度下求同,但仍舊保持了使用 PREPARE 方法,使得特殊指令仍在 Genero內能被使用,滿足『優化』的需求,此為存異。
FGL套件的設定檔案是 FGLPROFILE,在這裡可以指定許多必要的設定,今天專門針對『資料庫的連線』進行說明。
FGLPORIFLE採用 entry 的方式設定 (非INI模式),行首 # 字號時代表為註解
Genero可對接 IBM DB2 / INFORMIX / MS SQL Server / ORACLE / MySQL / PostgreSQL / SAP Hana / SQLite / Sybase ASE (以上按照名稱排序),但是支持版本各有不同,以下挑選部分資料庫作為簡介對象
資料庫廠牌 | Genero 2.40 | Genero 2.50 | Genero 3.20 |
---|---|---|---|
ORACLE | 8.x / 9.x / 10.x / 11.x | 9.2 / 10.x / 11.x / 12x | 11.x 以上全版本 |
INFORMIX | 5.x / 7.x / 8.x / 9.x / 10.x / 11.x | 5.x / 7.x / 8.x / 9.x / 10.x / 11.x | 5.x以上全版本 |
MS SQL Server | 2005 / 2008 / 2012 | 2005 / 2008 / 2012 | 2012以上全版本,Azure SQDBL V12 |
PostgreSQL | 8.x.y / 9.x.y | 8.x.y / 9.x.y | 9.6 / 10 / 11 / 12 |
SQLite | 3.5.x / 3.6.x | 3.5.x / 3.6.x | 3.x |
連線到資料庫時,最重要的就是連線字串的設定。包含連結的資料庫主機位置 (port) 、登入資料庫的帳號密碼,以及對應需使用的字元組等環境變數。
^ 例如 ORACLE 資料庫會將相關訊息以 ORACLE_SID 含括成為一組設定時,則須依照該資料庫要求進行設定。
Genero支持靜態的設定檔,即透過 FGLPROFILE 進行連線字串的設定。FGLPROFILE的存放有兩組路徑:$FGLDIR/etc/fglprofile 與 $FGLPROFILE 指定檔案,遇有同樣的設定時,後者可壓過前者;同檔案內衝突時,下方設定壓過上方設定
若需要連結的資料庫眾多,或是需要動態設定,則可以在程式內部使用 CONNECT 指令
語法
『CONNECT TO連線對象+ODI驅動程式名稱 USER 連線帳號 USING 連線密碼』
註:連線對象依照不同資料庫有不同需求。部分資料庫如SQLite無帳號密碼則可省略
本文摘錄需特別關注要點進行說明與介紹,需大量採用或作為生產環境時,仍應詳讀FGL的ODI文件,該文件內均會詳列連線時,DB的特殊之處、須採用的特殊語法、如何將原有程式或查詢語句進行轉換為 ODI 通用語句。
需在 Genero 所在主機安裝完成對應的 ORACLE Client 軟件,並配置 tnsname.ora,確認ORACLE_SID / ORACLE_HOME 等必須存在的環境變數時,可進行 Genero 端設定
dbi.database.dbname.driver = "dbmora"
dbi.database.dbname.source = "stock"
dbi.database.dbname.username= "登入帳號"
dbi.database.dbname.password= "登入密碼"
dbi.database.dbname.schema= "登入SCHEMA"
驅動程式配置完成後,需確認 INFORMIXSERVER 環境變數是否已完成配置
因為源自於 INFORMIX,所以在 FGLPROFILE 中指定驅動程式即可
需安裝好client,且必須完成下列環境變數的設定
dbi.database.dbname.driver = "dbmpgs"
dbi.database.dbname.source = "test1" #或用dbname[@host[:port]]
dbi.database.dbname.username= "登入帳號"
dbi.database.dbname.password= "登入密碼"
SQL Server在2.40與更早前的版本,有支持 open source的FREETDS與Easysoft 的連線,此兩種連線需透過 OPEN ODBC的協助。設定上較為繁雜且軟件為社群維護,可能會有維護窗口的顧慮。可考慮直接使用微軟推出的 Linux 版本SQL Server驅動 SNC (SQLserver Native Client) 。
依據 Genero 官網要求,SQL Server連線前應先確定 Linux 上是否已完成對應驅動程式安裝的最低版本要求如下
dbi.database.dbname.driver = "dbmsnc"
dbi.database.dbname.source = "test1"
dbi.database.dbname.username= "登入帳號"
dbi.database.dbname.password= "登入密碼"
單機文件型資料庫,只需確認套件已安裝即可
dbi.database.dbname.driver = "dbmsqt"
dbi.database.dbname.source = "/opt/myapp/stock.dbs"
要驗證連線時,可先利用 DATABASE 指令進行連線,依據上方的FGLPROFILE設定,以『dbname』為範例,測試連線如下
MAIN
DEFINE cnt INTEGER
DATABASE dbname
SELECT COUNT(1) INTO cnt FROM hello_table
IF cnt > 0 THEN
DISPLAY “CONNECT OK!”
END IF
END MAIN
即可確認 DB連線成功。
實際測試發現儘管官方文件寫 driver 就是 xxx.so 的xxx,但設定上去之後卻會有無法載入driver的錯誤,是否可以幫忙解惑一下?
我是在AIX 7.1上run,genero 版本是 2.50,postgres則是裝在另一台ubuntu上,AIX有需要裝postgres client嗎?
<root:/usr/informix/genero250/fgl/etc> ls -al /usr/informix/genero250/fgl/dbdrivers/dbmpgs92*
-rwxr-xr-x 1 tiptop informix 62765 11月 16 2013 /usr/informix/genero250/fgl/dbdrivers/dbmpgs92x.so
<root:/usr/informix/genero250/fgl/etc> cat fglprofile | grep pgerp
dbi.database.pgerp.driver="dbmpgs92x"
dbi.database.pgerp.source="erp"
dbi.database.pgerp.username ="postgres"
dbi.database.pgerp.password ="postgres"
<root:/usr/informix/genero250/fgl/etc> fgldbsch -db pgerp
SQL: CONNECT
| 4gl source : fgldbslib.4gl line=748
| loading driver : [/usr/informix/genero250/fgl/dbdrivers/dbmpgs92x]
| Dynamic linker error: [Not a directory]...
Connection to database 'pgerp' failed.
-6366: Could not load database driver dbmpgs92x. Set FGLSQLDEBUG to get more details.