oracle07proc01

 


1。Pro程序:
在过程华的编程语句中嵌入sql语句而开发出的应用程序。就是在语言中嵌入sql语句。
 Pro/C Pro/c++  都叫嵌入式sql.

2.目的:使用c/c++这种高效率语言成为访问数据库的工具。

3.sqlerror()异常处理
 
4.1准备密码2连接数据库3查询4得到查询

5。大体Proc程序结构:
 连接数据库:connect
 EXEC SQL ...;执行sql语句
 exception handler
 断开连接:EXEC SQL COMMIT / ROLLBACK WORk release 释放连接

6。code源文件 source .c
 #预处理 
 compile编译 .o
 link连接.s
 execute运行程序.exe

7.ProC程序开发流程 :后缀.pc
 code :.pc文件
 
 precompile:预编译 .c 这一步是把pc文件变成c文件。
 
 compile:.o
 
 link.s
 
 execute
8。proc程序的开发流程:
 1。写proc的源代码 后缀.pc
 2.把.pc 程序 处理成.c
 3.编译连接c文件 需要连接库 clntsh  gcc
 4.执行程序

*在本地作的socket程序放在服务器上运行不了,因为少了连接库。
*proc是专门为oracle而诞生的,别的数据库就需要用别的语法了。

9.编译proc的程序步骤:(在服务器的整个步骤)
 proc first.pc指令 生成first.c文件。
 gcc first.c -lclntsh 编译.c文件,依赖clntsh库
 执行a.out即可。

10.在本地编译proc程序的步骤:因为学校环境不一致,所以分本地,服务器
 1.在本地使用proc 指令生成 .c
 2.把.c文件上传到服务器上去,用g++ xx.cpp -lclntsh来a.out
 
本地proc first.pc   报错#include <stddef.h>.如何解决?
 sys_include='/usr/lib/gcc-lib/i386-suse-linux/2.95.3/include' 中有stddef.h
这个是标准路径,但是我们的电脑版本不同,不在标准路径下面。所以错。
我们按照原样找这个stddef.h文件即可。/usr/lib/gcc-lib/i386-redhat-linux7/2.96/include
 
报那个错误我们需要这样做:解决stddef.h错误。
  proc first.pc sys_include='/usr/lib/gcc-lib/i386-redhat-linux7/2.96/include'
这样c文件就出来了。
  我们传.c文件到服务器上。gcc first.c -lclntsh  ./a.out  即可。
--------代码--------
int main(){
 exec sql include sqlca;/*要把这个proc引入所需要的环境。这样它会帮我们包含许多的操作哦*/
  /*包含一个这样的数据结构。*/
 char userpwd[30]="openlab/open123";
 exec sql begin declare section;/*与数据库相关的变量要放入到这里面来。*/
  char first_name[25]={0};/*以防垃圾数据*/
  exec sql connect:userpwd;/*连接上了。哈哈easy so !*/
 exec sql end declare section;
 
 exec sql select first_name into :first_name from s_emp where id=1;
  /*查询的东西必须要放入内存中,这是oracle的规定。*/
 printf("%d \n",first_name);
 exec sql commit work release;/*关闭连接*/
}
--------代码--------


11.proc指令选项  first.pc
 Iname 代表输入文件名  可以身略
 oname 代表输出文件名 默认输出.c文件  first.c
 sys_include 系统加载头文件的路径
 parse
  full c的 默认的
  partia c++ 所有的都检查:本来没有错,被他搞出错误了。 会生成cpp文件,反而没错。
  none c++ c++程序推荐使用
 code
   ansi_c c的标准  c默认的
   cpp  c++的风格
 userid 使用时后面要跟用户名和密码 userid=openlab/open123
  在使用plsql块的时候,需要制定这个选项。 
 mode ANSI | oracle 2个不同的标准,实际开发中没有什么用处,前者严格一点罢了。
 
12.proc first.pc oname=first.cpp parse=none code=cpp sys_include='/usr/lib/g
cc-lib/i386-redhat-linux7/2.96/include'
 注意:parse=partia 会严格检查c++,连<iostrem>都报错。但是这是假错而已。以后不用partia,使用none .
 如果处理的代码中出现code=cpp选项(即c++方式连接数据库),所有数据库相关的变量 必须放在声明区。
 声明区的写法:
  exec sql begin declare section;
   //中间是变量的声明 char username[20]={0};
  exec sql end declare section ;
 这2句话是为了c++服务的和在window下作c开发服务的。
 所以:以后开发这2句话声明数据库相关的变量就放在这里,不管是c还是c++.都通用,也有好处。


g++ first.c -lclntsh  ./a.out 
#include <cstdio> 这种语法只是用标准c标准库 :去掉.h加上c;
 非标准的不可以:比如系统相关的头文件,线程文件.socket文件。
=====================================================
宿主变量:
  寄生虫寄生在宿主里面。sql语句寄生在c/c++中。
  宿主变量要放在声明区。
  单纯在c中使用的变量 叫c变量,单纯在sql中使用的变量 叫sql变量。
 宿主变量:既可以在宿主语言中使用,也可以在嵌入式sql语句中使用。起了一个桥梁的作用,连接作用。
   特点:在宿主语言中使用的时候:就正常使用
     在sql中使用,前面需要加上:变量名称 来使用。
 宿主变量类型:
  char char[n] int short long float double varchar[n] 
  注意:这里的varchar[n]是个结构体哦,不是oracle中的那个东东哦。
 char类型是个定长的类型,多出来的长度都用空格补齐!!,varchar[n]是个变长类型。

===下午===============================================
1.varchar[n]这个结构有2个字段:varchar first_name[25]={0};
 1。长度unsigned  2。数组存数据 
 用法同上面一样,只是当作c语言变量的时候输出需要 first_name.arr

注意:在ddl语句中不能够用宿主变量。例如:drop table :table_name 
 但是你可以使用:动态sql.
 
2.使用宿主变量的注意事项:
 1。code=cpp 时,宿主变量必须放在声明区
 2。可以使用指针,指针使用之前必须分配空间
 3。ddl中,不可以出现 宿主变量 ,其他语句可以。但我们可以使用动态sql.!
 
strcpy内存copy函数:

3。char_map 变长字符串的预编译选项。 proc first.pc char_map=string
 charz 定长处理 '\0'结尾
 charf varchar2 定长
 string 变长 , '\0'结尾
 
4.指示变量:反映数据库中的字段值 ,赋值给宿主变量的状态。
   数据库中空间大,但是宿主变量空间小,那么会截断赋值。
   10 8   -1:数据库中的值为null  
   8  10   =0:正常
   8  null   >0:有截断。

 2种写法:
  :变量 indicator :指示变量
  :变量:指示变量

/*指示变量是这样用的,呵呵,和变量在一起,在变量后面*/
注意:必须是short类型,大一点都不可以。比较严格。
==============================================
数组变量:proc只支持一唯数组,只有char才可以有2唯数组。 
 int a[100] ; char b[20]; char c[23][239];
可以把查询出的多个字段值存入到数组中去。
例如:
 把s_emp表中所有的salary 放入一个数组中。 

** sqlca.sqlerrd[2]:意思是:最经一次sql执行影响的记录的行数。 **
 可以作为for的循环条件:i<sqlca.sqlerrd[2]

proc程序的sqlca通信区:
 每执行一次sql,这个通信区都会保存其状态,每次都会改变。
sqlca是一个结构体:
 1.sqlca.sqlcode 最近一条sql执行的状态。0为成功,非0代表失败。>0异常<0来自网络或数据库本身错
   if(sqlca.sqlcode==0){
    printf("connect success \n");
   }else{
    printf(sqlca.sqlerrm.sql);
   }
 2.sqlca.sqlerrd[2]:意思是:最经一次sql执行影响的记录的行数。 **
 3.sqlca.sqlerrm.sqlerrmc :sql执行的错误信息
 就记住这3个即可,其他的都没什么用撒!!!!!!
 
oracle 和 c/c++ 的通信通过sqlca这个东东来的哦。

对每一次sql执行都会影响sqlca中的字段值。
执行一次sql(对同一个事务而言) ,sqlca中的数据会发生变化一次。
所以要得到sql的执行状态执行完sql要立即使用sqlca.

=======================================
sqlca:通信区。
sql运行出错 或者 出现警告的时候,取得sql语句的文本。可以使用oraca通信区,oraca占用资源非常的严重
因此oracle默认的设置oraca默认是关闭的。所以想使用就要设置打开他。
1。打开
 exec sql include oraca;
 exec oracle option(oraca=yes);
2。sql语句默认是不保存的。需要设置成oraca的orastxtf标志位:
 0:不保存(默认标志) 1:出错的时候保存 2:出现警告时候保存 3:所有sql都保存
3.得到sql的文本,oraca.orastxt.orastxtc;

------总结 proc 中嵌入sql语句的情况------------------------------
1。嵌入select 语句 dml ddl 事务控制语句
 exec sql select xx into ..;
 exec sql update s_emp set ..;
这些语句的嵌入:只需要在前面加上 exec sql 即可。 sql.pc

2.嵌入plsql
 写一个存储过程 hellon(par_id number),些一个函数 getmax(par1 number,par2 number) nu;
 在proc程序中调用这2个东西。

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值