一、概念:
pro程序:通过在过程化编程语言中 嵌入sql语句开发出的应用程序叫pro程序。
宿主语言:sql语句所嵌入的语言。proc proc++目的:使c 或者 c++ 这种高效的语言成为访问oracle数据
的工具。
二、例子
a 连接数据库
方式一:exec sql connect:用户名 identified by 密码;方式二:exec sql connect:用户名/密码;
b 查询数据
exec sql select 字段 into 变量 from 表
where 条件;
c 断开数据库连接
exec sql commit work release;
linux上写一个proc程序的步骤
1.编写源代码
vi ***.pc
2.预编译 把pc文件变成c文件
proc ***.pc
3.编译 链接
gcc ***.c -lclntsh
gcc ***.c -lorasql10 (windows)
4.执行
./a.out
一个例子
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include <sqlca.h>
EXEC SQL INCLUDE SQLCA; (1)
int main()
{
EXEC SQL BEGIN DECLARE SECTION;// (2)
char firstname[13];
char userid[9]="open123";
char passwd[19]="open";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT:userid identify by passwd; //(3)
EXEC SQL SELECT FIRSTNME INTO :firstname // (4)
FROM employee
WHERE LASTNAME = 'JOHNSON'; //(4)
printf( "First name = %s\n", firstname );
EXEC SQL CONNECT RESET; //(5)
return 0;
}
上面是一个简单的静态嵌入SQL语句的应用程序。它包括了嵌入SQL的主要部分:
(1)中的include SQLCA语句定义并描述了SQLCA的结构。SQLCA用于应用程序和数据库之间的通讯,其中的SQLCODE返回SQL语句执行后的结果状态。
(2)在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义了宿主变量。宿主变量可被SQL语句引用,也可以被C语言语句引用。它用于将程序中的数据通过SQL语句传给数据库管理器,或从数据库管理器接收查询的结果。在SQL语句中,主变量前均有“:”标志以示区别。
(3)在每次访问数据库之前必须做CONNECT操作,以连接到某一个数据库上。这时,应该保证数据库实例已经启动。
(4)是一条选择语句。它将表employee中的LASTNAME为“JOHNSON”的行数据的FIRSTNAME查出,并将它放在firstname变量中。该语句返回一个结果。可以通过游标返回多个结果。当然,也可以包含update、insert和delete语句。
(5)最后断开数据库的连接。
从上例看出,每条嵌入式SQL语句都用EXEC SQL开始,表明它是一条SQL语句。这也是告诉预编译器在EXEC SQL和“;”之间是嵌入SQL语句。如果一条嵌入式SQL语句占用多行,在C程序中可以用续行符“\”
和c++相关的
oname 默认生成是.c文件 如果改成c++的需要制定成.cpp
iname 输入文件名 可以省略
parse 解析方式 默认是full c的方式. c++ 推荐的方式:none 严格的c++解析:partia ( 不推荐使用)
code 默认是ansi_c . c++ 使用 cpp
proc++ 例子
#include <iostream>
using namespace std;
exec sql include sqlca;
int main(){
exec sql begin declare section;
char userpasswd[30]="openlab/open123";
char var_name[30];
exec sql end declare section;
/* 连接数据库 */
exec sql connect:userpasswd;
/* 查询s_emp表中的 first_name id=1 */
exec sql select first_name into
:var_name from s_emp where id=1;
cout<<"var_name="<<var_name<<endl;
exec sql commit work release;
}
预编译:
proc iname=second.pc oname=second.cpp
parse=none code=cpp编译:g++ second.cpp -lclntsh
执行:
./a.out
注意:
.c++ 要求把所有的在sql中使用的变量 放入申明区
c语言 在linux 和unix 下不用把在sql中使用的变量放入申明区。c++ 无论在哪个系统下都需要把这些变量
放入申明区。
exec sql begin declare section;
/* 这就是申明区 */
exec sql end declare section;
三 宿主变量
既能在sql语句中使用,又能在宿主语言中使用.
1.宿主变量的类型char
char var[n] 定长字符串
short
int
long
float
double
varchar var[n] 变长字符串
a.变长字符串的使用
varchar var_name[n]={0};
在sql语句中 和定长字符串没有区别
exec sql select first_name into :var_name
from s_emp where id=1;
在c中访问数据需要使用 .arr
printf("var_name=%s\n",var_name.arr);
可以得到放入变长字符 数据的长度
var_name.len
在数据的之后 设置一个\0
var_name.arr[var_name.len]='\0';
b.处理变长字符串的方式2
使用 char_map=charz 定长处理 空格补齐 \0结尾
=charf|varchar2 定长 空格补齐
=string 变长 \0结尾
eg: proc charn.pc char_map=string //这样就可以将charn.pc程序中的所有定长字符串变成 变长字符串了。
2.宿主变量的注意事项
1.强烈推荐把宿主变量放入申明区
exec sql begin declare section;
exec sql end declare section;
2.宿主变量可以使用指针 不推荐使用
3.DDL中不能使用宿主变量
4.在sql中使用宿主变量时 推荐加上冒号
exec sql select first_name into :var_name
where id=:id;