什么是proc程序
通过在过程化编程的语言中,嵌入sql语句开发出的应用程序叫proc程序
宿主语言: sql语句所嵌入的语言
proc proc++
目的:使c和c++这种高效的语言成为访问oracle数据库的工具
一个proc程序中
引入相关的头文件
定义需要的变量
声明函数
实现函数
连接数据库
exec sql connect:username identified by password
exec sql connect:username/password
查询数据库
exec sql select 字段 into 变量 from 表 where 条件
断开数据库连接
exec sql commit work release
****************************************************
编写步骤:
1. vi ***.pc 2 proc ***.pc 3. gcc ***.c -lclntsh (linux) -lorasql10(windows) 4.执行
proc的预编译选项
oname 默认是.c文件, 如果是c++需要定制成.cpp
parse 解析方式 ,默认是full c的方式 ;partia严格的c++解析, 不推荐使用; none c++推荐的方式
code 默认是ansi_c, c++使用cpp
例子 proc iname=demo.pc oname=demo.cpp parse=none code=cpp
c++要求吧所有的在sql使用的变量放入到申明区
c语言在linux和unix下不用把sql使用的变量放入申明区。c++无论在哪个系统下都需要把这些变量放入到申明区。
exec sql begin declare section;
/* 这里是申明区 */
exec sql end declare section;
c++编译链接使用g++ ***.cpp -lclntsh
**************************************
proc 和plsql滴哦啊用相关的预编译选项sqlcheck=semantics userid=用户名/密码
proc 和字符串处理相关的预编译选项 char_map
**************************************
宿主变量:既能在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
b.处理变长字符串的方式2
使用char_map=charz定长处理 空格补齐 \0结尾
=charf|varchar2 定长 空格补齐
=string 变长 \0结尾
proc charn.pc char_map=string
2 宿主变量的注意事项
1.强烈推荐把宿主变量放入申明区
2宿主变量可以使用指针 不推荐使用
3DDL中不能使用宿主变量
4 在sql中使用宿主变量时 推荐加上冒号
******************************************************
指示变量必须是short类型。(indicator)
exec sql select first_name, manager_id into :var_name,:mid:indmid from s_emp;
exec sql select first_name, manager_id into :var_name,:mid indicator :indmid from s_emp;
******************************************************************************
数组变量
proc 只支持一维数组字符除外
proc不支持数组指针
最大元素32767
数组变量在select语句中使用时, 只能给出数组名,不能给下标
把s_emp表中所有的first_name, connission_pct分别放入两个数组中, 然后指示提成的赋值状态
*******************************************************************************
可以从sqlca中获取sql语句影响的行数据
sqlca通信区
sqlca.sqlerrd[2] sql语句影响的行数
sqlca.sqlcode sql语句执行的状态
==0sql语句执行正常
〉0异常发生, 一般违反约束
〉0 数据库本身出错, 或者 网络错误
sqlca.sqlerrm.sqlerrmc 得到sql执行出错原因
*******************************************************
oraca 也是一个通信区,它是对sqlca的信息补充
资源小猴比较大 所以这个通信区默认关闭
1 包含oraca
exec sql include oraca;
2打开oraca通信区
exec oracle option (oraca=yes)
3设置sql语句的保存状态 oraca.orastxtf
0 默认的 不保存sql
1 sql出错时保存
2 sql出现警告保存
3无论什么情况都保存
4 从oraca中得到sql文本
oraca.orastxt.orastxtc