proc(1)
来源:互联网 发布:大数据时代的阅读答案 编辑:程序博客网 时间:2024/06/06 18:59
proc
主要内容:
1.proc简介
2.proc程序的开发流程
3.宿主变量和指示变量
4.嵌入sql语句
5.连接数据库
6.错误处理
7.数据的存取更新操作
8.动态sql
------------------------------------------
1.什么是pro程序?
1.1概念
在过程化的编程语言中嵌入sql开发出的应用程序,称为pro程序
在编程语言中嵌入的sql叫做嵌入式sql
可以嵌入sql语句的编程语言称为宿主语言
1.2proc/c++
在c/c++语言中嵌入slq语句开发出的应用程序,称为proc/c++程序
目的:使c这种高效率的编程语言成为访问oracle数据库的工具
2.proc程序和数据库相关的操作
#include <stdio.h>
..
函数
变量
main(){}
/* 包含一个 sqlca的结构 */
exec sql include sqlca;
/* 连接数据库 */
exec sql connect:用户名/密码;
/* 执行对数据库的操作 */
exec sql select 字段 into 变量 from 表名 where 条件;
....
/* 断开数据库连接 */
exec sql commit work release;
exec sql rollback work release;
3.C程序的编写步骤
1) 编写源程序
vi ***.c
2)编译 连接
gcc ***.c
3)执行
./a.out
4.proc程序的编写步骤
1)编写源代码
vi ***.pc
2)预编译 ***.pc --> ***.c
proc ***.pc
3)编译 连接
gcc ***.c -lclntsh -- linux
4)执行
./a.out
案例:
vifirst.pc
5.宿主变量
5.1概念
在宿主语言中声明的变量,称为宿主变量
特点是既可以在宿主语言中使用,也可以在sql语句中使用
5.2宿主变量的类型
char 字符
char var[n] 定长字符串
short
int
long
float
double
varchar var[n] 变长字符串
5.3定长字符串和变长字符串
1)定长字符串 长度不足补空格
cp first.pc charn.pc
2)变长字符串
cp charn.pc varcharn.pc
char --- varchar
在sql语句中使用变长字符串变量和定长字符串变量没有区别
但是在宿主语言中使用时,变长字符串需要用.arr提取数据
可能产生乱码
解决乱码问题的方法:
a.变长字符串进行初始化
varchar name[30]={0};
b.把变长字符串之后赋值为'\0'
name.arr[name.len]='\0';
变长字符串只有两个属性:arr len
3)使用预编译选项
oname 相当c中-o
例如:proccharn.pc oname=my.c
char_map =charz: 把字符串处理成定长 空格补齐 \0结尾
默认的处理方式
=varchar2|charf:把字符串处理成定长 空格补齐
不以 \0 结尾
=string 把字符串处理成变长 \0结尾
charn.pc
proc charn.pc char_map=string
gcc charn.c -lclntsh
./a.out
5.4宿主变量的使用注意事项
1)宿主变量在sql语句中使用时最好在宿主变量前加:
避免宿主变量和表中字段重名时引起的问题
...
int id=2;
...
exec sql select first_name into name from s_emp
where id=id;
...
结果是id=1的数据
2)ddl语句中不能使用宿主变量
vi ddl.pc:删除一张表
...
char tablename[30]="emp_zsm_00";
/* 删除名称为 tablename 的表 */
exec sql drop table tablename;
/* 错误 宿主变量不允许在ddl语句中使用 */
exec sql drop table :tablename;
3)允许使用指针,但不推荐使用
4)宿主变量的声明,强烈推荐放入声明区
(c++,windows要求宿主变量的声明必须放入声明区,
为了兼容不同的语言和系统,最好放入声明区)
exec sql begin declare section;
//声明宿主变量
exec sql end declare section;
6.指示变量
6.1作用
从数据库中读取数据赋值的宿主变量时,可以使用指示变量指示
赋值的状态
指示变量的值:
0 -- 赋值正常
-1 -- 数据库中对应字段的值为null
>0 -- 截断赋值,要尽量避免(编译没有错误,出错的时机不确定)
指示变量的类型必须是short
6.2指示变量的语法
short indid;
short indname;
-- 第一种用法
exec sql select id,first_name into :id:indid,:name:indname
from s_emp where id=1;
宿主变量和指示变量之间可以有空格,但一般不加
-- 第二种用法(indicator:指示器)
exec sql select id,first_name into :id indicator :indid,
:name indicator :indname from s_emp where id=1;
6.3把s_emp表中id=1的员工的manager_id和first_name查询出来
保存在对应的宿主变量中,并用指示变量指示manager_id的赋值状态
vi indvar.pc
7.数组变量
7.1使用数组的注意事项
1)只能使用一维数组,char型除外
int data[10];
char names[50][30];
2)不支持指针数组
3)数组最大元素个数为32767
4)在select语句中使用数组时,只能使用数组名,不能加下标
5)要对多个变量的赋值状态进行指示时,可以使用指示变量数组
7.2把s_emp表中所有员工的id,first_name,manager_id查询出来
用多个数组保存,并声明指示变量数组指示manager_id的赋值状态
循环输出员工的信息
vi indvar_arr.pc
8.sqlca通信区
sqlca本质上是一个结构体
每执行一条sql语句,sqlca中的数据就会被覆盖、更新
所有想要获取sqlca中的数据时需要执行完sql语句马上获取
sqlca.sqlerrd[2] sql语句影响的行数
sqlca.sqlcode sql语句执行的状态
==0 执行正常
>0 执行出错 比如出现异常
<0 数据库系统错误 或者网络错误
sqlca.sqlerrm.sqlerrmc:sql出错的原因(错误的信息)
cpindvar_arr.pc sqlca.pc
9.oraca通信区
对sqlca通信区的补充
可以获取执行的sql语句的文本
使用步骤:
1)包含oraca结构体
exec sql include oraca;
2)打开oraca
exec oracle option(oraca=yes);
3)设置在什么情况下保存sql文本
oraca.orastxtf 取值:
0 不保存 默认值
1 sql语句错误时保存
2 sql语句出现警告或错误时保存
3 无论什么情况都保存
4)取得保存的sql文本
oraca.orastxt.orastxtc
vi oraca.pc
10.在proc中使用sql语句
1)select语句 -- 配合into 使用,前边加exec sql
exec sql select 字段 into :宿主变量 from 表名
where 条件;
2)ddl(create drop alter)
dml(insert delete update)
tcl(commit rollback savepoint)
直接在sql语句前加exec sql
ddl中不能使用宿主变量
案例:完成以下功能
1)创建表:
id number primary key
name varchar2(25)
sal number(11,2)
2)从s_emp表中查询id,first_name,salary三个字段,
分别存入数组
3)把以上三个数组中的数据插入到第一步创建的表中
4)把emp_zsm_00表中id=1的员工的salary 加100
visql.pc
-------------------------------------------------------
总结:
1.proc简介
2.proc程序中和数据库相关的操作
3.c程序流程
4.proc程序的编写步骤
5.宿主变量
6.指示变量
必须是short
7.数组变量
8.sqlca通信区
sqlca.sqlcode
sqlca.sqlerrd[2]
sqlca.sqlerrm.sqlerrmc
9.oraca通信区
exec sql include oraca;
exec oracle option(oraca=yes);
oraca.orastxtf
oraca.orastxt.orastxtc
10.proc中使用sql语句
1)select语句配合into 加exec sql
2)ddl
dml
tcl
直接加execsql
练习:
1.把s_dept表中的所有数据查询出来存到相应的数组,并使用
指示变量数组指示region_id的赋值状态,循环输出
- proc(1)
- 内核proc文件系统与seq接口(1)---内核proc文件系统简介
- 内核proc文件系统与seq接口(1)---内核proc文件系统简介
- proc源码解析(二)--proc数据结构
- proc源码解析(三)--proc初始化
- proc源码解析(二)--proc数据结构
- proc源码解析(三)--proc初始化
- proc源码解析(二)--proc数据结构
- proc源码解析(三)--proc初始化
- proc源码解析(二)--proc数据结构
- proc源码解析(三)--proc初始化
- 数据库(proc编程)
- (win32)main&proc
- proc
- proc
- /proc
- proc
- proc
- 栈的原理和缓冲区溢出原理
- 实用!开发者的 Vim 插件(二)
- 实现简单的多选下拉"spinner"
- sqlite3_column_blob()自己理解
- VBS深入CreateObject函数
- proc(1)
- windows的php环境下使用sendmai的smtp功能l的简单配置
- C语言数组作为函数参数
- 约瑟夫问题
- Hibernate延迟加载详解
- Ubuntu可以随便升级内核了
- JS原型与原型链终极详解
- 【数据结构与算法】统治世界的十大算法
- hdu 3625 Examining the Rooms(斯特林数)