Duangw

ESQL/C编程

索引:

  1. sqlca结构
  2. 语法说明
  3. 宿主变量
  4. 指示变量
  5. 头文件
  6. esql命令语法
  7. 常用RDSQL

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语句执行结果:

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:预编译选项,有如下值:

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}]