This Is A FineDay

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  93 随笔 :: 0 文章 :: 69 评论 :: 0 Trackbacks
http://www.yesky.com/250/1850750_3.shtml
程序内容

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

  2、程序举例

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

/* exam01.pc 开发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(username.arr);
 username.len=(unsigned short)strlen((char *)username.arr);
 printf("\n输入口令:");
 gets(password.arr);
 password.len=(unsigned short)strlen((char *)password.arr);
 printf("\n输入服务器名:");
 gets(server.arr);
 server.len=(unsigned short)strlen((char *)server.arr);
 /* 连接到Oracle服务器上 */
 EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
 printf("\n以用户%s成功地连接到了服务器%s上!\n", username.arr, server.arr);
}
/* 断开连接子程序 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;
  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 以下为建表文件auths.SQL

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 \ auths.sql
REM 下一行为在PL/SQL环境中向auths表插入数据的命令,插入后应提交(COMMIT)!
REM INSERT INTO auths(author_code,name,salary) VALUES('A00001','王达琳',1200);
posted on 2008-07-02 22:44 Peter Pan 阅读(174) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: