一、概述
1. 概念
通过在过程化编程语言C/C++中嵌入SQL语句而开发出的应用程序。在通用编程语言中使用的SQL称为嵌入式SQL。
在SQL标准中定义了多种语言的嵌入式SQL ,各个厂商对嵌入式SQL的具体实现不同。
在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。
目的:使c/c++这种高效率语言成为访问数据库的工具。
嵌入式SQL的载体是宿主语言。
宿主语言 Pro程序
C/C++ Pro*C/C++
FORTRAN Pro*FORTRAN
PASCAL Pro*PASCAL
访问数据库的方法
用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库;
用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等;
利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。
访问oracle数据库的方法
SQLPLUS oracle自带访问数据库工具
JDBC java database connectivity standard
ODBC open database connectivity开放数据库互连
OCI oracle call interface
OCCI oracle c++ call interface
Pro*X Pro*C/C++ Pro*COBOL等
2. 程序结构
Pro*C程序实例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sqlca.h"
EXEC SQL BEGIN DECLARE SECTION;
char username[32];
char password[32];
char dname[25];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
void sqlerror();
main()
{
EXEC SQL WHENEVER SQLERROR DO sqlerror();
strcpy(username,“haha");
strcpy(password, “haha");
EXEC SQL CONNECT:username IDENTIFIED BY:password;
EXEC SQL select dname into :dname from dept where id=10;
printf(“dname:%s \n”, dname);
}
void sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\n---- oracle error detected:\n");
printf("%.70s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}
Pro*C程序结构
Include 头文件 (c/c++ and pro*c/c++)
定义变量
定义函数
main
连结数据库: connect
SQL 操作语句: EXEC SQL …….;
exception handler
断开连结:
EXEC SQL COMMIT / ROLLBACK WORK release
3. 开发流程
需要使用proc将.pc文件预编译为.c文件,再按照.c文件的流程编译.c文件。
例子
编写hello.pc
#include <stdio.h>
#include <string.h>
#include "sqlca.h"
EXEC SQL BEGIN DECLARE SECTION ;
char *serverid = "scott/123456@orcl";
EXEC SQL END DECLARE SECTION;
int main()
{
int ret = 0;
printf("hello...\n");
printf("serverid:%s\n", serverid);
EXEC SQL connect :serverid;
if(sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
printf("EXEC SQL connect:err, %d\n", ret);
return ret;
}
printf("connect ok\n");
return ret;
}
使用proc命令proc hello.pc
使用gcc命令
gcc hello.c -I/home/oracle_11/app/oracle/product/11.2.0/db_1/precomp/public -L//home/oracle_11/app/oracle/product/11.2.0/db_1/lib -lclntsh
c++例子
编写c++版的hellocpp.pc
#include <stdio.h>
#include <string.h>
#include "sqlca.h"
using namespace std;
EXEC SQL BEGIN DECLARE SECTION ;
char *serverid = "scott/123456@orcl";
EXEC SQL END DECLARE SECTION;
int main()
{
int ret = 0;
cout << "hello...\n" << endl;
cout << "serverid:" << serverid << endl;
EXEC SQL connect :serverid;
if(sqlca.sqlcode != 0)
{
ret = sqlca.sqlcode;
printf("EXEC SQL connect:err, %d\n", ret);
return ret;
}
printf("connect ok\n");
return ret;
}
使用proc编译
proc iname=C:\Users\Administrator\Desktop\hellocpp.pc oname= C:\Users\Administrator\Desktop\hellocpp.cc PARSE=NONE CODE=CPP
使用g++编译
g++ hellocpp.cc -I/home/oracle_11/app/oracle/product/11.2.0/db_1/precomp/public -L//home/oracle_11/app/oracle/product/11.2.0/db_1/lib -lclntsh
二、prc*c/c++基础开发
1. 连接数据库
见上面的例子。
2. 宿主变量和指示器变量
宿主变量是一种pro*c语言变量, 用于在应用程序中和oracle数据库之间传递数据。Pro*C程序中,既可在SQL语句中引用,也可在C语句中引用的变量称为SQL变量。
宿主变量的数据类型
char 单字符
char[n] N个定长字符数组
int 整数
Short 短整数
long 长整数
float 单精度浮点数
double 双精度浮点数
VARCHAR[n] 变长字符串
例子
编写demo1.pc
#include <stdio.h>
#include <string.h>
#include "sqlca.h"
EXEC SQL BEGIN DECLARE SECTION ;
char *serverid = "scott/123456@orcl";
int tid;
char tname[20];
char taddress[50];
int tid2;
char tname2[20];
char taddress2[50];
EXEC SQL END DECLARE SECTION;
int main()
{
int ret = 0;
printf("hello...\n");
printf("serverid:%s\n", serverid);