PROC主要内容:
1、proc简介
2、proc程序的开发步骤
3、宿主变量和指示变量
4、嵌入sql语句
5、连接数据库的方式
6、错误处理
7、数据的存取更新操作
8、动态SQL
1、proc程序
1.1、概念
在过程化的编程语句中嵌入sql语句而开发出的应用程序,成为pro程序
其中的编程语言,称为宿主语言
SQL语句,成为嵌入式SQL
1.2、proc/c++
在C/c++语言中嵌入sql语句而开发的应用程序,称为proc/c++程序
目的:C/C++这种高效的编程语言成为访问oracle数据库的工具
2、proc程序的基本框架
#include <...>
...
exec sql include sqlca;
定义变量、函数
int main(void){
exec sql connect:用户名/密码;
exec sql select 字段列表 into 变量列表 from 表名 where 条件;
exec sql commit work release;
return 0;
}
3、c程序的开发步骤
1) 编写源程序
vi **.c
2) 编译链接
gcc **.c
3) 执行
a.out
4、proc程序的开发步骤
1) 编写源程序
vi **.c
2) 预编译 .pc--->.c
proc xxx.pc
3) 编译链接
gcc **.c -lclntsh --linux
gcc **.c -lorasql10 --windows
4) 执行
a.out
first.pc
5、宿主变量
5.1、概念
5.2、宿主变量的类型
char
short
int
long
float
double
char var[n] 定长字符串
varchar var[n] 变长字符串
5.3、定长字符串和变长字符串
5.3.1、定长字符串
数据长度不足时,用空格补齐
案例:char
5.3.2、变长字符串
char name[20] --> varchar name[20]
案例:varchar
5.3.3、使用proc的预编译选项
proc **.pc oname=**.cpp
char_map = charz 处理成定长,空格补齐,'\0'结尾
= varchar2|charf 处理成定长,空格补齐,不以'\0'结尾
= string 处理成变长,
5.4、宿主变量使用的注意事项
1) 宿主变量在sql语句中使用时,最好在变量名前加冒号
...
exec sql select first_name into :name from s_emp where id=1;
...
2) DDL语句中不允许使用宿主变量
案例:droptable.pc
3) 宿主变量可以使用指针,但是不建议
4) 宿主变量的定义,强烈建议放入声明区
exec sql begin decalre section;
exec sql end declare section;
6、指示变量
6.1、作用
当数据库表中的字段值,赋值给宿主变量的时,可以使用指示变量,指示赋值状态。
指示变量的值:
0 正常赋值
-1 数据库表中字段的值为null
>0 截断赋值
6.2、语法
指示变量必须是short
short indid;
short indname;
exec sql select id,first_name into :id indicator :indid,:name indicator :indname from s_emp where id=1;
或
exec sql select id,first_name into :id,:name indicator :indname from s_emp where id=1;
6.3、把s_emp中指定id的员工id,first_name,manager_id的值查询出来,使用合适的宿主变量接受查询结果,并指示赋值状态
案例:indvar.pc
7、数组变量
7.1、数组变量的使用注意事项
1) 只能是一维数组,字符可以使用二维
int ids[50];
char name[50][25];
2) 不支持数组指针
3) 数组最大元素个数32767
4) 在select语句中使用数组变量时,直接使用数组名
5) 可以使用指示变量数组,指示多个变量的赋值状态
7.2、查询s_emp所有员工的id,first_name和manager_id,使用数组接受查询结果,同时使用指示变量数组只是manager_id的赋值状态
案例:arr_var.pc
8、sqlca 通信区
8.1、通信区的概念
为了取得每条sql语句执行后的相关的状态说明,以便进行错误的后续处理以及跟踪
sqlca: SQL通信区
oraca: ORACLE通信区
8.2、sqlca通信区
sqlca是oracle和应用程序的一个接口,主要用于错误的诊断和事件处理。
执行proc程序时,每执行一条sql语句,就把sqlca中的所有成员重新赋值。
要想获取sql语句的执行结果的信息,需要在执行后马上获取,否则就会被下一条语句的结果覆盖。
主要的信息包括:
错误代码
警告标志
诊断文本
处理行数 sqlca.sqlerrd[2] 影响行数
sqlca.sqlcode: sql语句执行的状态
0 执行正常
>0 执行错误,异常
<0 数据库本身
sqlca.sqlerrm.sqlerrmc: sql语句出错的原因
案例:sqlca.pc
9、oraca通信区
一个和sqlca类似的数据结构,可以作为sqlca的一个辅助存储区。
如果需要信息的状态信息,可以从oraca中获取。
可以获取执行的sql语句的文本
使用oraca的步骤
1) 包含oraca
exec sql include oraca;
2) 打开oraca选项
exec oracle option(oraca=yes);
3) 设置sql的保存标志
oraca.orastxtf:
0 不保存,默认设置
1 出错的时候才保存
2 sql出现警告或错误时保存
3 始终保存
4) 获取sql文本
oraca.orastxt.orastxtc
案例:oraca.pc
10、proc中使用sql语句
1) select语句
语句前家exec sql,配合into使用
exec sql select first_name into :name from s_emp where id=1;
2) dml语句(insert delete update)
tcl语句(commit rollback)
ddl语句(create drop alter)
直接在语句前家exec sql
注意:ddl语句中,不能使用宿主变量
综合案例:实现一个迷你型学生管理系统,功能如下:
1、创建学生信息表,包括
学号,姓名,出生日期
2、添加学生
3、根据学号修改
4、根据学好删除学生
5、现实学生列表
练习