DB2 兼容

DM PRO*C对DB2PRO*C的常用语法进行了兼容,在dpc_new预编译命令中将MODE参数置为DB2表示使用兼容DB2语法的编译模式。使用兼容DB2模式时,在编译时还需要使用sqlca_db2.h、sqlda_db2.h。

5.1简单的DB2嵌入式程序结构分析

首先通过一个简单的DB2嵌入式程序入手,对DB2嵌入式程序的结构及基本语法进行分析。与Oracle、DM嵌入式程序不同的是,DB2嵌入式程序的扩展名不是.pc,而是.sqc。

例如,以下名为update.sqc的嵌入式程序,完成对表staff相关操作的功能。

##include <stdio.h>

##include <stdlib.h>

##include <string.h>

EXEC SQL INCLUDE SQLCA;

int main(int argc, char *argv[]) {

    EXEC SQL BEGIN DECLARE SECTION;

        char pname[10];

        short dept;

        char username[19],password[19],servername[19];

    EXEC SQL END DECLARE SECTION;

    printf(" Please input Servername :");

    scanf("%s",servername);

    printf("Input Username: ");

    scanf("%s", username);

    printf("Input Password: ");

    scanf("%s",password);

    EXEC SQL CONNECT TO :servername USER :username USING :password;

    EXEC SQL CREATE TABLE STAFF (name varchar(10), dept int, job varchar(40));

    EXEC SQL INSERT INTO STAFF VALUES('Jack',80,'Mgr');

    EXEC SQL INSERT INTO STAFF VALUES('Joan',30,'Mgr');

    EXEC SQL DECLARE c1 CURSOR FOR

    SELECT name, dept FROM staff WHERE job='Mgr'FOR UPDATE OF job;

    EXEC SQL OPEN c1;

    do {

        EXEC SQL FETCH c1 INTO :pname, :dept;

        if (SQLCODE != 0) break;

        if (dept > 40) {

            printf( "%-10.10s in dept. %2d will be demoted to Clerk\n",

            pname, dept );

            EXEC SQL UPDATE staff SET job = 'Clerk'

            WHERE CURRENT OF c1;

    	}

        else {

            printf ("%-10.10s in dept. %2d will be DELETED!\n",

            pname, dept);

            EXEC SQL DELETE FROM staff WHERE CURRENT OF c1;

        } /* endif */

	} while ( 1 );

    EXEC SQL CLOSE c1;

    EXEC SQL DROP TABLE STAFF;

    EXEC SQL ROLLBACK;

    printf( "\nOn second thought -- changes rolled back.\n" );

    EXEC SQL CONNECT RESET;

    return 0;

}

与其他 PRO*C文件类似,DB2的sqc文件由以下几个部分组成:

  1. SQLDA/SQLCA 引用
EXEC SQL INCLUDE SQLCA;

详见5.2 SQLDA/SQLCA。

  1. 宿主变量定义
EXEC SQL BEGIN DECLARE SECTION;

char pname[10];

short dept;

char userid[9];

char passwd[19];

EXEC SQL END DECLARE SECTION;

详见3.2宿主变量定义。

  1. 登录数据库
EXEC SQL CONNECT TO localhost USER :userid USING :passwd [AT [dbname | :dbname]];;
  1. 数据操作

登录成功之后,便可对数据库进行各种操作。

  1. 退出登录
EXEC SQL [AT [dbname | :dbname]] CONNECT RESET;

操作完毕后,从数据库退出登录。

5.2SQLDA/SQLCA

DB2中的SQLDA、SQLCA是用于记录PRO*C程序在执行过程中的描述信息及诊断信息。为了实现与DB2的兼容,DM在dpc_dll中对其进行实现,保留了SQLDA、SQLCA各成员变量在DB2中的原始含义,并分别用于DB2 PRO*C程序在DM上执行的描述及诊断信息的记录。

SQLDA、SQLCA的相关声明与定义在预编译时不会自动引入,用户需在PRO*C文件的头部手动引入,代码如下所示:

EXEC SQL INCLUDE SQLCA;

EXEC SQL INCLUDE SQLDA;

5.3可执行的SQL语句

DM与DB2登录数据库的语法不同,为此,DM对DB2登录数据库语句语法实现了支持,其语法格式如下:

EXEC SQL CONNECT TO :servername USER :username USING :psw [AT [dbname |:dbname]];;

或

EXEC SQL CONNECT TO servername USER :username USING :psw [AT [dbname |:dbname]];;

功能:用于数据库的登录。

使用说明:

  • 语句中username是长度最多为128个字符的指针或者为具体名称(如localhost),其值为注册用户的名字;
  • pwd表示相应的用户口令,口令的长度最多为128个字符;
  • dbname用于指定连接名,为长度最大为128个字符的标识符或宿主变量。在使用多连接时给每个连接命名(不命名时系统会自动给一个默认连接名),在执行其他嵌入SQL时通过指定连接名可以切换到不同连接进行操作;
  • servername为服务器的名字, 名字的长度最多为128个字符。
注意

在用户程序中,登录语句的逻辑位置必须先于所有可执行的 SQL语句,只有执行登录语句之后,才能执行其它可执行的 SQL语句。如果登录失败,则终止程序的运行。

其他可执行语句详见3.3节描述。

5.4数据类型映射

指定DB2兼容的预编译模式时,数据类型的映射如下表所示。

表5.1 DB2兼容数据类型映射
数据类型 DM_TYPE DB2_TYPE 兼容 ANSI 标准类型
DSQL_CHAR 1 -109 1
DSQL_VARCHAR 2 -108 12
DSQL_BIT 3 不支持 14
DSQL_TINYINT 5 不支持 -1
DSQL_SMALLINT 6 -121 5
DSQL_INT 7 -120 4
DSQL_BIGINT 8 -119 -2
DSQL_DEC 9 -117 3
DSQL_FLOAT 10 -116 6
DSQL_DOUBLE 11 -116 8
DSQL_BLOB 12 -106 不支持
DSQL_DATE 14 -100 9
DSQL_TIME 15 -101 9
DSQL_TIMESTAMP 16 -103 9
DSQL_BINARY 17 不支持 -3
DSQL_VARBINARY 18 不支持 -3
DSQL_CLOB 19 -107 -4
DSQL_TIME_TZ 22 不支持 9
DSQL_TIMESTAMP_TZ 23 不支持 9
DSQL_INTERVAL_YEAR 100 -100 10
DSQL_INTERVAL_MONTH 101 -100 10
DSQL_INTERVAL_DAY 102 -100 10
DSQL_INTERVAL_HOUR 103 -100 10
DSQL_INTERVAL_MINUTE 104 -100 10
DSQL_INTERVAL_SECOND 105 -100 10
DSQL_INTERVAL_YEAR_TO_MONTH 106 -100 10
DSQL_INTERVAL_DAY_TO_HOUR 107 -100 10
DSQL_INTERVAL_DAY_TO_MINUTE 108 -100 10
DSQL_INTERVAL_DAY_TO_SECOND 109 -100 10
DSQL_INTERVAL_HOUR_TO_MINUTE 110 -100 10
DSQL_INTERVAL_HOUR_TO_SECOND 111 -100 10
DSQL_INTERVAL_MINUTE_TO_SECOND 112 -100 10
微信扫码
分享文档
扫一扫
联系客服