您的位置: 旅游网 > 明星 >> 黄晓明

下利用开发接口计划

发布时间:2021-10-28 05:26:29

编程举例

1、程序内容

一般SQL嵌入式程序主要有说明、包含头文件、子程序声明、主程序和子程序等部分组成,在主程序中调用有关子程序。必备的子程序通常有连接到数据库子程序、断开数据库子程序、错误处理子程序和完成某项具体事务(如查询、插入、修改、删除等)的工作子程序。

2、程序举例

下面是一完整的可通过预编译、编译链接和运行的示例程序。

/* 开发Oracle接口程序举例 */

/* 说明:本程序介绍用PROC开发Oracle库接口的编程特点。通过向AUTHS

* 表输入作家代码,查询作家姓名及工资。运行前应建表、插入数据并提交。*/

#include stdio.h

#include string.h

#include stdlib.h

/* 包含SQL通讯区,它用于处理错误。*/

#include sqlca.h

void connect(); /* 连接到Oracle Server */

void disconnect(); /* 断开到Oracle Server的连接 */

void sql_error(char *); /* 处理错误句柄 */

void select(); /* 查询子程序 */

extern sqlglm(char *,int *,int *);

/* 主程序 */

void main()

{

/* 安装错误处理句柄 */

EXEC SQL WHENEVER SQLERROR DO sql_error(\"Oracle错误--\\n\");

/* 连接到数据库 */

connect();

/* 执行查询 */

select();

/* 断开数据库连接 */

disconnect();

}

/* 子程序 */

/* 连接子程序 connect() */

void connect()

{

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR username[10], password[10], server[10];

EXEC SQL END DECLARE SECTION;

/* 输入用户名、口令以及服务器名 */

printf(\"\\n输入用户名:\");

gets(r);

n=(unsigned short)strlen((char *)r);

printf(\"\\n输入口令:\");

gets(r);

n=(unsigned short)strlen((char *)r);

printf(\"\\n输入服务器名:\");

gets(r);

n=(unsigned short)strlen((char *)r);

/* 连接到Oracle服务器上 */

EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;

printf(\"\\n以用户%s成功地连接到了服务器%s上!\\n\", r, r);

}

/* 断开连接子程序 disconnect() */

void disconnect()

{

char temp;

printf(\"\\n是否在断开连接前提交所有事务? (Y/N)\");

scanf(\"%c\", temp);

fflush(stdin);

if(temp !=\'Y\' temp != \'y\')

{

/* 回退事务,断开连接。 */

EXEC SQL ROLLBACK WORK RELEASE;

printf(\"\\n回退事务,断开连接,退出程序!\\n\\n\");

}

else

{

/* 提交事务,断开连接。 */

EXEC SQL COMMIT WORK RELEASE;

俄罗斯副总理谢尔盖·伊万诺夫21日说 printf(\"\\n提交事务,断开连接,退出程序!\\n\\n\");

exit(1);

}

}

/* 查询子程序 select()

* 首先输入作家代码,然后查询作家姓名和工资。*/

void select()

{

EXEC SQL BEGIN DECLARE SECTION;

char author_code[8], name[10];

float salary;

short salary_ind;

EXEC SQL END DECLARE SECTION;

printf(\"\\n输入作家代码: \");

gets(author_code);

/* 查询作家姓名和工资 */

EXEC SQL SELECT name, salary INTO :name, :salary:salary_ind

FROM auths

WHERE author_code = :author_code;

/* 根据指示变量的值来确定该作家的工资是否为空。*/

if (salary_ind ==0)

{

printf(\"\\n作家代码\\t作家姓名\\t作家工资\\n\");

printf(\"--------\\t--------\\t--------\\n\");

printf(\"%8s\\t%8s\\t%8.2f\\n\", author_code, name, salary);

}

else

{

printf(\"作家%s的工资未录入,为空值!\\n\", name);

}

}

/* 错误处理子程序 sql_error() */

void sql_error(char *msg)

{

char err_msg[128];

size_t buf_len, msg_len;

/* 出现SQL错误,继续往下执行。 */

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf(\"\\n%s\\n\", msg);

buf_len=sizeof(err_msg);

/* 调用函数sqlglm()获得错误消息。 */

sqlglm(err_msg, buf_len, msg_len);

printf(\"%.*s\\n\", msg_len, err_msg);

/* 回退事务,断开连接,退出程序。 */

EXEC SQL ROLLBACK RELEASE;

exit(EXIT_FAILURE);

}

3、建表和插入数据记录

上述示例程序如要正确运行,还需以Oracle库的合法用户登录,并创建AUTHS表和插入一些数据记录。建表文件、建表命令和插入数据记录的示例命令如下所述。这里叙述的工作完成后,上节生成的可执行文件才能正确运行。

REM 以下为建表文件L

DROP TABLE auths CASCADE CONSTRAINTS

/

CREATE TABLE auths(

AUTHOR_CODE VARCHAR2(8) NOT NULL,

NAME VARCHAR2(10),

BIRTHDATE DATE,

ENTRY_DATE_TIME DATE,

SALARY NUMBER(7,2),

remark VARCHAR2(255))

/

REM 下一行为在PL/SQL环境中运行建表文件的命令

REM @ E: \\ PROCW \\ Exam01 \\ l

REM 下一行为在PL/SQL环境中向auths表插入数据的命令,插入后应提交(COMMIT)!

REM INSERT INTO auths(author_code,name,salary) VALUES(\'A00001\',\'王达琳\',1200);查看本文来源

铜川白癜风最好医院
南京医院白癜风哪好
汕尾哪里看癫痫
猜你会喜欢的
猜你会喜欢的