您好,欢迎访问三七文档
WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com1Pro*C程序设计TigerConsultationStudioWelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com2目录•Pro*C概述•Pro*C基础知识•事务处理•动态SQL技术•总结WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com3动态SQL技术•动态SQL编程是Pro*C/C++中一种比较高级的编程方法,它增强了应用程序的灵活性和可扩展性,运行应用程序在运行状态时动态组织SQL语句并执行和处理执行结果。•Oracle支持如下两种动态SQL语句标准动态SQL语句Oracle高级动态SQL语句•Oracle动态SQL不支持以下列表的数据类型:CURSOR类型结构数组(arraysofstruct)DML语句的返回子句(returning)Unicode变量LOBS类型WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com4动态SQL含义•动态SQL就是在应用程序执行期间组织、准备、执行SQL语句的方法和技术。•在一些应用程序中需要根据业务逻辑特点接收应用程序外部传输过来的变量,在运行时决定执行什么结构的SQL语句,例如:根据用户输入的表名,删除该表对应的数据,由于SQL变量在静态SQL语句时不能应用到DELETE表名位置的,所以没有办法在执行过程中通过静态SQL语句完成这样的功能。而动态SQL语句则可以接受用户输入,动态的组织SQL语句,完成上述要求。WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com5动态SQL的优缺点•优点:增强应用程序灵活性增强应用程序扩展性完成静态SQL所不能完成的工作•缺点:编码相对复杂执行效率没有静态SQL好WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com6动态SQL适用环境•在应用程序执行时,如果以下元素在编写代码时不确定就需要使用动态SQL:SQL语句书写方式SQL变量/宿主变量数目SQL变量/宿主变量数据类型未知Oracle数据库Objects(表、视图、索引、列等)属性WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com7动态SQL执行条件(1)•无论如何执行动态SQL语句,都需要一个包含有效的SQL语句(不包括EXECSQL语句)、或下面嵌入式SQL指令的字符串:ALLOCATECLOSEDECLAREDESCRIBEEXECUTEFETCHFREEGETINCLUDEOPENPREPARESETWHENEVERWelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com8动态SQL执行条件(2)•嵌入式SQL指令的字符串中,通常包含假的宿主变量•这些假的宿主变量只为告诉预处理器在该位置需要进行变量替换•这些假宿主变量不需要声明,可以采用任意命名方式•如下两个语句对动态SQL来说是完全一样的,尽管有“:mgr_number、:job_title”和“:m、:j”在样式上的区别,这些假宿主变量通常称为占位符号。“DELETEFROMEMPWHEREMGR=:mgr_numberANDJOB=:job_title”“DELETEFROMEMPWHEREMGR=:mANDJOB=:j”WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com9动态语句执行过程•通常一个应用程序提示用户输入SQL语句组成要素到宿主变量中•应用程序根据宿主变量值组织SQL语句•提交SQL语句到Oracle数据库服务器进行语法检查•Oracle绑定(bind)宿主变量到准备好的SQL语句中,此时Oracle得到宿主变量的地址,以能对变量内容进行读写•Oracle执行(execute)准备好的SQL语句•随着宿主变量的变化,Oracle可以重复执行这条SQL语句。WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com10使用动态SQL的方法•方法1:无SQL变量的非查询语句•方法2:已知输入变量个数的非查询语句•方法3:已知SELECT语句选取列和输入宿主变量个数的查询语句•方法4:未知SELECT语句选取列或输入宿主变量个数的查询语句也适用于未知列名列表和输入宿主变量的其他DML语句,只是其他语句处理比SELECT查询定义游标要简单WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com11方法1:无SQL变量的非查询语句•应用程序接收外界输入构造SQL语句到一个字符串•然后调用EXECUTEIMMEDIATE命令执行这个SQL语句•这种SQL语句不能为SELECT语句,不能包含输入变量的占位符。例如:’DELETEFROMEMPWHEREDEPTNO=20’’GRANTSELECTONEMPTOscott’•缺点此种方法每执行一次SQL语句,数据库都需要解析一遍SQL语句所以这种方法只适合运行一次或少数几次,否则严重影响应用程序效率。•EXECUTEIMMEDIATE命令的语法为:EXECSQLEXECUTEIMMEDIATE{:host_string|string_literal};WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com12方法1:代码示例chardynstmt1[10];VARCHARdynstmt2[80];……EXECSQLEXECUTEIMMEDIATECREATETABLEdyn1(col1VARCHAR2(4));strncpy(dynstmt1,COMMIT,10);EXECSQLEXECUTEIMMEDIATE:dynstmt1;strcpy(dynstmt2.arr,DROPTABLEDYN1“);dynstmt2.len=strlen(dynstmt2.arr);EXECSQLEXECUTEIMMEDIATE:dynstmt2;EXECSQLCOMMITRELEASE;WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com13方法2:已知输入变量个数的非查询语句•应用程序接受或组建一个SQL语句,并通过PREPARE和EXECUTE语句执行这个SQL,不能是查询语句。•为输入宿主变量准备的占位符数目和输入宿主变量的类型必须已知,例如:’INSERTINTOEMP(ENAME,JOB)VALUES(:emp_name,:job_title)’’DELETEFROMEMPWHEREEMPNO=:emp_number’•对方法2来说,SQL语句只在PREPARE时解析一次,以后可以执行多次,并随输入宿主变量的不同而执行结果不同。•对于数据定义语句(DDLSQL)语句,例如CREATE和GRANT,随PREPARE语句执行。WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com14方法2:已知输入变量个数的非查询语句•PREPARE语法格式如下:EXECSQLPREPAREstatement_nameFROM{:host_string|string_literal};PREPARE语句解析host_string宿主变量对应的SQL语句,并指定一个语句名称statement_name,语句名称不是一个宿主变量,不需要声明,只是一个编译标识。•EXECUTE语法格式如下:EXECSQLEXECUTEstatement_name[USINGhost_variable_list];其中host_variable_list格式如下::host_variable1[:indicator1][,host_variable2[:indicator2],...]EXECUTE通过USING子句读取输入的宿主变量,执行经过PREPARE解析过的SQL语句statement_name。USING子句中如果一个是数组宿主变量,USING子句中的宿主变量必须全是数组类型。WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com15方法2:代码示例VARCHARdynstmt[80];intempno=1234,deptno1=97,i=0;strcpy(dynstmt.arr,INSERTINTOEMP(EMPNO,DEPTNO)VALUES(:v1,:v2));dynstmt.len=strlen(dynstmt.arr);EXECSQLPREPAREsql_statementFROM:dynstmt;For(i=0;iMAX;i++){EXECSQLEXECUTEsql_statementUSING:empno,:deptno1;empno++;}EXECSQLCOMMITRELEASE;WelcometoPatternWorld…2020/1/18Tiger.WangEmail:Wangzhiyong512@gmail.comMSN:Wangzhiyong512@hotmail.com16方法3(1)•构造动态查询语句,通过接受或构建SQL语句,用DELCARE、PREPARE和OPEN、FETCH、CLOSE语句执行动态查询SQL语句,并访问查询结构。•适用于已知SELECT查询的各列、列类型、输入宿主变量数目、输入宿主变量类型的情况,例如:’SELECTDEPTNO,MIN(SAL),MAX(SAL)FROMEMPGROUPBYDEPTNO’’SELECTENAME,EMPNOFROMEMPWHEREDEPTNO=:dept_number
本文标题:proC程序设计
链接地址:https://www.777doc.com/doc-3141907 .html