ESQL/C编程
索引:
1.sqlca结构
struct sqlca_s { long sqlcode; char sqlerrm[72]; char sqlerrp[8]; long sqlerrd[6]; struct sqlcaw_s { char sqlwarn0; char sqlwarn1; char sqlwarn2; char sqlwarn3; char sqlwarn4; char sqlwarn5; char sqlwarn6; char sqlwarn7; } sqlwarn; }sqlca;
含义说明:
sqlcode
表明最近的SQL语句执行结果:
- sqlcode = 0,语句执行成功;
- sqlcode < 0,语句执行后有错误发生;
- sqlcode = 1~99,该值依赖于动态SQL语句中SQL有关执行的设置;
- sqlcode = 100,在执行SELECT或FETCH查找操作后返回零记录。在sqlca.h中将SQLNOTFOUND定义为100。
sqlerrm
错误消息参数,特定于错误消息。
sqlerrp
暂时没用。
sqlerrd
sqlerrd[0]:估计返回记录的数目,在动态SQL中使用。
sqlerrd[1]:INSERT语句执行后的SERIAL型值或产生的C-ISAM错误代码,ISAM错误代码是更详细的解释。
sqlerrd[2]:RDSQL语句处理的记录数目。
sqlerrd[3]:估计的代价,在动态SQL语句中使用。
sqlerrd[4]:RDSQL语句的错误补偿。
sqlerrd[5]:INSERT语句执行后最后一条记录的ROWID值。
sqlwarn0
如果sqlwarn1~sqlwarn7中有一个或多个已被置为W,则sqlwarn0也被置为W;如果sqlwarn0为空,则说明sqlwarn1~sqlwarn7全部都为空。
sqlwarn1
如果一个或多个数据项被截断以适应字符型的宿主变量,则它被置为W。
sqlwarn2
在使用聚合函数,如SUM、AVG、MAX、MIN等时,如果遇到空值NULL,则其值被置为W。
sqlwarn3
若SELECT子句选择列表中的项目数不同于INTO子句中的宿主变量数,则其值被置为W。
sqlwarn4
若UPDATE或DELETE语句中没有使用WHERE子句,则其值可被DESCRIBE、PREPARE语句置为W。
其他语句中表示不兼容的浮点格式。
sqlwarn5
程序执行的操作是INFORMIX扩展的,超出了标准的ANSI SQL,故必须定义DBANSIWARN环境变量。
sqlwarn6
现在不用。
sqlwarn7
现在不用。
2.语法说明
INFORMIX支持两种语法形式:一种是使用$作为前缀;另一种是使用ANSI标准的EXEC SQL关键字。下面统一使用ANSI标准,以便于移植。
3.宿主变量
(1).定义
宿主变量是用于SQL语句的C语言的普通变量。
在SQL语句中在宿主变量前必须加冒号(:)作前缀。
(2).定义方法
在语句:
EXEC SQL BEGIN DECLARE SECTION
和:
EXEC SQL END DECLARE SECTION
中定义。
(3).SQL与C数据类型的对应
SQL类型 | C类型 |
---|---|
CHAR(n) | char(n+1) |
CHARACTER(n) | |
SMALLINT | short int |
INTEGER | long int |
INT | |
SMALLFLOAT | float |
REAL | |
FLOAT | double |
DOUBLE PRECISION | |
SERIAL | long int |
DATE | long int |
DECIMAL | dec_t或struct decimal |
DEC | |
NUMERIC | |
DATETIME | dtime_t或struct dtime |
INTERVER | intrvl_t或struct intrvl |
MONEY | dect_t或struct decimal |
VARCHAR | varchar或string |
4.指示变量
指示变量的定义方法同宿主变量,其类型必须为短整型short。用于如下场合:
(1).检索到空值NULL
若一条语句将NULL值返回给宿主变量,则指示变量具有负值,此时宿主变量的值未定义。
如果没有给宿主变量指定指示变量,并且返回NULL值,则说明出错并将sqlca.sqlcode置成负值。
(2).数据被截断
若非NULL的值被取出给宿主变量字符数组,但被截断以适应数组长度,此时截断部分在sqlca结构中有信号标志,而指示变量则说明截短的程度。
若返回值不是NULL也不是截断,则指示变量为零。
(2).插入NULL值
使用INSERT语句插入空值NULL,可使用带负值指示变量的宿主变量。
5.头文件
informix中有多个头文件,但sqlca.h是必需的。
包含头文件的方法:
EXEC SQL include filename;
6.esql命令语法
esql [ -e ] [PreprocessorOption] [CcArgs] [ -o ExecuteFile] Source.ec [CompileLinkOptions]
说明:
-e:只进行预编译,不执行C编译和连接;
PreprocessorOption:预编译选项,有如下值:
- [-g]:给每行编号;
- [-{Gnln}]:没有行号供debugger使用;
- [-ansi]:发现informix扩展超越了ansi标准时给出警告;
- [-t type]:使用由type指定的C编译器,不使用cc;
- [-icheck]:加上错误检测代码,当返回SQL NULL但没有是使用指示变量时产生运行错误;
- [-local]:使游标名和语句id号相对于当前的源文件来说是局部的;
- [-log ErrorFile]:把编译信息送到指定的文件中,而不是送到标准输出;
- [-EDsymblename[=value]]:定义一个预编译符号;
- [-EUsymblename]:取消一个预编译符号的定义。
CcArgs是传给C编译器的特定参数。
CompileLinkOptions是其他文件,包括纯C代码、目标文件和库等。
7.常用RDSQL
选择数据库
DATABASE database_name [EXCLUSIVE]
数据库名可使用宿主变量。
连接数据库
CONNECT database_name[@server_name] \ [USER user_name [ USING passwd ]]
其中passwd必须使用宿主变量。
关闭数据库
CLOSE DATABASE
数据查询语句SELECT
SELECT [ UNIQUE | DISTINCT | ALL ] SelectList [ INTO … ] FROM TableList [ WHERE FilterJoin ] [GROUP BY ColumnGroupList ] [ HAVING GroupFilter ] [ ORDER BY OrderFilter ] [ INTO TEMPTable ]
插入语句INSERT
INSERT INTO table_name [ ( ColumnList ) ] VALUES( valuelist )
修改语句UPDATE
UPDATE table_name SET {column_name = expr [, … ] | {(column_list) | * } = (expr_list ) } [ WHERE {condition | CURRENT TO cursor_name } ]
数据删除语句DELETE
DELETE FROM table_name [ WHERE {condition | CURRENT OF cursor_name } ]
事务控制语句
BEGIN WORK COMMIT WORK ROLLBACK WORK
PREPARE语句
显式的请求对SQL语句进行语法分析:
PREPARE statement_name FROM string_spec
其中,statement_name是同SQL语句相联系的标示符或存放该标示符的宿主变量。
缺省情况下,语句标示符作用域是全局的,可以在一个源文件里准备一条语句,而在另一个源文件中执行它。
如果希望所有这类标示符的作用域对于准备语句的源文件都是局部的,则必须在esql命令行中使用-local标志。
EXECUTE语句
执行准备好的SQL文本,如果准备文本中使用了“?”占位符,则执行时要提供值:
EXECUTE statement_id [USING {input_list | DISCRIPTIOR sqlda_ptr}]