Oracle存储过程开发规范与技巧8122.docx
《Oracle存储过程开发规范与技巧8122.docx》由会员分享,可在线阅读,更多相关《Oracle存储过程开发规范与技巧8122.docx(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、存储过程开发规范与技巧开发规范1.书写规范1):程序头书写规范程序头开始部分应说明程序整体的功能,存储过程名称,编写人,编写日期,修改人,修改日期,版本号以及过程涉及的表和视图。示例如下:-/*名称及实现功能: 版本: ( 版本号标示:新建 V1.0.0 小的修改变为V1.0.1 大的修改V1.1.0 重构V2.0.0)Create by * Create Date 2006-06-29Update by * update Date 2006-06-30修改原因:Update by * update Date 2006-06-31修改原因:涉及的表或视图:dump_init 辅助表(DM):记
2、录存储过程中使用的物化视图日志序号mlog$_acrcusmrsecindex 源表(ODS):客户第一索引物化视图日志,使用同义词ft_gld_customerdata 目标表(DM):客户事实表*/CREATE OR REPLACE PROCEDURE *-2):代码书写规范1. 语句中出现的所有表名、字段名全部小写,系统保留字、内置函数名、Sql保留字大写。 2. 连接符or、in、and、以及、=等前后加上一个空格。3. where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。4. 查询的WHERE过滤,原则应使过滤记录数最多的条件放在最前面。 5.
3、 多表连接时,使用表的别名来引用列。6. 查找数据库表或视图时,只能取出确实需要的那些字段,不要使用*来代替所有列名。7. 功能相似的过程和函数,尽量写到同一个包中,加强管理。 示例如下:BEGIN -查询员工及对应的部门名称 SELECT emp.name, dept.name FROM l_dept dept, l_employee emp WHERE emp.dept_id = dept.dept_id;END;3)注释书写规范为了提高可读性,应该使用一定数量的注释。注释大约占总行数的1/5。1:注释风格:注释单独成行、放在语句前面。2:应对不易理解的分支条件表达式加注释;3:对重要的计
4、算应说明其功能;4:过长的函数实现,应将其语句按实现的功能分段加以概括性说明;5:每条SQL语句均应有注释说明6:对于程序的整体功能,应在程序开始部分说明,可采用单行/多行注释。(- 或 /* */ 方式)2.命名规范命名对象规则样例存储过程、包、方法1 业务相关以模块代码开头gld_assist_check_p2 如果区分全量和增量,在最后加标识gld_load_to_etlgld_load_to_etl_full3 全局使用,以global开头global_procedure_check变量以 v 开头v_updatemode1游标以 c 开头c_tablist内存表以 m 开头m_tab
5、le1临时表以 t 开头t_tmpTable存储过程技术1存储过程样例CREATE OR REPLACE PROCEDURE example ( v_input IN NUMBER,-输入参数 v_output OUT NUMBER -输出参数)ISPRAGMA AUTONOMOUS_TRANSACTION; CURSOR c1-定义一个游标,在begin之前 IS SELECT b.tablename mlogtable, MAX (remarks)KEEP (DENSE_RANK LAST ORDER BY starttime) remarks FROM proc_log a, table
6、_proc b WHERE TO_CHAR (starttime, yyyy-mm-dd) = -转换时间并做比较 TO_CHAR ( SYSDATE - TO_DSINTERVAL ( TO_CHAR (intervaldays) | 00:00:00), yyyy-mm-dd ) AND a.remarks LIKE SUCCEEDED:% AND a.procedurename = b.procedurename GROUP BY b.tablename); -定义结束c1_rec c1%ROWTYPE; -定义接受游标数据行的ROWTYPE v_mlogtable VARCHAR (3
7、0); v_postperiod CHAR (2); v_acctbalbeginseq NUMBER; v_systime DATE;BEGIN v_input := 0;-变量赋值 v_systime := SYSDATE; OPEN c1;-打开游标 LOOP-循环 FETCH c1 INTO c1_rec;-从当前游标行赋值c1_rec EXIT WHEN c1%NOTFOUND;-游标没有数据退出 v_mlogtable := c1_rec.mlogtable;-从行取出具体数据赋给变量 CASE TRIM (LOWER (v_mlogtable)-CASE起始 WHEN Strin
8、g1-当条件一 THEN-做条件一工作 BEGIN v_remarks := REPLACE (v_remarks, AA); END; WHEN String2-当条件二 THEN BEGIN END; ELSE-其他条件 NULL; END CASE;-CASE结束 IF (LOWER (SUBSTR (v_mlogtable, 1, 5) mlog$) THEN SELECT log_table INTO v_mlogtable FROM user_snapshot_logs WHERE LOWER (MASTER) = LOWER (v_mlogtable); END IF; EXEC
9、UTE IMMEDIATE delete from | v_mlogtable | where sequence$ 2;-循环跳出条件 END LOOP;-循环结束 CLOSE c1;-关闭游标 EXCEPTION WHEN OTHERS THEN ROLLBACK; global_procedure_check.check_end (checkdataerror01, v_systime, 1, SQLCODE | | SQLERRM ); RAISE; RETURN; END;END example;2基本知识1) 基本结构-CREATE OR REPLACE PROCEDURE exam
10、ple(parameters)-过程声明区IS-v_1 NUMBER;-过程中变量声明区-BEGIN v_1 := 0;-过程内容区END example;-2) 基本类型CHAR固定长度字符类型VARCHAR2可变长字符类型VARCHAR可变长字符类型(不建议使用)NUMBER一切数值类型DATE一切日期类型3) 参数三种:IN 输入参数,OUT输出参数,IN OUT 输入输出参数。4) 变量的声明在变量声明区声明变量的名称和类型例:v_postperiod CHAR (2);可赋初值v_postperiod CHAR (2):=01;(这里叫变量声明区可能并不恰当,因为游标、自定义类型等,
11、一切需要事先声明的都应在这里声明。)5) 变量的赋值使用:=为变量赋值1直接使用基本类型赋值例:v_number := 1;2.使用函数赋值例:v_date := sysdate;3使用SQL语句为变量赋值1通过sql直接赋值 SELECT COUNT (*) INTO v_tmpnumber FROM etl_ods_masterdata_tablist;2通过构造SQL赋值: v_tmpsql := SELECT log_table FROM user_snapshot_logs | v_dblink | WHERE UPPER (MASTER) = UPPER ( | v_singlet
12、ab | ); EXECUTE IMMEDIATE v_tmpsql INTO v_tmpvarchar;6) 循环1. 无限或简单循环LOOPEXIT WHEN (退出循环条件);END LOOP;2. while循环WHILE conditionLOOP executable_statements;END LOOP;3. for循环基于数字的for循环:FOR for_index IN low_value . high_valueLOOP executable_statements;END LOOP; 基于游标的for循环:FOR record_index IN my_cursorLOOP
13、 executable_statements;END LOOP;7) 调用其他过程或方法1如果单独定义,直接使用例:v_retval0 := f_dump_init (v_updatemode, v_systime, mlog$_glddocheader, v_procname, v_docheaderbeginseq, v_docheaderendseq );2如果定义在包下,使用包名+过程名例: global_procedure_check.check_run (v_procname);3固定用法和函数标识作用用法或类型固定用法:SYSDATE当前系统时间DATESQLCODE异常代码VA
14、RCHAR2SQLERRM异常描述VARCHAR2NO_DATA_FOUND未找到数据异常与 when 搭配OTHERS其他所有异常与 when 搭配RAISE抛出当前异常RAISE;DENSE_RANK非选取字段排序MIN(B) KEEP (DENSE_RANK FIRST ORDER BY A)MAX(B) KEEP (DENSE_RANK LAST ORDER BY A)PRAGMA AUTONOMOUS_TRANSACTIONBULK COLLECT INTOSQL%ROWCOUNT使用自治事务,可以使该过程被调用时单独提交Begin之前使用 PRAGMA AUTONOMOUS_TRA
15、NSACTION;将前面执行结果大批放入后面的集合中BULK COLLECT INTO columntab;前一个DML语句执行影响行数作为NUMBER型使用v_number:= SQL%ROWCOUNTDBMS_OUTPUT.put_line()输出信息函数TO_CHAR转换NCHAR、NVARCHAR2、CLOB、NCLOBTO_CHAR(A)转换DATE型为指定格式TO_CHAR (time, yyyy-mm-dd)转换NUMBER型为指定格式TO_CHAR (564.70, $999.9)TO_DATE转换字符串为指定日期to_date(1900-01-01,YYYY-MM-DD)IN
16、STR(string,substring(,postion)(, occurrence)返回目标字符串中子字符串的位置。(起始位置和出现次数为可选)INSTR (bug- archie, archie)INSTR (haracter?archie, a, 1, 2)LENGTH获得指定字符串长度LENGTH(CANDIDE)LOWER将指定字符串转换成小写LOWER (LETTERS)UPPER将指定字符串转换成大写UPPER (letters)LPAD(str1,n,str2)将str1用str2左补齐至n位LPAD (55, 10, 0)RPAD(str1,n,str2)将str1用str
17、2右补齐至n位RPAD (55, 10, 0)LTRIM去掉指定字符串左侧的指定字符或字符集合,默认为空格LTRIM ( Way)LTRIM (123123Way,123)RTRIM去掉指定字符串右侧的指定字符或字符集合,默认为空格RTRIM (Way xyXxyxy,xy)POWER(m,n)计算m的n次方POWER(2,3)Extract (year from date)取出date的年4ROWTYPE的使用可以使用%type 和% rowtype属性实现使用其他变量、数据库列或表的数据类型的引用。%type属性提供了所需要的变量的类型及长度。% rowtype属性允许人们定义一个记录变量
18、,它的成员变量拥有表中每一列正确的类型及长度,使用点符号引用记录中的每个成员变量。这种动态赋值方法是非常有用的,比如变量引用的列的数据类型和大小改变了,如果使用了%TYPE,那么用户就不必修改代码,否则就必须修改代码。 CREATE TABLE EMPLOYEE ( EMP_ID NUMBER NOT NULL, EMP_NAME CHAR (20), CREATE_DATE DATE)DECLARE v_studentrecord employee%ROWTYPE; n employee.create_date%TYPE;BEGIN SELECT * INTO v_studentrecord
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 存储 过程 开发 规范 技巧 8122
限制150内