proc个人笔记总结_第1页
proc个人笔记总结_第2页
proc个人笔记总结_第3页
proc个人笔记总结_第4页
proc个人笔记总结_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、王小龙Proc个人笔记总结procpro程序:通过在过程化语言中 嵌入sql语句 开发出的程序叫pro程序.宿主语言:sql语句所嵌入的语言为什么要使用 proc /proc+:使c 或者c+ 这种高效的语言成为访问 oracle数据库的工具./*连接数据库*/exec sql connect:username identified by :password; /分开的exec sql connect:usernamepasswd; /连着的/*查询*/exec sql select 字段 into :变量 from s_emp where id=1;/*断开数据库的连接*/exec sql

2、commit work release;exec sql rollback work release;1.编写c的源代码 如何编写一个c程序 vi *.c2.编译 链接 gcc *.c 3.执行1.编写源代码 vi *.pc2.预编译 proc *.pc 开发一个proc程序的步骤 会得到对应的c文件 3.编译 链接 gcc *.c -lclntsh gcc *.c -lorasql10 (windows) gcc *.c -lorasql10 -L 库的位置 4.执行 ./a.out vi first.pc#include <stdio.h>在sql语句中使用c的变量最好加上:,

3、这样强调说明是c中的变量,以防c中的变量和表中的字段名相同exec sql include sqlca;int main() char userpasswd30="openlab/open123" char var_name25; exec sql connect:userpasswd; exec sql select first_name into :var_name from s_emp where id=1; printf("var_name=%sn",var_name); exec sql commit work release; proc fi

4、rst.pc 得到一个 first.c 1.写源代码 vi first.pc 2.如果本地有 proc 则把 first.pc 预编译成 first.c proc first.pc 如果本地没有proc 就把first.pc 上传到服务器 3.在服务器上 编译链接 gcc *.c -lclntsh 4.执行/*写一个proc程序 把s_emp 表中的id=1的first_name salary 查询出来放入c的变量中 然后输出这些信息*/ #include <stdio.h> exec sql include sqlca; int main() char userpwd30=&qu

5、ot;openlab/open123" char var_name25; double var_salary; int id=2; exec sql connect:userpwd; exec sql select first_name,salary into :var_name,:var_salary from s_emp where id=:id; printf("%s:%lfn",var_name,var_salary); exec sql commit work release; 如何把proc程序 改成 proc+程序? #include <ios

6、tream> using namespace std; exec sql include sqlca; int main() exec sql begin declare section; char userpwd30="openlab/open123" char var_name25; double var_salary; int id=2; exec sql end declare section; exec sql connect:userpwd; exec sql select first_name,salary into :var_name,:var_sal

7、ary from s_emp where id=:id; cout<<var_name<<":"<<var_salary<<endl; exec sql commit work release; proc的预编译选项 oname .输出文件名 默认是.c 的 如果使用c+ .cppproc inname=second.pc oname=second.cpp iname 输入文件名 这个选项可以省略parse 解析方式 默认是 full的c方式 如果使用c+ 需要使用 partia 严格的c+检查 不推荐使用proc innam

8、e=second.pc oname=second.cpp parse=none code=cpp none c+推荐使用code 代码风格 默认是 ansi_c c的方式 c+ 需要使用 cpp当code=cpp 时 则必须把sql中使用的 宿主变量 必须放在申明区.exec sql begin declare section; /*变量定义*/exec sql end declare section;proc mycpp.pc oname=mycpp.cpp parse=none code=cpp g+ mycpp.cpp -lclntsh其它的预编译选项include 指定头文件的位置ch

9、ar_map 对字符串的预编译处理和plsql调用相关的 sqlcheck=semantics userid=用户名/密码-变量既能在 宿主语言中使用 又能在sql语句中使用 这种变量叫宿主变量. proc 中的宿主变量 和 c 变量没有任何区别 proc+ 中 code=cpp 要求c+ 的宿主变量必须放在申明区 exec sql begin declare section; exec sql end declare section; 但在windows下开发 proc 程序 也要求 把宿主变量放在申明区. 为了好记加方便,以后所有的宿主变量都放在申明区.宿主变量类型: char char

10、varn 定长字符串 short int long float double varchar varn 变长字符串【a.变长字符串1】定义变量时要初始化 varchar var_name25=0;正常放入值exec sql select 字段 into :var_name from 表 where 条件;访问时var_name.arr;【b.变长字符串2】 char_map=charz 默认的 定长 0结尾 空格补齐 charf|varchar2 .定长 空格补齐 string .变长 0结尾-宿主变量的注意事项? 1.推荐把所有宿主变量放在申明区。 2.可以使用指针 但必须提前分配内存空间

11、exec sql begin declare section; char userpwd30; char *var_name=userpwd; exec sql end declare section; exec sql select first_name into :var_name from s_emp where id=1; 3.proc 中可以直接使用ddl 但ddl 不能包含宿主变量 exec sql drop table :var_name; /error,不能包含宿主变量 exec sql drop table test;-【指示变量:】当数据库中的字段值 赋值给宿主变量时赋值的

12、状态 可以通过指示变量得到. 指示变量=0 赋值正常 = -1 数据库中的字段值是NULL >0 截断赋值 尽量避免指示变量只能是 short类型select first_name into :var_name indicator:indname from s_emp wher id=1;select first_name into :var_name :indname from s_emp wher id=1; #include <stdio.h>exec sql include sqlca;int main() exec sql begin declare section

13、; char userpwd30="openlab/open123" /*定义一个指示器 指示manager_id的赋值状态*/ short indmid=0; int mid=10000;exec sql end declare section;exec sql connect:userpwd; exec sql select manager_id into :mid:indmid from s_emp where id=1; printf("mid=%d,indmid=%hdn",mid,indmid);exec sql commit work re

14、lease;-【数组变量:】 1.只支持一维数组(字符除外) 2.不支持数组指针 3.数量受限制 在select语句中 使用数组变量 只需要给出 :数组名 不能给下标.s_emp表中所有manager_id和first_name分别放入数组中并且指示manager_id的赋值状态 int mids50; char names5030; short indmids50; short indnames50; #include <stdio.h> exec sql include sqlca; int main() exec sql begin declare section; char

15、 userpwd30="openlab/open123" int mids50; short indmids50;names的复制状态mids的复制状态 char names5030; short indnames50; exec sql end declare section; exec sql connect:userpwd; exec sql select manager_id,first_name into :mids:indmids,:names:indnames from s_emp; int i=0; for(i=0;i<sqlca.sqlerrd2;i

16、+) printf("%d:%hd,%s:%hdn", midsi,indmidsi,namesi,indnamesi); exec sql commit work release; -通信区: 【sqlca】 就是通信区proc 程序和 oracle数据库通信的区域 实际上sqlca是一个结构体. sqlca.sqlerrd2 得到sql语句所影响的函数 sqlca.sqlcode 反应sql语句的执行状态(在要判断的SQL语句之后用) =0 执行正常 >0 异常发生 <0 系统错误 或者 网络错误 sqlca.sqlerrm.sqlerrmc 当sql执行出

17、错 可以得到错误的消息内容其它字段 系统保留(0,1,3,5)(2和4有用)sqlca 是每个事务中维护的一个结构体,同一事务中的sql 执行完以后要立即使用sqlca中的字段状态 否则会被下一条sql的状态覆盖掉.#include <stdio.h>exec sql include sqlca;int main() exec sql begin declare section; char userpwd30="openlab/open123" int mids50;short indmids50; char names5030; short indnames5

18、0;exec sql end declare section;exec sql connect:userpwd;if(sqlca.sqlcode=0) printf("connect db success!n"); exec sql select manager_id,first_name into :mids:indmids,:names:indnames from s_emp;if(sqlca.sqlcode=0) printf("select db successn"); else printf("%sn",sqlca.sqle

19、rrm.sqlerrmc); int i=0; for(i=0;i<sqlca.sqlerrd2;i+) printf("%d:%hd,%s:%hdn", midsi,indmidsi,namesi,indnamesi); exec sql commit work release;-【oraca】 也是一个通信区 是对sqlca信息的补充. 可以从oraca得到执行的sql语句 oraca 非常消耗系统资源 默认是关闭的1.如何包含oraca exec sql include oraca;2.打开oraca exec oracle option(oraca=yes);

20、3.设置sql的保存标志 oraca.orastxtf = 0 默认的不保存sql 1 当sql出错时保存 2 当出现警告 或者出错时保存 3 都保存sql4.如何得到sql文本 oraca.orastxt.orastxtc #include <stdio.h> exec sql include sqlca; exec sql include oraca; exec oracle option(oraca=yes); int main() oraca.orastxtf=3; exec sql begin declare section; char userpwd30="o

21、penlab/open123" char var_name30; int var_id=2; exec sql end declare section; exec sql connect:userpwd; exec sql select first_name into :var_name from s_emp where id=:var_id; printf("%sn",oraca.orastxt.orastxtc); exec sql commit work release; -proc 最简单 最重要 proc中如何嵌入sql 1.嵌入 select 语句 e

22、xec sql select id,first_name into :var_id,:var_name from s_emp where id=1; 2.dml tcl ddl 在前面加exec sql 即可 ddl 中不能有宿主变量 3.proc 中如何嵌入plsql#include <stdio.h>exec sql include sqlca;int main() exec sql begin declare section; char userpwd30="openlab/open123" int id=1;char name30="openl

23、ab"exec sql end declare section;exec sql connect:userpwd; /* ddl(不能用宿主变量) */ exec sql create table cmhtt(id number primary key, name varchar2(30); /* dml */ exec sql insert into cmhtt values( :id , :name); /* tcl */ exec sql commit; exec sql commit work release;复习一下如何写一个proc程序 1.编写pc源代码 vi *.pc

24、 2.把pc 变成 c 文件 proc *.pc 3.编译链接 gcc *.c -lclntsh 4.执行 ./a.out如何写proc+ 程序 proc 的预编译选项 include iname oname *.cpp parse none code cpp 宿主变量放入申明区 exec sql begin declare section; /*变量申明*/ exec sql end declare section; proc *.pc oname=*.cpp parse=none code=cpp g+ *.cpp -lclntsh宿主变量: 既能在sql 语句中使用 又能在宿主变量中使用

25、 宿主变量的类型: char char varn 定长 short int long float double varchar varn 变长变长字符串的处理 1.varchar varchar var_namen=0; 在sql语句中正常使用 var_name.arr; 2.char_map =charz 默认 定长 0 空格补齐 charf|varchar2 定长 空格补齐 string 变长 0结尾宿主变量注意事项: 1.推荐把宿主变量放入申明区 2.可以使用指针 3.ddl 中不能有宿主变量-指示变量:反映数据库中的字段值赋值给宿主变量时赋值的状态可以通过指示变量显示出来 =0 正常

26、=-1 NULL >0 截断赋值 /应该避免指示变量必须是short select 字段 into :宿主变量:指示变量-数组变量: (指示变量数组) 1.支持一维数组 字符除外 2.不支持数组指针 3.最大个数 32767select 语句中只需要给出数组名 不能给下标-遍历数组 sqlca.sqlerrd2通信区 sqlca.sqlcodesqlca.sqlerrm.sqlerrmc-oraca 通信区 1.包含 oraca exec sql include oraca; 2.打开oraca exec oracle option(oraca=yes); 3.设置sql保存标志 ora

27、ca.orastxtf 0 1 2 3 4.得到sql oraca.orastxt.orastxtc (占位符)开始新知识了-proc 中如何嵌入sql语句 1.select exec sql select 字段 into :宿主变量 from 表 where 条件; 2.ddl dml tcl 前面加 exec sql 即可 ddl 不能有宿主变量 dml 可以使用宿主变量 3.proc 中如何嵌入plsql sqlcheck=semantics userid=用户/密码 c 中嵌入存储过程 exec sql execute begin /*这里可以使用宿主变量调用存储过程*/ (

28、这里的宿主变量要加:,因为这里的代码更偏向plsql) end; end-exec; 写一个存储过程 准备调用 存储过程中传入两个整数参数 把两个参数的和 放入第二个参数中 然后在proc 中调用这个存储过程 验证存储过程的功能. create or replace procedure getsum(var_x in number,var_y in out number) is begin var_y:=var_y+var_x; end;#include <stdio.h>exec sql include sqlca;int main() exec sql begin declar

29、e section; char userpasswd30="openlab/open123"int var_y=10000; exec sql end declare section; exec sql connect:userpasswd;exec sql execute调用存储过程,宿主变量使用最好加上冒号 begin getsum(2000,:var_y); end; end-exec; printf("var_y=%dn",var_y);exec sql commit work release;proc *.pc sqlcheck=semanti

30、cs userid=openlab/open123-写一个函数 传入两个整数参数 返回两个整数参数的最大值 并且把两个参数的和 放入第二个参数中。写一个proc程序验证这个函数的功能。exec sql execute begin end;end-exec;create or replace function getMaxAndSum(var_x in number,var_y in out number)return number is var_temp number;begin var_temp:=var_y; var_y:=var_x+var_y; if var_temp<var_x

31、 then return var_x; end if; return var_temp;end;#include <stdio.h>exec sql include sqlca;int main() exec sql begin declare section; char userpasswd30="openlab/open123" int var_x=1;int var_y=10000; int var_res=0; exec sql end declare section; exec sql connect:userpasswd;exec sql execu

32、te begin :var_res:=getMaxAndSum(:var_x,:var_y); end; end-exec; printf("var_y=%dn",var_y);printf("var_max=%dn",var_res);exec sql commit work release;-数据库的连接 exec sql connect:userpasswd; exec sql connect:username identified by userpasswd; 本地连接.【数据库的远程连接:】1.数据库链的方式 远程数据库连接 都和 $ORACL

33、E_HOME/network/admin/tnsnames.ora CAH_6 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 6)(PORT = 1521) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = tarena) ) )SERVICE_NAME 如何得到服务名echo $ORACLE_SID在6 建立和23的桥create database link my23linkco

34、nnect to openlab identified by open123using ' (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 3)(PORT = 1521) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = tarena10g) ) ) ' ; windows 下 开发proc程序 1.编写proc代码 2.预编译 proc mremotedb.pc 3.编译链接 gcc mremotedb.c -l

35、orasql10 -LE:oracleproduct10.1.0Db_1BIN 4. a.exe 必须在数据库中建立好 数据库链接 然后在做数据库操作时 要求先连接数据库 才能使用链接 2.第二种连接远程数据库 using 区分不同的数据库描述 区分数据库的连接 -at (贴标签) exec sql connect:userpasswd; exec sql connect:userpasswd using :rdb1; exec sql connect:userpasswd using :rdb2; 为了区分数据库的连接 at exec sql connect:userpasswd at :l

36、ab1; exec sql connect:userpasswd at :lab2 using :rdb1; exec sql connect:userpasswd at :lab3 using :rdb2; exec sql at:lab2 select .; exec sql at:lab1 update .; exec sql at:lab3 delete .; exec sql at:lab2 commit; exec sql at:lab1 commit work release; exec sql at:lab2 commit work release; exec sql at:l

37、ab3 commit work release;#include <stdio.h>exec sql include sqlca;int main() exec sql begin declare section; char userpasswd30="openlab/open123"char localuserpass30="openlab/open123"char rdb20="CAH_6"char var_name30;double salary;exec sql end declare sec

38、tion;exec sql connect:userpasswd using :rdb; /直接和远程数据库连接 exec sql select first_name,salary into:var_name,:salary from s_emp where id=1; printf("rdb var_name=%s,salary=%lf", var_name,salary); exec sql commit work release;-#include <stdio.h>exec sql include sqlca;int main() exec sql be

39、gin declare section; char userpasswd30="openlab/open123"char localuserpass30="openlab/open123"char rdb20="CAH_6"char var_name30;char locallab20="db23"char rdblab20="db26"double salary;用at来区分数据库的连接exec sql end declare section;exec sql conne

40、ct:userpasswd at :rdblab using :rdb;exec sql connect:localuserpass at :locallab; exec sql at:rdblab select first_name,salary into :var_name,:salary from s_emp where id=1; printf("rdb var_name=%s,salary=%lfn",var_name,salary); exec sql at:locallab select first_name,salary into :var_name,:sa

41、lary from s_emp where id=1; printf("localdb var_name=%s,salary=%lfn", var_name,salary); exec sql at:locallab commit work release;exec sql at:rdblab commit work release;-proc 中的错误处理 exec sql whenever 条件 动作; 条件:sqlerror notfound sqlwarning 动作: do 错误处理函数(自己写的); do break; continue; goto stop #

42、include <stdio.h>exec sql include sqlca;void processError()exec sql whenever sqlerror continue; printf("%sn",sqlca.sqlerrm.sqlerrmc);void processNotFound() printf("%sn",sqlca.sqlerrm.sqlerrmc);int main() exec sql begin declare section; char userpasswd30="openlab/open12

43、3" char var_name30;exec sql end declare section; exec sql whenever notfound do processNotFound();exec sql whenever sqlerror do processError();exec sql connect:userpasswd;exec sql select first_name into :var_name from s_emp where id=-1; exec sql drop table s_emp; printf("app continue!n"

44、;);exec sql commit work release;-数据的存取与更新 1.使用单个变量 操作单行单列exec sql select first_name into :var_name from s_emp where id=1; 2.使用多个变量 操作单行 多列exec sql select first_name,salary into :var_name,:salary from s_emp where id=1; 3.把多个变量包装成结构体 proc 中可以在任何位置定义结构体proc+ 结构体的定义必须放在申明区 #include <stdio.h>exec s

45、ql include sqlca;int main() exec sql begin declare section; char userpasswd30="openlab/open123" struct int id;char first_name30;double salary;emp;exec sql end declare section; exec sql connect:userpasswd; exec sql select id,first_name,salary into :emp from s_emp where id=1; printf("%d

46、:%s:%lfn",emp.id, emp.first_name,emp.salary); exec sql commit work release; 4.数组变量 操作多行多列把s_emp 表所有的id first_name salary 放入一个结构体数组中. 如果数组中的数组是满的 全部都要进入数据库 exec sql insert into tablename values(:数组名); 当数组数据不满时 int countloop=sqlca.sqlerrd2; int i=0; for(i=0;i<countloop;i+) exec sql insert into testemp values(:datasi); exec sql commit;#include <stdio.h>exec sql include sqlca;int main() exec sql begin declare section; char userpasswd30="

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论