达梦数据库存储过程的特点.docx
《达梦数据库存储过程的特点.docx》由会员分享,可在线阅读,更多相关《达梦数据库存储过程的特点.docx(29页珍藏版)》请在冰豆网上搜索。
达梦数据库存储过程的特点
达梦数据库存储过程的特点
达梦数据库允许用户使用系统提供的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存储过程对比表
操作
Oracle
DM
差异
基本语法
存储过程:
CREATE[ORREPLACE]PROCEDUREprocedure_name
[(argument[{IN|OUT|INOUT}]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。
存储过程:
CREATE[ORREPLACE]PROCEDURE<存储过程名>
[(<参数名><参数模式><参数类型>{,<参数名><参数模式><参数类型>})]
AS|IS
[<说明部分>]
<执行部分>
[<异常处理部分>]
END;
存储函数:
CREATE[ORREPLACE]FUNCTION<存储函数名>
[(<参数名><参数模式><参数类型>{,<参数名><参数模式><参数类型>})]
RETURN<返回数据类型>
AS|IS
[<说明部分>]
<执行部分>
[<异常处理部分>]
END;
在存储函数中必须使用RETURN语句向函数的调用环境返回一个值。
存储函数不能用CALL语句调用,它只能出现在表达式中。
存储函数和存储过程很相似,它们的区别在于:
1.存储过程没有返回值,而存储函数有;
2.存储过程中可以没有返回语句,而存储函数必须通过返回语句结束;
3.存储过程的返回语句中不能带表达式,而存储函数必须带表达式;
4.存储过程不能出现在一个表达式中,而存储函数只能出现在表达式中。
无
创建存储过程
CREATE[ORREPLACE]PROCEDURE<存储过程名定义>
[(<参数名><参数模式><参数类型>[<默认值表达式>]
{,<参数名><参数模式><参数类型>[<默认值表达式>]})]
[WITHENCRYPTION]AS|IS
[<说明部分>]
BEGIN
<执行部分>
[<异常处理部分>]
END;
CREATE[ORREPLACE]PROCEDURE<存储过程名定义>
[(<参数名><参数模式><参数类型>[<默认值表达式>]
{,<参数名><参数模式><参数类型>[<默认值表达式>]})]
[WITHENCRYPTION]AS|IS
[<说明部分>]
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
<执行部分>
[<异常处理部分>]
END
DMPL/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语句
IFTHEN
[ELSIF
]
…
[ELSIF
]
…
[ELSE
]
ENDIF;
根据布尔表达式的值,进行程序的分支控制;
语法格式:
IF<条件表达式>THEN
<执行部分>;
[{ELSEIF|ELSIF<条件表达式>THEN
<执行部分>;}]
[ELSE<执行部分>;]
ENDIF;
注意:
ELSEIF与ELSIF两种写法。
DM支持两种语法标记
循环语句
1.WHILE
WHILELOOP
;
[;]...
ENDLOOP;
2.LOOP
[<
LOOP
statements
ENDLOOP[label];
2FOR
FOR循环计数器IN[REVERSE]下限..上限LOOP
要执行的语句;
ENDLOOP;
5.FOR_QUERY
FORloop_nameINLOOP
;
[;]…
ENDLOOP;
1.LOOP:
循环执行,直至EXIT语句终止;
CREATEORREPLACEPROCUDUREP2
AS
AINT;
BEGIN
A:
=0;
LOOP
IFA>10THEN
EXIT;
ELSE
A:
=A+1;
ENDIF;
ENDLOOP;
END;
2.WHILE:
循环检测执行条件,为TRUE时执行,否则退出;
CREATEORREPLACEPROCEDUREP3
AS
DECLARE
AINT;
BEGIN
A:
=10;
WHILEA>0LOOP
A:
=