实际开发中的proc教程ppt课件.ppt
《实际开发中的proc教程ppt课件.ppt》由会员分享,可在线阅读,更多相关《实际开发中的proc教程ppt课件.ppt(77页珍藏版)》请在三一办公上搜索。
1、PROC/C+课程,PROC/C+,Points,3. 宿主变量与指示变量,4. 嵌入SQL语句,5. 连接数据库,6. 错误处理,1. PROC简介,7. 数据的存取更新操作,8. 动态sql,2. PROC程序的编写步骤,Pro程序,通过在过程化编程语言中嵌入SQL语句而开发出的应用程序称为Pro程序。在通用编程语言中使用的SQL称为嵌入式SQL在SQL标准中定义了多种语言的嵌入式SQL各个厂商对嵌入式SQL的具体实现不同,宿主语言 Pro程序C/C+ Pro*C/C+FORTRAN Pro*FORTRANPASCAL Pro*PASCALCOBOL Pro*COBOLPL/I Pro*P
2、L/IAda Pro*Ada,Pro*C/C+程序,在C/C+语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C+程序。目的:使c/c+这种高效率语言成为访问数据库的工具。,Pro*C程序实例,#includeEXEC SQL BEGIN DECLARE SECTION;char username20;char password20;char last_name25;EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE sqlca;void sqlerror();main() EXEC SQL WHENEVER SQLERROR DO sqlerro
3、r(); strcpy(username,tarena); strcpy(password, tarena); EXEC SQL CONNECT:username IDENTIFIED BY:password;,EXEC SQL select LAST_NAME into :last_name from S_EMP where id=2; printf(nID=2,last_name=%sn , last_name);void sqlerror() EXEC SQL WHENEVER SQLERROR CONTINUE; printf(n- oracle error detected:n);
4、printf(%.70sn, sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK WORK RELEASE; exit(1);,Include 头文件 (c/c+ and pro*c/c+)定义变量定义函数main 连结数据库: connectSQL 操作语句: EXEC SQL .;exception handler断开连结: EXEC SQL COMMIT / ROLLBACK WORK release,PROC程序结构,一般应用程序(C)开发运行标准流程,.c文件,.o文件,可执行文件,% vi a_1.c a_2.c% gcc c a_1.c a_2.
5、c% gcc -oa a_1.o a_2.o,一般应用程序(C)开发运行标准流程,Pro*C程序开发运行流程,.o文件,可执行文件,.pc文件,.c文件,完成Pro*C源程序到纯C源程序的转换基本命令格式PROC INAME=filename OptionName1=value1OptionNameN=valueN,Pro*C预编译程序,PROC常用预编译选项,INAME=path and filename (name of the input file)ONAME=path and filename (name of the output file)INCLUDE=path (头文件所在路径
6、)-INCLUDE =路径名 或 INCLUDE =(路径名1,路径名2)PARSE=FULL | PARTIA | NONE (default FULL for C, Others for C+)CODE=ANSI_C | CPP (default ansi_c)USERID=username/password,Pro*C程序开发运行流程,#includeEXEC SQL BEGIN DECLARE SECTION;char user_passwd20;EXEC SQL END DECLARE SECTION;EXEC SQl include sqlca;main() EXEC SQL WH
7、ENEVER SQLERROR stop; strcpy(user_passwd,tarena/tarena); EXEC SQL CONNECT:user_passwd; printf(nConnected to ORACLE as user:%sn , user_passwd);,Pro*C程序开发运行流程% vi a.pc% proc a.pc% gcc -o a a.c -lclntsh -Compare Pro*C and its C code,Pro*C+预编译程序,Pre-compile:proc myf.pc oname=myf.cpp parse=none code=cpp2
8、. Compile:g+ -omyfile myfile.cpp lclntsh3. Execute:myfile,#include Using namespace std;EXEC SQL BEGIN DECLARE SECTION;char user_passwd20;EXEC SQL END DECLARE SECTION;EXEC SQl include sqlca;main() EXEC SQL WHENEVER SQLERROR stop; strcpy(user_passwd,tarena/tarena); EXEC SQL CONNECT:user_passwd; coutCo
9、nnected to ORACLE as user “ , user_passwd;,宿主变量,宿主变量是一种pro*c语言变量, 用于在应用程序中和oracle数据库之间传递数据。Pro*C程序中,既可在SQL语句中引用,也可在C语句中引用的变量称为SQL变量。,C语言语句群,SQL语言语句群,宿主变量,宿主变量的数据类型,数据类型描述char单字符charnN个定长字符数组int整数short 短整数long长整数float单精度浮点数double双精度浮点数VARCHARn变长字符串,宿主变量的使用,输入 - 将应用程序的数据传递到数据库中。int salary, emp_number;
10、 cinsalary; cinemp_number;EXEC SQL update emp set sal=:salary where empno= :emp_number;输出 - 将数据库的数据传递到应用程序中。float v_salary;char v_job; EXEC SQL select sal,job INTO :v_salary, :v_job from emp where empno = 7788;coutv_salaryv_job;,处理字符数据,预编译选项 CHAR_MAP CHAR_MAP=CHARZ (默认设置):0结尾,定长,空格补齐。 CHAR_MAP=CHARF
11、 | VARCHAR2:定长,空格补齐。 CHAR_MAP=STRING: 0结尾,变长。 当0结尾,宿主变量长度要大于实际数据长度。 VARCHAR1.变长, 不是0结尾。2. Struct unsigned short len; unsigned char arr variable_name;,使用宿主变量的注意事项,其申明语法与普通C变量一致,但在CODE=CPP或 MODE=ANSI 时变量必须放在申明区.可使用pointer 作为宿主变量,使用前分配空间。在DDL语句中不能用宿主变量。错误例子:char table_name30;cintable_name;EXEC SQL DROP
12、 TABLE :table_name;,指示变量,指示变量(indicator variable)短整型变量,用于处理数据库的NULL值,监督和管理与其相关联的宿主变量。引用语法::host_variable INDICATOR :indicator_variableOR:host_variable:indicator_variable,指示变量的作用,主要用在输出, 即当宿主变量用于接收数据库的返回数据时。通过在宿主变量后用指示变量, 检测是否返回了NULL。-1:数据库表列的值为NULL,指示变量相关联的输出宿主变量值不确定=0:Oracle将数据库表列值原封不动的赋给指示器变量相关联的输
13、出宿主变量0: Oracle将数据库表列值截断后赋给指示器变量相关联的输出宿主变量,指示器变量值为该列值的原始长度,指示变量例子,EXEC SQL BEGIN DECLARE SECTION; int m_id; short ind_m_id;EXEC SQL END DECLARE SECTION;EXEC SQL SELECT manager_id INTO :m_id:ind_m_id FROM s_emp WHERE id=1;If(ind_m_id =-1) cout“emp_desc is NULL”endl;else cout m_id endl;,数组变量,Pro*C只支持一维
14、数组Pro*C不支持数组指针Pro*C所支持数组最大维数是32767,超出此限制将报错示例EXEC SQL BEGIN DECLARE SECTION;int A100;char B100;char C10015; EXEC SQL END DECLARE SECTION;,数组变量,在SQL语句中使用数组变量,只需给出:和变量名称, 不要给下标。示例EXEC SQL BEGIN DECLARE SECTION;int emp_number100;char emp_name10015;EXEC SQL END DECLARE SECTION; EXEC SQL SELECT number,na
15、me INTO :emp_number, :emp_name FROM emp;,数组变量,错误的例子:for(int i = 0;i 100; i +) EXEC SQL SELECT number,name INTO :emp_numberi, :emp_namei; 指示器数组例子:EXEC SQL BEGIN DECLARE SECTION;int emp_number100;char emp_name10015;short ind_emp_number100;EXEC SQL END DECLARE SECTION;EXEC SQL SELECT number,name INTO :
16、emp_number:ind_emp_number,:emp_name;,通信区说明 (SQLCA),SQLCA 是ORACLE提供的两个通信区之一。SQLCA实际上是一个结构变量,其目的是为了诊断错误和事件处理结果。SQLCA的结构struct sqlca /* ub1 */ char sqlcaid8; /* b4 */ int sqlabc; /* b4 */ int sqlcode; struct /* ub2 */ unsigned short sqlerrml; /* ub1 */ char sqlerrmc70; sqlerrm; /* ub1 */ char sqlerrp8;
17、 /* b4 */ int sqlerrd6; /* ub1 */ char sqlwarn8; /* ub1 */ char sqlext8; ;,通信区说明 (SQLCA),sqlcaid8 用于标识一个SQLCAsqlabc 用于保存SQLCA的长度sqlcode用于保存最近一次运行SQL指令的状态0 正常 0有一个异常发生 0系统错误,可能来自网络,或数据库本身sqlerrm. sqlerrml保存错误文本信息的长度sqlerrm. sqlerrmc保存错误文本信息,最长为70个字符sqlerrp 系统保留sqlerrd60,1,3,5系统保留2当前SQL指令处理的行数4保存相对位移,
18、指出在什么地方出现语法错误,通信区说明 (SQLCA),sqlwarn80指示是否设置了警告标志1指示是否将字符结果返回给宿主变量时,数据截短了3如果查询时,返回的列数和指定的宿主数组变量的维数不等时设置该位4UPDATE和DELETE时没有行被处理,设置改标志位5当EXEC SQL CREATE PROCEDURE|FUNCTION|PACKAGE|PACKAGE BODY失败时,设置该位2,6,7系统保留sqlext8 系统保留,int main()EXEC SQL INCLUDE sqlca;EXEC SQL WHENEVER SQLERROR Do err_report(sqlca);
19、 void err_report( struct sqlca sqlca) if (sqlca.sqlcode 0) printf(n%d%snn,sqlca.sqlerrm.sqlerrml ,sqlca.sqlerrm.sqlerrmc); exit(1); ,SQLCA应用实例,通信区说明 ( ORACA),当需要更进一步的信息时,ORACA将帮助我们达成愿望,所以ORACA也可以看作时SQLCA的补充和辅助。,通信区说明 ( ORACA),struct oraca /* text */ char oracaid8; /* Reserved */ /* ub4 */ int oracab
20、c; /* Reserved */ /* ub4 */ int oracchf; /* 0 if check cur cache consistncy*/ /* ub4 */ int oradbgf; /* 0 if do DEBUG mode checking */ /* ub4 */ int orahchf; /* 0 if do Heap consistency check */ /* ub4 */ int orastxtf; /* SQL stmt text flag */struct /* ub2 */ unsigned short orastxtl; /* text */ char
21、 orastxtc70; orastxt; /* text of last SQL stmt */ struct /* ub2 */ unsigned short orasfnml; /* text */ char orasfnmc70; orasfnm; /* name of file containing SQL stmt */ /* ub4 */ int oraslnr; /* line nr-within-file of SQL stmt */ /* ub4 */ int orahoc; /* highest max open OraCurs requested */ /* ub4 *
22、/ int oramoc; /* max open OraCursors required */ /* ub4 */ int oracoc; /* current OraCursors open */ /* ub4 */ int oranor; /* nr of OraCursor re-assignments */ /* ub4 */ int oranpr; /* nr of parses */ /* ub4 */ int oranex; /* nr of executes */ ;,通信区说明 ( ORACA),oracaid8 标识一个ORACA通信区oracabc用于保存ORACA通信
23、区的长度oradbgf调试标志,0关闭,1开启oracchf如果oradbgf1,那oracchf遵循下列规则:0禁止光标缓冲一致性检查1进行光标缓冲一致性检查orahchf如果oradbgf1,那oracchf遵循下列规则:0禁止堆缓冲一致性检查1进行堆缓冲一致性检查orastxtf可以是以下各值:0不保存SQL文本1仅对SQLERROR保存SQL文本2仅对SQLERROR和SQLWARNING保存SQL文本3总是保存SQL文本,通信区说明 ( ORACA),要使用ORACA,那么就要显式的加载ORACA结构到Pro*C程序中。可通过语句EXEC SQL INCLUDE oraca;EXEC
24、 ORACLE OPTION(ORACA=YES);实现。,嵌入SQL语句,EXEC SQL INSERT dept( 1, 人事部, 中鼎大厦7层 );,EXEC SQL sql-statement;,形式:,示例:,单个SQL语句的嵌入语法,嵌入事务控制语句,事务控制语句Commit, rollback and savepoint.EXEC SQL commit;EXEC SQL commit work release;EXEC SQL rollback work release;,嵌入事务控制语句,EXEC SQL SAVEPOINT savepoint_insert;for( i =
25、1; i 100; i+ ) getInput1( empName, ,数据操作语句(DML)语句列表EXEC SQL Select .;EXEC SQL Insert .;EXEC SQL update .;EXEC SQL Delete .;,嵌入DML语句,数据定义语句(DDL): create, alter, dropExample:EXEC SQL CREAT TABLE t1(cola int);EXEC SQL DROP TABLE t1;EXEC SQL ALTER TABLE t1 add(faxno number);对象名, 列名不能用宿主变量.自动提交事务,嵌入DDL语句
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实际 开发 中的 proc 教程 ppt 课件
链接地址:https://www.31ppt.com/p-1745821.html