温馨提示×

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
  • 客户端/驱动不匹配:确保客户端版本与服务器兼容,必要时调整驱动或版本

0