Ubuntu Informix如何编写程序
小樊
31
2025-12-28 20:19:19
Ubuntu 下 Informix 开发快速上手
一 环境准备与连接
创建专用用户与目录,设置环境变量(以实例名为 ifxserver 为例):
创建用户与目录:sudo groupadd informix;sudo useradd -g informix -d /opt/informix -m informix;sudo passwd informix;sudo mkdir -p /opt/informix/data ;sudo chown informix:informix /opt/informix/data
配置环境变量(写入 /home/informix/.bashrc 或 ~/.profile ):
export INFORMIXDIR =/opt/informix
export INFORMIXSERVER =ifxserver
export ONCONFIG =onconfig.ifxserver
export INFORMIXSQLHOSTS =$INFORMIXDIR/etc/sqlhosts
export PATH =$INFORMIXDIR/bin:$PATH
export LD_LIBRARY_PATH =$INFORMIXDIR/lib:$LD_LIBRARY_PATH
使配置生效:source ~/.bashrc;验证:echo $INFORMIXDIR、$INFORMIXSERVER
初始化与验证实例:
初始化:sudo -u informix oninit -ivy
查看状态:onstat -i(应看到数据库处于 Online)
配置网络与连接:
/etc/services 增加端口:echo “informix_services 8888/tcp ” | sudo tee -a /etc/services
$INFORMIXDIR/etc/sqlhosts 增加条目:informix onsoctcp 127.0.0.1 informix_services
连接测试:dbaccess - - <<< “SELECT COUNT(*) FROM systables;”(无报错即连通)
二 使用 dbaccess 与 SQL 脚本开发
交互式开发:dbaccess - 进入交互界面,可执行 DDL/DML、存储过程等。
脚本化执行(便于版本管理与自动化):
示例脚本 create_table.sh(创建表、插入与查询):
#!/bin/bash
dbaccess - - <<‘EOF’
CREATE DATABASE IF NOT EXISTS your_database_name;
DATABASE your_database_name;
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
hire_date DATE
);
INSERT INTO employees (employee_id, first_name, last_name, email, hire_date)
VALUES (1, ‘John’, ‘Doe’, ‘john.doe@example.com’, ‘2023-01-15’);
SELECT * FROM employees;
EOF
赋权与运行:chmod +x create_table.sh;./create_table.sh
常用运维命令:onstat -i(状态)、onmode -ky(停库)、oninit -v(启动)
三 存储过程与 SQL PL 示例
基本语法要点:使用 CREATE PROCEDURE … RETURNING INT/CHAR/VARCHAR ;参数支持 IN/OUT ;块内支持 IF/WHILE/SET 等;可用 SQLCODE/SQLSTATE 判断执行状态;支持通过 ALTER PROCEDURE … COMPILE 显式编译;调用用 CALL ,输出参数以绑定变量接收。
示例 1(查询员工姓名与部门,返回状态码):
CREATE PROCEDURE get_employee_details (
IN emp_id INT,
OUT emp_name VARCHAR(100),
OUT emp_dept VARCHAR(100)
)
RETURNING INT
AS
BEGIN
SELECT name, department INTO emp_name, emp_dept
FROM employees WHERE id = emp_id;
IF SQLCODE <> 0 THEN
RETURN -1;
ELSE
RETURN 0;
END IF;
END PROCEDURE;
调用与输出(命令行交互示例):
DEFINE p_name VARCHAR(100); DEFINE p_dept VARCHAR(100);
CALL get_employee_details(1, :p_name, :p_dept);
PRINT p_name, p_dept;
示例 2(简单字符串处理,演示基本控制流与返回值):
CREATE PROCEDURE second_string(input CHAR(256))
RETURNING CHAR(256);
DEFINE var1 CHAR(256);
DEFINE var2 INT;
LET var1 = input;
LET var2 = 1;
WHILE var2 <= LENGTH(var1)
IF SUBSTR(var1, var2, 1) = ’ ’ THEN
RETURN SUBSTR(var1, var2 + 1);
END IF;
LET var2 = var2 + 1;
END WHILE;
RETURN var1;
END PROCEDURE;
执行与删除:
EXECUTE PROCEDURE second_string(‘gAAAAAAAAAAAAAA 0.0000’);
DROP PROCEDURE second_string(CHAR);
提示:不同版本的 Informix 在 SQL PL 细节上可能存在差异,请以所用版本的官方手册为准。
四 C 语言 ESQL/C 开发流程
准备与编译链路:
环境:确保 INFORMIXDIR、PATH、LD_LIBRARY_PATH 已设置;安装 Informix 开发包/头文件(含 esql 命令与头文件)。
源文件:hello.ec
#include <stdio.h>
EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
char dbname[128] = “your_database_name”;
char uname[32] = “your_user”;
char passwd[32] = “your_password”;
EXEC SQL END DECLARE SECTION;
int main() {
EXEC SQL CONNECT TO :dbname USER :uname USING :passwd;
if (sqlca.sqlcode != 0) { fprintf(stderr, “Connect failed\n”); return 1; }
EXEC SQL SELECT COUNT(*) INTO :count FROM systables;
printf(“Table count: %d\n”, count);
EXEC SQL DISCONNECT;
return 0;
}
编译与链接(示例):
esql -o hello.c hello.ec
gcc hello.c -o hello -I$INFORMIXDIR/incl -L$INFORMIXDIR/lib -lifxsql -ldl -lm
运行:./hello(确保 INFORMIXSERVER、sqlhosts 配置正确)。
五 常见问题与排查
无法连接数据库:
检查实例是否运行:onstat -i;未运行则 oninit -ivy
核对 INFORMIXSERVER、sqlhosts 与 /etc/services 端口一致(如 8888/tcp )
使用 dbaccess 本地直连排除网络问题
权限不足:以具备相应权限的数据库用户执行,或授予所需权限
库路径问题:确认 LD_LIBRARY_PATH 包含 $INFORMIXDIR/lib
客户端/驱动不匹配:确保客户端版本与服务器兼容,必要时调整驱动或版本