ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:25.40KB ,
资源ID:6166710      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6166710.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DB2编程1.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DB2编程1.docx

1、DB2编程11 DB2编程 1.1 建存储过程时CREATE后一定不要用TAB键 3 1.2 使用临时表 3 1.3 从数据表中取指定前几条记录 3 1.4 游标的使用 4 注意commit和rollback 4 游标的两种定义方式 4 修改游标的当前记录的方法 5 1.5 类似DECODE的转码操作 5 1.6 类似CHARINDEX查找字符在字串中的位置 5 1.7 类似DATEDIF计算两个日期的相差天数 5 1.8 写UDF的例子 5 1.9 创建含IDENTITY值(即自动生成的ID)的表 6 1.10 预防字段空值的处理 6 1.11 取得处理的记录数 6 1.12 从存储过程返回

2、结果集(游标)的用法 6 1.13 类型转换函数 8 1.14 存储过程的互相调用 8 1.15 C存储过程参数注意 8 1.16 存储过程FENCE及UNFENCE 8 1.17 SP错误处理用法 9 1.18 IMPORT用法 9 1.19 VALUES的使用 9 1.20 给SELECT语句指定隔离级别 10 1.21 ATOMIC及NOTATOMIC区别 10 2 DB2编程性能注意 10 2.1 大数据的导表 10 2.2 SQL语句尽量写复杂SQL 10 2.3 SQLSP及CSP的选择 10 2.4 查询的优化(HASH及RR_TO_RS) 11 2.5 避免使用COUNT(*)

3、及EXISTS的方法 11 3 DB2表及SP管理 12 3.1 看存储过程文本 12 3.2 看表结构 12 3.3 查看各表对SP的影响(被哪些SP使用) 12 3.4 查看SP使用了哪些表 12 3.5 查看FUNCTION被哪些SP使用 12 3.6 修改表结构 12 4 DB2系统管理 13 4.1 DB2安装 13 4.2 创建DATABASE 14 4.3 手工做数据库远程(别名)配置 14 4.4 停止启动数据库实例 14 4.5 连接数据库及看当前连接数据库 14 4.6 停止启动数据库HEAD 15 4.7 查看及停止数据库当前的应用程序 15 4.8 查看本INSTANC

4、E下有哪些DATABASE 15 4.9 查看及更改数据库HEAD的配置 16 4.9.1 改排序堆的大小 16 4.9.2 改事物日志的大小 16 4.9.3 出现程序堆内存不足时修改程序堆内存大小 16 4.10 查看及更改数据库实例的配置 16 4.10.1 打开对锁定情况的监控。 16 4.10.2 更改诊断错误捕捉级别 17 4.11 DB2环境变量 17 4.12 DB2命令环境设置 17 4.13 改变隔离级别 17 4.14 管理DBINSTANCE的参数 18 4.15 升级后消除版本问题 18 4.16 查看数据库表的死锁 181 DB2编程 1.1 建存储过程时Creat

5、e后一定不要用TAB键 create procedure 的create后只能用空格,而不可用tab健,否则编译会通不过。 切记,切记。 1.2 使用临时表 要注意,临时表只能建在usertemporytablesspace上,如果database只有systemtemporytablespace是不能建临时表的。 另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。 建临时表时最好加上withreplace选项,这样就可以不显示的drop临时表,建临时表时如果不加该选项而该临时表在

6、该session内已创建且没有drop,这时会发生错误。 1.3 从数据表中取指定前几条记录 select*fromtb_market_codefetchfirst1rowsonly 但下面这种方式不允许 selectmarket_codeintov_market_code fromtb_market_codefetchfirst1rowsonly; 选第一条记录的字段到一个变量以以下方式代替 declarev_market_codechar(1); declarecursor1cursorforselectmarket_codefromtb_market_code fetchfirst1ro

7、wsonlyforupdate; opencursor1; fetchcursor1intov_market_code; closecursor1; 1.4 游标的使用 注意commit和rollback 使用游标时要特别注意如果没有加withhold选项,在Commit和Rollback时,该游标将被关闭。Commit和Rollback有很多东西要注意。特别小心 游标的两种定义方式 一种为 declarecontinuehandlerfornotfound begin setv_notfound=1; end; declarecursor1cursorwithholdforselectmar

8、ket_codefromtb_market_code forupdate; opencursor1; setv_notfound=0; fetchcursor1intov_market_code; whilev_notfound=0Do -work setv_notfound=0; fetchcursor1intov_market_code; endwhile; closecursor1; 这种方式使用起来比较复杂,但也比较灵活。特别是可以使用withhold选项。如果循环内有commit或rollback而要保持该cursor不被关闭,只能使用这种方式。另一种为 pcursor1:forlo

9、opcs1ascousor1cursoras selectmarket_codeasmarket_code fromtb_market_code forupdate do endfor; 这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。 但不能使用withhold选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。 修改游标的当前记录的方法 updatetb_market_codesetmarket_code=0wherecurrentofcur

10、sor1; 不过要注意将cursor1定义为可修改的游标 declarecursor1cursorforselectmarket_codefromtb_market_code forupdate; forupdate不能和GROUPBY、DISTINCT、ORDERBY、FORREADONLY及UNION,EXCEPT,orINTERSECT但UNIONALL除外)一起使用。 1.5 类似decode的转码操作 oracle中有一个函数 selectdecode(a1,1,n1,2,n2,n3)aa1from db2没有该函数,但可以用变通的方法 selectcasea1 when1thenn

11、1 when2thenn2 elsen3 endasaa1from 1.6 类似charindex查找字符在字串中的位置 Locate(y,dfdasfay) 查找y在dfdasfay中的位置。 1.7 类似datedif计算两个日期的相差天数 days(date(2001-06-05)days(date(2001-04-01) days返回的是从0001-01-01开始计算的天数 1.8 写UDF的例子 C写见sqllibsamplescliudfsrv.c 1.9 创建含identity值(即自动生成的ID)的表 建这样的表的写法 CREATETABLEtest (t1SMALLINTNO

12、TNULL GENERATEDALWAYSASIDENTITY (STARTWITH500,INCREMENTBY1), t2CHAR(1); 在一个表中只允许有一个identity的column.1.10 预防字段空值的处理 SELECTDEPTNO,DEPTNAME,COALESCE(MGRNO,ABSENT),ADMRDEPT FROMDEPARTMENT COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。 和oracle的isnull类似,但isnull好象只能两个表达式。 1.11 取得处理的记录数 declarev_countint; update

13、tb_test set t1=0 where t2=2; -检查修改的行数,判断指定的记录是否存在 getdiagnostics v_count=ROW_COUNT; 只对update,insert,delete起作用. 不对selectinto有效 1.12 从存储过程返回结果集(游标)的用法 1、建一sp返回结果集 CREATEPROCEDUREDB2INST1.Proc1() LANGUAGESQL resultsets2(返回两个结果集) - -SQL存储过程 - P1:BEGIN declarec1cursorwithreturntocallerfor selectmarket_co

14、de fromtb_market_code; -指定该结果集用于返回给调用者 declarec2cursorwithreturntocallerfor selectmarket_code fromtb_market_code; openc1; openc2; ENDP1 2、建一SP调该sp且使用它的结果集 CREATEPROCEDUREDB2INST1.Proc2( outout_market_codechar(1) LANGUAGESQL - -SQL存储过程 - P1:BEGIN declareloc1,loc2result_set_locatorvarying; -建立一个结果集数组

15、callproc1; -调用该SP返回结果集。 associateresultsetlocator(loc1,loc2)withprocedureproc1; -将返回结果集和结果集数组关联 allocatecursor1cursorforresultsetloc1; allocatecursor2cursorforresultsetloc2; -将结果集数组分配给cursor fetchcursor1intoout_market_code; -直接从结果集中赋值 closecursor1; ENDP1 3、动态SQL写法 DECLARECURSORC1FORSTMT1; PREPARESTM

16、T1FROM ALLOCATEC2CURSORFORRESULTSET?; 4、注意: 一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。 二、 allocate的cursor不能再次open,但可以close,是closesp中的对应cursor。 1.13 类型转换函数 selectcast(currenttimeaschar(8)fromtb_market_code 1.14 存储过程的互相调用 目前,csp可以互相调用。 Sqlsp可以互相调用, Sqlsp可以调用Csp, 但Csp不可以调用Sqlsp(最新的说法是可以) 1.15 C存储过程参数注意 createproce

17、durepr_clear_task_ctrl( ININ_BRANCH_CODEchar(4), ININ_TRADEDATEchar(8), ININ_TASK_IDchar(2), ININ_SUB_TASK_IDchar(4), OUTOUT_SUCCESS_FLAGINTEGER) DYNAMICRESULTSETS0 LANGUAGEC PARAMETERSTYLEGENERALWITHNULLS(如果不是这样,sql的sp将不能调用该用c写的存储过程,产生保护性错误) NODBINFO FENCED MODIFIESSQLDATA EXTERNALNAMEpr_clear_task

18、_ctrl!pr_clear_task_ctrl1.16 存储过程fence及unfence fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。 一般而言,fence的存储过程比较安全。 但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。 1.17 SP错误处理用法 如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP, DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都 会插入到日志,这样子最后会出现多条SQLCODE=0的

19、警告信息。 处理办法: 定义一个标志变量,比如DECLAREV_STATUSINTEGERDEFAULT0, 在CALLSPNAME之后,SETV_STATUS=1, DECLARECONTINUEHANDLERFORSQLWARNING BEGIN IFV_STATUS1THEN -警告处理,插入日志 SETV_STATUS=0; ENDIF; END; 1.18 import用法 db2importfromgh1.outofDELmessageserr.txtinsertintodb2inst1.tb_dbf_match_ha 注意要加schma 1.19 values的使用 如果有多个s

20、et语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。 但要注意,values不能将null值付给一个变量。 values(null)intoout_return_code; 这个语句会报错的。 1.20 给select语句指定隔离级别 select*fromtb_head_stock_balancewithur 1.21 atomic及notatomic区别 atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。 2 DB2编程性能注意 2

21、.1 大数据的导表 应该是export后再load性能更好,因为load不写日志。 比selectinto要好。2.2 SQL语句尽量写复杂SQL 尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。 DB2的SQLEngieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。 Oracle则相反,推荐将复杂的语句简单化,SQLEngieer的优化能力不是特别好。 这是因为每一个SQL语句都会有resetSQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。 一个总的思想就是尽量减少SQL语句的个数。 2.3 SQLSP及CSP的选择 首

22、先,C的sp的性能比sql的sp的要高。 一般而言,SQL语句比较复杂,而逻辑比较简单,sqlsp与csp的性能差异会比较小,这样从工作量考虑,用SQL写比较好。 而如果逻辑比较复杂,SQL比较简单,用c写比较好。 2.4 查询的优化(HASH及RR_TO_RS) db2set DB2_HASH_JOIN=Y (HASH排序优化) 指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。 剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下72秒。 db2set DB2_RR_TO_RS=Y 该设置后,不能

23、定义RR隔离级别,如果定义RR,db2也会自动降为RS. 这样,db2不用管理Nextkey,可以少管理一些东西,这样可以提高性能。 2.5 避免使用count(*)及exists的方法 1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。 2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。 如果做这两中操作的目的是为 selectinto服务的话,就可以省略掉这两步。 直接使用selectinto选择记录中的字段。 如果是没有记录选择到的话,db2会将sqlcode=100和sql

24、state=20000 如果是有多条记录的话,db2会产生一个错误。 程序可以创建continuehandlerforexception continuehandlerfornotfound 来检测。 这是最快速的方法。 3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*)要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。 3 DB2表及sp管理 3.1 看存储过程文本 selecttextfromsyscat.procedureswhereprocname=PROC1; 3.2 看表结构 des

25、cribetablesyscat.procedures describeselect*fromsyscat.procedures 3.3 查看各表对sp的影响(被哪些sp使用) selectPROCNAMEfromSYSCAT.PROCEDURESwhereSPECIFICNAMEin(selectdnamefromsysibm.sysdependencieswherebnamein(selectPKGNAMEfromsyscat.packagedepwherebname=TB_BRANCH)3.4 查看sp使用了哪些表 selectbnamefromsyscat.packagedepwher

26、ebtype=Tandpkgnamein(selectbnamefromsysibm.sysdependencieswherednamein(selectspecificnamefromsyscat.procedureswhereprocname=PR_CLEAR_MATCH_DIVIDE_SHA) 3.5 查看function被哪些sp使用 selectPROCNAMEfromSYSCAT.PROCEDURESwhereSPECIFICNAMEin(selectdnamefromsysibm.sysdependencieswherebnamein(selectPKGNAMEfromsyscat.packagedepwherebnamein(selectSPECIFICNAMEfromSYSCAT.functionswherefuncname=GET_CURRENT_DATE) 使用function时要注意,如果想drop掉该function必须要先将调用该function的其它存储过程全部drop掉。 必须先创建function,调用该functio

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1