达梦数据库存储过程的特点

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

达梦数据库存储过程的特点达梦数据库允许用户使用系统提供的DMPL/SQL语言创建过程或函数,这些过程或函数象普通的过程或函数一样,有输入、输出参数和返回值,它们与表和视图等数据库对象一样被存储在数据库中,供用户随时调用。存储过程和存储函数在功能上相当于客户端的一段SQL批处理程序,但是在许多方面有着后者无法比拟的优点,它为用户提供了一种高效率的编程手段,成为现代数据库系统的重要特征。25亿网站后台管理系统将存储过程和存储函数统称为存储模块。达梦数据库的存储模块机制是一种技术,而不是一种独立的工具,它是和服务器紧密结合在一起的。可以认为这种技术是执行DMPL/SQL语言的一种机器,它可以接受任何有效的存储模块,按照语言本身所规定的语义执行,并将结果返回给客户。达梦数据库的存储模块机制具有如下优点:1.提供更高的生产率(1)在设计应用时,围绕存储过程/函数设计应用,可以避免重复编码,提高生产率;(2)在自顶向下设计应用时,不必关心实现的细节;(3)编程方便。2.便于维护(1)用户的存储模块在数据库集中存放;(2)用户可以随时查询、删除它们,而应用程序可以不作任何修改,或只做少量调整。3.提供更好的性能(1)存储模块在创建时被编译成伪码序列,在运行时不需要重新进行编译和优化处理,它具有更快的执行速度,可以同时被多个用户调用,并能够减少操作错误;如用sqlserver修改mssql2000的存储过程所有者为dbo,这些小地方还是有些麻烦的。(2)存储模块在执行时数据对用户是不可见的,提高了数据库的安全性;(3)存储模块具有更高的可靠性;(4)存储模块是一种高效访问数据库的机制,网站后台管理模板使用存储模块可减少应用对DM的调用,降低了系统资源浪费,显著提高性能,尤其是在网络上与DM通讯的应用更显著。2.1.4.3DM与Oracle存储过程对比表操作OracleDM差异基本语法存储过程:CREATE[ORREPLACE]PROCEDUREprocedure_name[(argument[{IN|OUT|IN存储过程:CREATE[ORREPLACE]PROCEDURE存储过程名[(参数名参数模式参数类无OUT}]type,...argument[{IN|OUT|INOUT}]type)]{IS|AS}procedure_body其中procedure_name是要创建的过程名,argument是过程的参数名,type是关联参数的类型,procedure_body是构成该过程代码的PL/SQL块。IN,OUT,和INOUT是参数的模式,如果没有为参数指定模式,则参数缺省的模式是IN。存储函数:CREATE[ORREPLACE]FUNCTIONfunction_name[(argument[{IN|OUT|INOUT}]type,...argument[{IN|OUT|INOUT}]type)]RETURNreturn_type{IS|AS}function_body其中function_name是函数的名称,参数argument和type的含义与过程相同,return_type是函数返回值的类型,function_body是包括函数体的PL/SQL块。IN,OUT,和INOUT是参数的模式。如果没有为参数指定模式,则参数缺省的模式是IN。型{,参数名参数模式参数类型})]AS|IS[说明部分]执行部分[异常处理部分]END;存储函数:CREATE[ORREPLACE]FUNCTION存储函数名[(参数名参数模式参数类型{,参数名参数模式参数类型})]RETURN返回数据类型AS|IS[说明部分]执行部分[异常处理部分]END;在存储函数中必须使用RETURN语句向函数的调用环境返回一个值。存储函数不能用CALL语句调用,它只能出现在表达式中。存储函数和存储过程很相似,它们的区别在于:1.存储过程没有返回值,而存储函数有;2.存储过程中可以没有返回语句,而存储函数必须通过返回语句结束;3.存储过程的返回语句中不能带表达式,而存储函数必须带表达式;4.存储过程不能出现在一个表达式中,而存储函数只能出现在表达式中。创建存储过程CREATE[ORREPLACE]PROCEDURE存储过程名定义[(参数名参数模式参数类型[默认值表达式]{,参数名参数模式参数类型[默认值表达式]})][WITHENCRYPTION]AS|ISCREATE[ORREPLACE]PROCEDURE存储过程名定义[(参数名参数模式参数类型[默认值表达式]{,参数名参数模式参数类型[默认值表达式]})][WITHENCRYPTION]AS|IS无[说明部分]BEGIN执行部分[异常处理部分]END;[说明部分]BEGIN执行部分[异常处理部分]END;撤销存储过程DROPPROCEDURE存储过程名;DROPPROCEDURE存储过程名;无调用存储过程CALL存储过程名[(参数{,参数})];1.CALL存储过程名[(参数{,参数})];2.EXEC存储过程名[(参数{,参数})];3.存储过程名[(参数{,参数})];DM支持多种调用方式创建存储函数CREATE[ORREPLACE]FUNCTION存储函数名定义[(参数名参数模式参数类型[默认值表达式]{,参数名参数模式参数类型[默认值表达式]})]RETURN返回数据类型[WITHENCRYPTION]AS|IS[说明部分]BEGIN执行部分[异常处理部分]END;CREATE[ORREPLACE]FUNCTION存储函数名定义[(参数名参数模式参数类型[默认值表达式]{,参数名参数模式参数类型[默认值表达式]})]RETURN返回数据类型[WITHENCRYPTION]AS|IS[说明部分]BEGIN执行部分[异常处理部分]END;无撤销存储函数DROPFUNCTION存储函数名;DROPFUNCTION存储函数名;无调用存储函数SELECT存储函数名[(参数{,参数})];SELECT存储函数名[(参数{,参数})];无PLSQL支持的结构1.顺序结构;2.分支结构,包括条件、循环结构等;3.迭代结构,包括子过程、子函数的调用。1.顺序结构;2.分支结构,包括条件、循环结构等;3.迭代结构,包括子过程、子函数的调用。无语句块结构DECLARE...BEGIN...EXCEPTION...END;语法格式:[{DECLARE变量说明;}]BEGIN执行部分[异常处理部分]ENDDMPL/SQL基本的程序单元;一无个语句可以当作一个整体SQL语句对待,允许嵌套,可出现在SQL语句能出现的任何地方。赋值语句variable:=expression;给对象赋值;语法格式:1.赋值对象:=值表达式2.SET赋值对象=值表达式需要注意的是,使用第2种形式时,不需要冒号“:”。DM支持多种赋值方式变量定义variabledata_type[:=|DEFAULT]default_value;1.在语句块的说明部分可以定义变量、游标、异常变量、子过程或子函数;2.需要强调的一点是,一个语句块意味着一个作用域范围,也就是说,在一个语句块的说明部分定义的任何对象,其作用域就是该语句块;3.暂不支持缺省值的定义。ORACLE支持缺省值;DM不支持缺省值;返回语句RETURN;RETURN结果值;RETURN;RETURN结果值;1.结束存储模块的运行,将控制返回给调用者;2.如果从函数返回,同时返回函数的结果。无退出循环EXIT[WHENcondition];EXIT[WHENcondition];1.EXIT与循环语句一起使用,用于终止循环语句的执行,将控制转移到循环语句的下一个语句;2.可以无条件终止循环语句;3.可以带条件终止循环语句,当检测条件满足时才执行EXIT语句。无IF语句IFcondition1THENperformaction1[ELSIFcondition2performaction2]…[ELSIFconditionNperformactionN]…[ELSEperformdefaultaction]ENDIF;根据布尔表达式的值,进行程序的分支控制;语法格式:IF条件表达式THEN执行部分;[{ELSEIF|ELSIF条件表达式THEN执行部分;}][ELSE执行部分;]ENDIF;注意:ELSEIF与ELSIF两种写法。DM支持两种语法标记循环语句1.WHILE1.LOOP:循环执行,直至EXIT无WHILEconditionLOOPstatement1;[statement2;]...ENDLOOP;2.LOOP[label]LOOPstatementsENDLOOP[label];2FORFOR循环计数器IN[REVERSE]下限..上限LOOP要执行的语句;ENDLOOP;5.FOR_QUERYFORloop_nameINselect_statementLOOPstatement1;[statement2;]…ENDLOOP;语句终止;CREATEORREPLACEPROCUDUREP2ASAINT;BEGINA:=0;LOOPIFA10THENEXIT;ELSEA:=A+1;ENDIF;ENDLOOP;END;2.WHILE:循环检测执行条件,为TRUE时执行,否则退出;CREATEORREPLACEPROCEDUREP3ASDECLAREAINT;BEGINA:=10;WHILEA0LOOPA:=A-1;ENDLOOP;END;3.FOR:执行指定次数;CREATEORREPLACEPROCEDUREP4ASDECLAREAINT;BEGINFORAIN1..10LOOPPRINTA;ENDLOOP;END;4.REPEAT:重复执行,直至达到条件要求。CREATEORREPLACEPROCEDUREP5ASDECLAREAINT;BEGINA:=0;REPEATA:=A+1;UNTILA10;END;NULL语句NULL;NULL;1.不执行任何操作;2.只用于增强程序的可读性。无打印语句dbms_output.put_line(v_out.xx);PRINT值表达式;打印调试信息,用于调试存储模块。打印语句不同,但不影响整理逻辑性动态语句执行EXECUTEIMMEDIATEcommandstringINTO…USINGIN…OUT…;EXECUTEIMMEDIATEcommandstringINTO…USINGIN…OUT…;如下例所示:CREATEORREPLACEPROCEDUREP8ASV_SQLVARCHAR(2000);V_AINT;V_BINT;BEGINV_SQL:=‘INSERTINTOT1(A,B)VALUES(?,?)’;V_A:=10;V_B:=10;EXECUTEIMMEDIATEV_SQLUSINGV_A,V_B;END;无游标的使用1.定义游标CURSORcursor_name[(parameter[,parameter]…)]ISselect_statement;2.打开游标1.游标不能作为参数传递,也不能被赋值;2.游标的四个属性:(1)FOUND:拨动游标,取到数据为真,否则为假;(2)NOTFOUND:拨动游标,取无OPENcursor_name[([parameter=]value[,[parameter=]value]…)];OPENcurso_na

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功