您当前的位置:首页 > 精选知识 > 正文

什么是存储过程有什么优点?在SQL中存储过程分为哪五类

本文目录

  • 什么是存储过程有什么优点
  • 在SQL中存储过程分为哪五类
  • 为什么要使用存储过程
  • 存储过程的名词解释
  • 什么是存储过程存储过程有什么特点
  • asp调用存储过程问题
  • 如何在VBA中调用存储过程
  • ADO或odbc如何创建存储过程和表
  • 数据库系统原理 什么是存储过程有什么优点
  • 如何用VB6调用带参数带输出的存储过程

什么是存储过程有什么优点

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

优点:

1、重复使用:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

3、安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

扩展资料:

存储过程的缺点:

1、更改比较繁琐:如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐。

2、可移植性差:由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则需要将业务逻辑封装在不特定于 RDBMS 的中间层中。

参考资料来源:百度百科-存储过程

在SQL中存储过程分为哪五类

1、目录存储过程

例如:sp_columns返回当前环境中可查询的指定表或视图的列信息。

sp_tables返回当前环境下可查询的对象的列表(任何可出现在FROM子句中的对象)。

2、复制类存储过程

例如:sp_addarticle创建项目并将其添加到发布中。此存储过程在发布服务器的发布数据库上执行。

3、安全管理类存储过程

例如:sp_addrole在当前数据库创建新的Microsoft SQL Server角色。

sp_password添加或更改Microsoft SQL Server登录的密码。

4、分布式查询存储过程

例如:sp_foreignkeys返回引用主键的外键,这些主键在链接服务器中的表上。

sp_primarykeys返回指定远程表的主键列,每个键列占一行。

5、扩展存储过程

例如:xp_sendmail向指定的收件人发送邮件和查询结果集附件。

xp_startmail启动SQL邮件客户端会话。

存储过程的特点

1、存储过程在服务器端运行,执行速度快。

2、存储过程执行一次后,其执行驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。

3、确保数据库的安全。使用存储过程可以完成所有的数据库操作。

4、降低网络负载,提高效率。

5、可以接受用户参数,亦可返回参数。

6、作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

为什么要使用存储过程

存储过程是指一组具有某种特殊功能的SQL语句集,常用于大型数据库中,也出现于开发过程中。程序员经常运用存储过程是由于其具有以下优点:

一、响应时间上来说有优势:如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话,就只有一次。存储过程可以给我们带来运行效率提高的好处。

二、安全上使用了存储过程的系统更加稳定:程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。

扩展资料

存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。

一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。经自已测试,一个有着十万条记录的表,通过php调用存储过程比通过PHP执行sql语句获取所有记录的时间,平均快0.4秒左右。

参考资料来源:百度百科-存储过程

存储过程的名词解释

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升

什么是存储过程存储过程有什么特点

存储过程就是把特定的sql语句存在一个程序里、然后存入系统、当你使用时、这些sql语句就不用重新再写。使用后、系统执行效率高,方便用户使用

asp调用存储过程问题

CreateParameter(Name,Type,Direction,Size,Value)都是可选参数,Name 参数名,不需要与存储过程的对应Type 数据类型,200是字符串,3是整数,具体可以参考adovbs.incDirection 方向,1:输入 2:输出 或者 4:返回,默认输入Size 数据长度Value 参数值 -------’设定Command对象使用的数据库连接Set cmd.ActiveConnection=conn’命令文本,这里是存储过程名cmd.CommandText=“game_work_fish_get_set_complete“ ’命令类型,4是存储过程,1是文本cmd.CommandType= 4’创建并添加一个参数cmd.Parameters.Append cmd.CreateParameter(...)’给参数赋值cmd(“@community_id“) = 值cmd.execute ’ 执行命令’将输出参数的值赋给变量cmd_level_name = cmd(“@level_name“)

如何在VBA中调用存储过程

方法有几种

1、

Set Conn = Server.CreateObject(“ADODB.Connection“)Conn.open strConnif err.number《》0 thenresponse.Write “数据库链接失败。“ ’& err.Description response.Endend Ifset Rs = server.CreateObject(“adodb.recordset“)’调用存储过程:[dbo].[Usp_GetUserMenu]strsql=“[dbo].[Usp_GetUserMenu] @UserID=’“&Session(g_SessionName&“_UserID“)&“’“’这句话是关键,CursorLocation意思是游标本地化rs.CursorLocation=3Rs.open strsql,conn,1,1if err.number《》0 Then    conn.close    set conn=nothingend iffor i=1 to rs.RecordCount    iMenuType=rs(“MenuType“)    ......    rs.MoveNextnextrs.Closeset rs=nothingconn.closeset conn=nothing

2. 使用adobd.Command对象

VB6.0 调用存储过程的例子(说明:以下代码摘自微软的MSDN,经过测试没问题。使用该方法的前提条件是必须知道将要使用的参数化命令的详细情况。)打开Form1窗体,Copy以下的代码到窗体中,该段代码将测试存储过程ADOTestRPE的返回值、输入参数及输出参数,测试的过程中,可能需要修改链接字符串。Sub CreateParms()Dim ADOCmd As New ADODB.CommandDim ADOPrm As New ADODB.ParameterDim ADOCon As ADODB.ConnectionDim ADORs As ADODB.RecordsetDim sParmName As StringDim strConnect As StringDim rStr As StringOn Error GoTo ErrHandlerstrConnect = “driver={SQL Server};server=(local);uid=sa;pwd=;database=pubs“Set ADOCon = New ADODB.ConnectionWith ADOCon.Provider = “MSDASQL“.CursorLocation = adUseServer ’Must use Server side cursor..ConnectionString = strConnect.OpenEnd WithSet ADOCmd.ActiveConnection = ADOConWith ADOCmd.CommandType = adCmdStoredProc.CommandText = “ADOTestRPE“End With’Parameter 0 is the stored procedure Return code.sParmName = “Return“Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamReturnValue, , 0)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = -1’Parameter 1 is the setting for the stored procedure Output’ parameter.sParmName = “Output“Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamOutput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 999’Parameter 2sParmName = “R1Num“ ’Number of rows to return in Resultset 1.Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamInput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 1’Parameter 3sParmName = “P1Num“ ’Number of PRINT statements in Resultset 1.Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamInput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 0’Parameter 4sParmName = “E1Num“ ’Number of RAISERROR statements in Resultset’1.Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamInput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 0’Parameter 5sParmName = “R2Num“ ’Number of rows to return in Resultset 2.Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamInput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 2’Parameter 6sParmName = “P2Num“ ’Number of PRINT statements in Resultset 2.Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamInput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 0’Parameter 7sParmName = “E2Num“ ’Number of RAISERROR statements in Resultset’ 2.Set ADOPrm = ADOCmd.CreateParameter(sParmName, adInteger, _adParamInput)ADOCmd.Parameters.Append ADOPrmADOCmd.Parameters(sParmName).Value = 0Set ADORs = ADOCmd.ExecuteDo While (Not ADORs Is Nothing)If ADORs.State = adStateClosed Then Exit DoWhile Not ADORs.EOFFor i = 0 To ADORs.Fields.Count - 1rStr = rStr & “ : “ & ADORs(i)Next iDebug.Print Mid(rStr, 3, Len(rStr))ADORs.MoveNextrStr = ““WendDebug.Print “----------------------“Set ADORs = ADORs.NextRecordsetLoopDebug.Print “Return: “ & ADOCmd.Parameters(“Return“).ValueDebug.Print “Output: “ & ADOCmd.Parameters(“Output“).ValueGoTo ShutdownErrHandler:Call ErrHandler(ADOCon)Resume NextShutdown:Set ADOCmd = NothingSet ADOPrm = NothingSet ADORs = NothingSet ADOCon = NothingEnd SubPrivate Sub Command1_Click()Call CreateParmsEnd SubSub ErrHandler(objCon As Object)Dim ADOErr As ADODB.ErrorDim strError As StringFor Each ADOErr In objCon.ErrorsstrError = “Error #“ & ADOErr.Number & vbCrLf & ADOErr.Description _& vbCr & _“ (Source: “ & ADOErr.Source & “)“ & vbCr & _“ (SQL State: “ & ADOErr.SQLState & “)“ & vbCr & _“ (NativeError: “ & ADOErr.NativeError & “)“ & vbCrIf ADOErr.HelpFile = ““ ThenstrError = strError & “ No Help file available“ & vbCr & vbCrElsestrError = strError & “ (HelpFile: “ & ADOErr.HelpFile & “)“ _& vbCr & “ (HelpContext: “ & ADOErr.HelpContext & “)“ & _vbCr & vbCrEnd IfDebug.Print strErrorNextobjCon.Errors.ClearEnd Sub

ADO或odbc如何创建存储过程和表

【delphi+oracle报表解决方案(一)】delphi中调用oracle的存储过程(分带返回游标,不返回值两种)关键字: delphi ,oracle存储过程,游标,返回数据集,报表注:delphi 6+ oracle 8.1.6一.创建包与包体1.附:建表aaclass为下面作测试用create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );INSERT INTO aaclass values(’c1’, ’cn1’, 10 ) ;INSERT INTO aaclass values(’c2’, ’cn2’, 40 ) ;INSERT INTO aaclass values(’c1’, ’cn3’, 30 ) ;commit;2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1AS type rc_class is ref cursor;--求p1,p2的和与差,返回的多个值通过游标返回procedure GetSubAndSum2(p1 number,p2 number ,ResultCursor out rc_class);--查询满足条件的数据集,返回数据集通过游标返回procedure GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,p_pnumber number) ;end PKG_JCCTEST1; 3.建包体CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1ASprocedure GetSubAndSum2(p1 number,p2 number ,ResultCursor out rc_class)ISBEGINopen ResultCursor forselect p1-p2 as “sum“, p1+p2 as “sub“ from dual;END ;procedure GetClass2(a in number,ResultCursor out rc_class )isbegin open ResultCursor forselect aaclass.* from aaclass where pnumber 》a;end ;procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,p_pnumber number)isbegininsert into aaclass values(p_cid,p_cname,p_pnumber) ;-- commit;end ; 二.在delphi中利用AdoDataSet调用上述第一个存储过程1.利用AdoConnection1连接数据库(驱动为 oracle Provider for OLE DB),**并在连接字符串中加入这一节: PLSQLRSet=1; 如下所示:Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:procedure TForm1.Button1Click(Sender: TObject);varAResult , BResult : integer;beginADODataSet1.Close ;ADODataSet1.CommandType := cmdText ;ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数.ADODataSet1.CommandText := ’{call PKG_JCCTEST1.GetSubAndSum2(?,?)}’ ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,45为传入的实参值ADODataSet1.Parameters.CreateParameter(’p1’,ftinteger,pdinput,10,45);//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应ADODataSet1.Parameters.CreateParameter(’p2’,ftinteger,pdinput,10,4); //下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)ADODataSet1.Open ; //根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了 //此处的字段名根据包过程中的返回游标 对应的字段名来取//定义的存储过程返回游标如: open ResultCursor for// select p1-p2 as “sum“, p1+p2 as “sub“ from dual;//把对应的字段值取出来即可AResult := ADODataSet1.Fields.FieldByName(’sub’).Value ;BResult := ADODataSet1.Fields.FieldByName(’sum’).Value ; //显示结果showmessage(inttostr(AResult)) ;showmessage(inttostr(BResult)) ;end;三.在delphi中利用AdoDataSet调用上述第二个存储过程还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procedure TForm1.Button2Click(Sender: TObject);beginADODataSet1.Close ;ADODataSet1.CommandType := cmdText ;ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数.ADODataSet1.CommandText := ’{call PKG_JCCTEST1.GetClass2(?)}’ ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,20为传入的实参值ADODataSet1.Parameters.CreateParameter(’p1’,ftinteger,pdinput,10,20);//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)ADODataSet1.Open ; while not ADODataSet1.Eof dobeginshowmessage(’CID : ’+string(ADODataSet1.FieldByName(’CID’).Value) +’--CNAME :’ + string(ADODataSet1.FieldByName(’CNAME’).Value) +’--PNUMBER :’ + string(ADODataSet1.FieldByName(’PNUMBER’).Value)) ;ADODataSet1.Next ;end ;end; 四 利用adoquery调用第三个过程,不返回数据集的procedure TForm1.Button3Click(Sender: TObject);beginAdoQuery1.Close ;AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add(’{call PKG_JCCTEST1.GetSubAndSum2(?,?)}’) ;AdoQuery1.Parameters.CreateParameter(’P1’,ftstring,pdinput, 50,’c11’) ;AdoQuery1.Parameters.CreateParameter(’P2’,ftstring,pdinput, 50,’cn11’) ;AdoQuery1.Parameters.CreateParameter(’P3’,ftinteger,pdinput, 50,25) ; AdoQuery1.ExecSQL ;end;五 利用adoquery调用第一个过程,返回数据集的.procedure TForm1.Button4Click(Sender: TObject);beginAdoQuery1.Close ;AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add(’{call PKG_JCCTEST1.GetSubAndSum2(?,?)}’) ;AdoQuery1.Parameters.CreateParameter(’P1’,ftinteger,pdinput, 50,25) ;AdoQuery1.Parameters.CreateParameter(’P2’,ftinteger,pdinput, 50,22) ; AdoQuery1.Open ; Showmessage(string( AdoQuery1.FieldByName(’sub’).Value)+’-’+string( AdoQuery1.FieldByName(’sum’).Value));end;六.关于三层体系的此类问题两层的解决了,三层类似.中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;客户端用clientdataset ,大同小异,举例如下: begin//调用相应的过程ClientDataSet1.Close ;ClientDataSet1.Params.Clear ; ClientDataSet1.CommandText := ’{call PackageName.ProcedureName(?,?)}’ ;ClientDataSet1.Params.CreateParam(ftInteger , ’ParamName1’, ptInput) ;ClientDataSet1.Open ;end ;

数据库系统原理 什么是存储过程有什么优点

存储过程也可以看成是函数的一种, 而且存储过程中的过程如果放到了开发 系统的 D 层的时候执行效果也是相同的。 存储过程是存储在数据库中的一个程序 块, 里面包含了自己定义的一段程序来实现相应的功能,比如要选择数据库的表 里面的记录,就可以使用下面的存储过程的框架:这个实现的过程比较简单, 就是利用的是数据库自带的存储过程的模版,新 建存储过程的时候就可以非常方便的实现自己所需要的功能。 存储过程中使用的 是数据库的语言, 跟其他的高级语言的用法相似,熟练的使用数据库的语言可以 加快开发的效率,技术也是很厉害的。 存储过程的到底有什么好处呢?一定要用存储过程吗? 存储过程的优点: 1.存储过程只在创造时进行编译,以后每次执行存储过 程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过 程可提高数据库执行速度。 2.当对数据库进行复杂操作时,可将此复杂操作用 存储过程封装起来与数据库提供的事务处理结合一起使用。更多数据库的知识, 尽在南京宝云官网。 3.存储过程可以重复使用,可减少数据库开发人员的工作量 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 存储过程有利于实现一系列的操作简化,提高系统的执行效率,而且放在存 储过程中的 SQL 语句是直接在数据库中编译过了的, 系统在执行的时候就可以减 少这部分代码的资源开销。 但是对于机房重构中,有时候我们只需要更新一个记录中的某一个字段的值, 这个时候用存储过程就有点不划算了,这个时候系统如 果不用存储过程直接用 SQL 语句来说,是比较方便的。所以存储过程并不是所有 的地方用都好,凡事都有一个合适的问题,一个度的问题。 可能有的人想存储过程这么有用,而且对系统的性能有提升,那就强迫症的 都去使用存储过程。 这里又有一个问题了,存储过程的作用主要是对数据库进行 操作, 那么学过数据库系统原理的我们就需要注意一个问题了,如何防止死锁? 毫无节制的使用存储过程, 而不考虑数据库结构是不科学的。对于相同的表进行 不同的操作,所产生的结果也是不一样的,产生的顺序也是不一样的,如何在存 储过程中进行有效的操作来使系统健康强壮,这是需要注意的。 通过使用存储过程, 可以更加清晰的理解数据库和系统是如何相互关联工作 的,存储过程的使用不仅是一种技术上的提升,更是思想上的一种启发,在今后 的开发工作中是否有相同的地方需要这样的抽象封装呢。 面对更多的重复出现的 封装,我们的工作也将更加高效、简洁。

如何用VB6调用带参数带输出的存储过程

追加参数法调用存储过程  追加参数通过CreateParameter方法,用来指定属性创建新的Parameter对象。具体语法如下:Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)  ·Name 可选,字符串,代表 Parameter 对象名称。  ·Type 可选,长整型值,指定 Parameter 对象数据类型。  ·Direction 可选,长整型值,指定 Parameter 对象类型。  ·Size 可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。  ·Value 可选,变体型,指定 Parameter 对象值。  这种方法与上面一种方法的分别主要在于,追加参数的方法在向存储过程传递参数时,这种方法首先通过CreateParameter方法为存储过程创建参数,然后通过Append方法将创建的参数追加到Parameters集合中去。  仍然以存储过程doc_ProcName的调用为例,关键代码如下:Dim mRst As ADODB.Recordset ’Recordset 对象表示的是来自基本表或命令执行结果的记录全集。Dim prm As ADODB.Parameter ’Parameter 对象代表参数或与基于参数化查询或存储过程的Command 对象相关联的参数。adoconn.ConnectionString = Adodc1.ConnectionStringadoconn.OpenSet adocomm.ActiveConnection = adoconnadocomm.CommandText = doc_ProcNameadocomm.CommandType = adCmdStoredProcSet prm = adocomm.CreateParameter(parameter1, adTinyInt, adParamInput, , 1)adocomm.Parameters.Append prmSet prm = adocomm.CreateParameter(parameter2, adInteger, adParamOutput)adocomm.Parameters.Append prm


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: impending(刻不容缓的英文如何表达)

下一篇: 入团志愿书查得很严吗,入团政审严吗(两次提供虚假信息修改年龄)



推荐阅读