下利用开发接口计划
编程举例
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);查看本文来源
铜川白癜风最好医院南京医院白癜风哪好
汕尾哪里看癫痫
- 衣服存放小技巧,一年不返潮不长虫,有点管用啦
- 越老实的人,越容易工作不顺,原先是因为犯了这几个毛病!很现实
- 投资者提问:新公司董秘好!因新公司近期流通股东解禁较多,请问截止今年上半年新公司...
- 宝妈顺产姐妹,满月酒上2女1儿很拉风,被慕“人生赢家”!
- 江阴减税降费助防疫物资生产企业“疫”马当先
- 美股短线跳水,三大股指尽数转跌
- 按揭提问:请问,香港中央结算有限公司什么时候减持的?
- 上海统筹设置常态化采样点:固定 +便民+流出
- 张常宁晒豪华婚房!主动搂太太,满意冠希作品:太太拍照技术渐长
- 谢尔曼空调x京东超级品牌日:速享向往的生活新风
- FCC文件阐述苹果神秘的“网络适配器”,运行iOS系统
- 日系风穿回程果然不简单,懂得细节回程配,让你魅力四射