Oracle存储过程开发规范与技巧6579.docx
《Oracle存储过程开发规范与技巧6579.docx》由会员分享,可在线阅读,更多相关《Oracle存储过程开发规范与技巧6579.docx(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、存储过程开发规范与技巧开发规范1.书写规范1):程序头书书写规范程序头开始部分分应说明程序整整体的功能,存存储过程名称称,编写人,编编写日期,修修改人,修改改日期,版本本号以及过程涉涉及的表和视视图。示例如如下:-/*名称及实现功能能: 版本: ( 版版本号标示:新建 V11.0.0 小的修改改变为V1.0.1 大大的修改V11.1.0 重构V2.0.0)Create by * Creatte Date 2006-06-29Update by * uppdate Datee 2006-06-30修改原因:Update by * uppdate Datee 2006-06-31修改原因:涉及的表
2、或视图图:dump_innit 辅助表(DMM):记录存存储过程中使使用的物化视视图日志序号号mlog$_aacrcussmrseccindexx 源表(ODSS):客户第第一索引物化化视图日志,使用同义词词ft_gld_custoomerdaata 目标表(DMM):客户事事实表*/CREATE OR REPLAACE PROCEEDURE *-2):代码书写写规范1. 语句中出现的所所有表名、字字段名全部小小写,系统保保留字、内置置函数名、SSql保留字字大写。 2. 连接符or、iin、andd、以及、=等等前后加上一一个空格。3. where子句句书写时,每每个条件占一一行,语句令令起
3、一行时,以以保留字或者者连接符开始始,连接符右右对齐。4. 查询的WHERRE过滤,原原则应使过滤滤记录数最多多的条件放在在最前面。 5. 多表连接时,使使用表的别名名来引用列。6. 查找数据库表或或视图时,只只能取出确实实需要的那些些字段,不要要使用*来代代替所有列名名。7. 功能相似的过程程和函数,尽尽量写到同一一个包中,加加强管理。 示例如下下:BEGIN -查询员工工及对应的部部门名称 SSELECTT emp.name, deptt.name FROMM l_deppt deppt, l_empployeee emp WHEREE emp.dept_id = deptt.dept_i
4、d;END;3)注释书写规规范为了提高可读性性,应该使用用一定数量的的注释。注释释大约占总行行数的1/55。1:注释风格:注释单独成成行、放在语语句前面。2:应对不易理理解的分支条条件表达式加加注释;3:对重要的计计算应说明其其功能;4:过长的函数数实现,应将将其语句按实实现的功能分分段加以概括括性说明;5:每条SQLL语句均应有有注释说明6:对于程序的的整体功能,应应在程序开始始部分说明,可可采用单行/多行注释。(- 或 /* */ 方式)2.命名规范命名对象规则样例存储过程、包、方方法1 业务相关以以模块代码开开头gld_asssist_ccheck_p2 如果区分全全量和增量,在在最后加
5、标识识gld_loaad_to_etlgld_loaad_to_etl_ffull3 全局使用,以以globaal开头global_proceedure_checkk变量以 v 开头v_updattemodee1游标以 c 开头c_tabliist内存表以 m 开头m_tablee1临时表以 t 开头t_tmpTaable存储过程技术1存储过程样样例CREATE OR REPLAACE PROCEEDURE exampple ( v_innput IN NUUMBER,-输入参参数 v_ouutput OUT NUUMBER -输输出参数)ISPRAGMA AUTONNOMOUSS_TRANN
6、SACTIION; CURSSOR c11-定义一一个游标,在在beginn之前 IS SSELECTT b.tableename mlogttable, MAAX (remarkks)KEEEP (DENSSE_RANNK LAST ORDERR BY staarttimme) remmarks FFROM proc_log aa, tablee_procc b WWHERE TO_CHHAR (startttime, yyyyy-mm-ddd) = -转换时时间并做比较较 TO_CCHAR ( SYSSDATE - TO_DSSINTERRVAL ( TO_CHARR (interrval
7、daays) | 00:000:00), yyyyy-mm-ddd ) AAND a.remarrks LIIKE SUCCCEEDEDD:% AAND a.proceedurenname = b.proceedurenname GGROUP BY b.tableename); -定义结结束c1_rec c1%ROWTYYPE; -定义接接受游标数据据行的ROWTYYPE v_mllogtabble VARCHHAR (30); v_poostperriod CHHAR (2); v_accctballbeginnseq NUUMBER; v_syystimee DAATE;BEGIN v_i
8、nnput := 0;-变量赋赋值 v_syystimee := SYSSDATE; OPENN c1;-打开游游标 LOOPP-循环 FFETCH c1 INTO cc1_recc;-从当前前游标行赋值值c1_reec EEXIT WHEN cc1%NOTTFOUNDD;-游标没没有数据退出出 vv_mloggtablee := c1_rec.mlogttable;-从行取取出具体数据据赋给变量 CCASE TTRIM (LOWERR (v_mloogtablle)-CASSE起始 WHEEN Strinng1-当条件件一 THEEN-做条件件一工作 BEGINN v_remarrks :=
9、 REPLAACE (v_remmarks, AA); END; WHEEN Strinng2-当条件件二 THEEN BEGINN END; ELSSE-其他条条件 NULL; EEND CASE;-CASSE结束 IIF (LOWERR (SUBSTTR (v_mloogtablle, 1, 5) mlogg$) TTHEN SELLECT llog_taable IINTO vv_mloggtablee FFROM uuser_ssnapshhot_loogs WHHERE LLOWER (MASTTER) = LOWEER (v_mloogtablle); EEND IF; EEXEC
10、UTTE IMMEDDIATE ddeletee fromm | v_mloogtablle | wheere seequencce$ 2;-循环跳跳出条件 END LOOP;-循环结结束 CLOSSE c1;-关闭游游标 EXCEEPTIONN WWHEN OTHERRS TTHEN ROLLLBACKK; gloobal_pproceddure_ccheck.checkk_end (checckdataaerrorr01, v_syystimee, 1, SQLCCODE | | SQQLERRMM ); RAIISE; RETTURN; END;END exaample;2基本知识1)
11、基本结构-CREATE OR REPLAACE PROCEEDURE exampple(paarametters)-过程声声明区IS-v_1 NUMBBER;-过程中变变量声明区-BEGIN v_1 := 0;-过程内容容区END exaample;-2) 基本类型CHAR固定长度字符符类型VARCHARR2可变长字符符类型VARCHARR可变长字符符类型(不建建议使用)NUMBER一切数值类类型DATE一切日期类类型3) 参数三种:IN 输输入参数,OOUT输出参参数,IN OUT 输输入输出参数数。4) 变量的声明在变量声明区声声明变量的名名称和类型例:v_posstperiiod CHA
12、AR (2);可赋初值v_postpperiodd CHAR (2):=01;(这里叫变量声声明区可能并并不恰当,因因为游标、自自定义类型等等,一切需要要事先声明的的都应在这里里声明。)5) 变量的赋值使用:=为为变量赋值1直接使用基基本类型赋值值例:v_nummber := 1;2.使用函数赋赋值例:v_datte := sysdaate;3使用SQLL语句为变量量赋值1通过sqll直接赋值 SSELECTT COUNNT (*) INTOO v_tmppnumbeer FROMM etl_oods_maasterddata_ttablisst;2通过构造SSQL赋值: v_ttmpsqll
13、 := SSELECTT log_tablee FROOM useer_snaapshott_logss | v_dblinnk | WHEREE UPPEER (MAASTER) = UPPPER ( | v_singlletab | ); EXEECUTE IMMEDDIATE v_tmppsql INTO vv_tmpvvarchaar;6) 循环1. 无限或简单循环环LOOPEXIT WHHEN (退出循环条条件);END LOOOP;2. while循环环WHILE ccondittionLOOP execcutablle_staatemennts;END LOOOP;3. for循
14、环基于数字的foor循环:FOR forr_indeex IN low_vvalue . hiigh_vaalueLOOP execcutablle_staatemennts;END LOOOP; 基于游标的foor循环:FOR reccord_iindex IN myy_curssorLOOP execcutablle_staatemennts;END LOOOP;7) 调用其他过程或或方法1如果单独定定义,直接使使用例:v_rettval0 := f_dummp_iniit (v_upddatemoode, v_systiime, mmlog$_glddoocheadder, v_proc
15、nname, v_docheeaderbbeginsseq, v_docheeadereendseqq );2如果定义在在包下,使用用包名+过程程名例: globbal_prroceduure_chheck.ccheck_run (v_proocnamee);3固定用法和和函数标识作用用法或类型固定用法:SYSDATEE当前系统时间DATESQLCODEE异常代码VARCHARR2SQLERRMM异常描述VARCHARR2NO_DATAA_FOUNND未找到数据异常常与 when 搭配OTHERS其他所有异常与 when 搭配RAISE抛出当前异常RAISE;DENSE_RRANK非选取字段排
16、序序MIN(B) KEEP (DENSSE_RANNK FIRST ORDEER BY A)MAX(B) KEEP (DENSE_RANK LAST ORDERR BY AA)PRAGMA AUTONNOMOUSS_TRANNSACTIIONBULK COOLLECTT INTOSQL%ROWWCOUNTT使用自治事务,可可以使该过程程被调用时单单独提交Begin之前前使用 PRRAGMA AUTONNOMOUSS_TRANNSACTIION;将前面执行结果果大批放入后后面的集合中中BULK COOLLECTT INTO ccolumnntab;前一个DML语语句执行影响响行数作为NUMBEE
17、R型使用v_numbeer:= SQL%ROOWCOUNNTDBMS_OUUTPUT.put_lline()输出信息函数TO_CHARR转换NCHARR、NVARCCHAR2、CLOB、NCLOBBTO_CHARR(A)转换DATE型型为指定格式式TO_CHARR (time, yyyyy-mm-ddd)转换NUMBEER型为指定定格式TO_CHARR (5644.70, $9999.9)TO_DATEE转换字符串为指指定日期to_datee(1900-01-011,YYYYY-MM-DDD)INSTR(sstringg,subsstringg(,posstion)(, occurrrence
18、e)返回目标字符串串中子字符串串的位置。(起起始位置和出出现次数为可可选)INSTR (bug- archhie, archhie)INSTR (haraacter?archiie, a, 1, 2)LENGTH获得指定字符串串长度LENGTH(CANDDIDE)LOWER将指定字符串转转换成小写LOWER (LETTTERS)UPPER将指定字符串转转换成大写UPPER (letteers)LPAD(sttr1,n,str2)将str1用sstr2左补齐至n位LPAD (55, 10, 0)RPAD(sttr1,n,str2)将str1用sstr2右补齐至n位位RPAD (55, 10, 0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 存储 过程 开发 规范 技巧 6579
限制150内