讲解Sybase存储过程的建立和使用

Sybase系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。可见Sybase的功能性是很好的,本文将主要围绕Sybase的存储讲起。

存储过程的特点

  Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务。存储过程由SQL语句和流程控制语句组成。它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。

存储过程的性能特点如下:

  1.   存储过程是预编译过的,这就意味着它与普通的SQL语句或批处理的SQL语句不同,当***运行一个存储过程时,SQL Server的查询处理器对其进行分析,在排除了语法错误之后形成存储在系统中的可执行方案。由于查询处理的大部分工作已经完成,所以存储过程执行速度很快。
  2.   存储过程和待处理的数据都放在同一台运行SQL Server的计算机上,使用存储过程查询当地的数据,效率自然很高。
  3.   存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。
  4.   存储过程还有着如同C语言子函数那样的被调用和返回值的方便特性。

  所以,存储过程大大增强了SQL语言的功能、效率和灵活性。掌握和应用好存储过程,对进一步发挥Sybase数据库系统的强大功能有着重要的意义。

存储过程的语法规则

建立存储过程的语法规则为:

  CREATE PROCedure[owner.]procedurename[;number]
  [[(]@parameter_name datatype[=default][OUTput]
  [,@parameter_name datatype[=default][OUTput]]…[)]]
  [WITH RECOMPILE]
  AS SQL_statements

使用存储过程的语法规则为:

  [EXECute][@return-status=]
  [[[server.]database.]owner.]procedurename[;number]
  [[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]
  [,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]…]]
  [WITH RECOMPILE]

[page]下面简要介绍这两个命令的常用选项以及建立和使用存储过程的要点,关于选项的更为详细的说明请参考有关手册。

  1.   [[[server.]database.]owner.]procedure_name:存储过程的名字。
  2.   @parameter_name datatype[=default][OUTput]:形式参数(形参)的名称、类型。df ault是赋予的缺省值(可选),OUTput指定本参数为输出参数(可选)。形参是存储过程中的自变量,可以有多个,名字必须以@打头,最长30个字符。
  3.   SQL_statements:定义存储过程功能的SQL语句。
  4.   @return_status:接受存储过程返回状态值的变量。
  5.   [@parameter_name=]value:实际参数(实参),@parameter_name为实参的名称(可选)。如果某个实参以@parameter_name=value提供,那么随后的实参也都要采用这一形式提供。
  6.   [@parameter_name=]@varialbe[OUTput]:将变量@varialbe中的值作为实参传递给形参@parameter_name(可选),如果变量@varialbe是用来接受返回的参数值,则选项OUTput不可缺少。

存储过程的建立和使用,我们将通过几个例子进行介绍。

  假设有一个用下述语句生成的技能工资表RS-LS-GZ-JiNeng:

  create table RS_LS_GZ_JiNeng     /*技能工资表*/

  (GeRen_id char(4),         /*个人代码 */

  RiQi smalldatetime,         /*执行日期 */

  YuanYin_id char(1) null,       /*变动原因代码 */

  JinE smallmoney)           /*技能工资金额 */

  该表存储着某单位员工多年来技能工资的历史档案。

#p#

例1.如果要查询全体员工的技能工资变动历史,则可先建立一个存储过程p-RsGz-JiNeg-All:

  create procedure p_RsGz_JiNeng_All as
  select *
  from RS_LS_GZ_JiNeng
  order by GeRenid,RiQi

  然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:

  execute p_RsGz_JiNeng_All

  本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。

 

例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:

  create procedure p_RsGz_JiNeng @c_GeRenId char(4)
  as
  select *from RS_LS_GZ_JiNeng
  where GeRen_id=@c_GeRenId
  order by RiQi

  之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:

  declare @GeRenId char(4)

  select @GeRenId=”0135″ /*设要查询员工的个人代码为”0135″ */

  execute p_RsGz_JeNeng @c_GeRenId=@GeRenId

  存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量。在调用该过程的批处理中,既可以用具体的值也可以用变量作为实参。用变量作实参(如本例)时,必须用del are语句加以说明。值得注意的是,在批处理的调用过程语句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。

例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:

  create procedure p_RsGz_JiNeng_Slt
  (@c_GeRenId char(4),@sm_JinE smallmoney output)
  as
  select @sm_JinE=JinE
  from RS_LS_GZ_JiNeng
  where RiQi=(select max(RiQi)
  from RS_LS_GZ_JiNeng

  where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/

  调用存储过程p_RsGz_JiNeng_Slt进行查询:

  declare @GeRenId char(4),@JinE smallmoney
  select @GeRenid=”0135″/*设要查询员工的个人代码为”0135″*/
  select @JinE=0
  execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output

  这里,变量 @JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则,变量@JinE将得不到形参传回的数值而始终为零(等于初值)。

 

例4.查到了个人代码为”0135″员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。

  create procedure p_RsGz_JiNeng_Rtn
  @c_GeRenId char(4)
  as
  declare @ErrCode smallint
  select @ErrCode=0
  if exists(select* from RS-LS-GZ-JiNeng
  where GeRenid=@c-GeRenId)
  begin
  select *
  from RS_LS_GZ_JiNeng
  whrer GeRen_id=@c_GeRenId
  order by RiQi
  return @ErrCodE
  end
  eslE
  begin
  select @ErrCode=1
  return @ErrCodE
  end

  调用存储过程p_RsGz_JiNeng_Rtn:

  declare @GeRenId char(4),@RtnCode smallint
  select @GeRenId=”0135″
  select @RtnCode=0
  execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId
  if @RtnCode=1
  print”No this one!”

  存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为”查无此人”,返回出错状态值1。否则,返回成功状态值0。

  调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息”No this one!”。[page]

小结

  上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。

  虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。

上文中就Sybase存储过程的建立和使用作出了详细的介绍,同时,为了更利于大家理解,就通过实例的分析介绍给大家讲述Sybase的存储的建立和使用,希望对大家能够有所帮助。

【编辑推荐】

  1. 一个存储过程实现增删操作
  2. Sybase数据库复制服务器三大特性详析
  3. Sybase数据库复制服务器的市场状况
  4. PB开发Sybase数据库应用技巧集锦

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/266286.html<

(0)
管理的头像管理
上一篇2025-05-05 21:35
下一篇 2025-05-05 21:36

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注