Ubuntu Informix如何编写程序
导读:Ubuntu 下 Informix 开发快速上手 一 环境准备与连接 创建专用用户与目录,设置环境变量(以实例名为 ifxserver 为例): 创建用户与目录:sudo groupadd informix;sudo useradd -...
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
- 示例脚本 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
- 客户端/驱动不匹配:确保客户端版本与服务器兼容,必要时调整驱动或版本
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Informix如何编写程序
本文地址: https://pptw.com/jishu/783232.html
