sql存储过程 简析 (二)

2014-11-24 09:49:23 · 作者: · 浏览: 2
金.总金额,

  总金额=订金*订数,临时表放在存储过程中

  代码如下:

  Create proc temp_sale

  as

  select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金as总金额

  into #temptable from Product a inner join Order_ b on a.产品编号=b.产品编号

  if @@error=0

  print 'Good'

  else

  &n bsp; print 'Fail'

  go

六、编写对数据库访问的存储过程:

  数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。

  利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下:

  CREATE PROC[EDURE] procedure_name [;number]

  [

  {@parameter data_type} ][VARYING] [= default] [OUTPUT]

  ]

  [,...n]

  [WITH 

  {

  RECOMPILE 

  | ENCRYPTION 

  | RECOMPILE, ENCRYPTION

  }

  ]

  [FOR REPLICATION]

  AS

  sql_statement [...n]

  [ ]内的内容是可选项,而()内的内容是必选项,

  例:若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为:

  Create Proc select_del As 

  Delete tmp 

  例:用户想查询tmp表中某年的数据的存储过程

  create proc select_query @year int as

  select * from tmp where year=@year

  在这里@year是存储过程的参数

  例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。

  空:表示该结点为顶层结点

  fjdid(父结点编号) 

  结点n 非空:表示该结点的父亲结点号

  dwmc(单位名称)

  CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output

  as 

  declare @stop int

  declare @result varchar(80)

  declare @dwmc varchar(80)

  declare @dwid int

  set nocount on

  set @stop=1

  set @dwmc=""

  select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold 

  set @result=rtrim(@dwmc)

  if @dwid=0 

  set @stop=0

  while (@stop=1) and (@dwid<>0)

  begin

  set @dwidold=@dwid

  select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold

  if @@rowcount=0 

  set @dwmc=""

  else

  set @result=@dwmc+@result

  if (@dwid=0) or (@@rowcount=0) 

  set @stop=0

  else

  continue

  end

  set @dwmcresult=rtrim(@result)

  使用exec pro-name [pram1 pram2.....]

七、在SQL Server中执行存储过程:

  sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。

  在SQL Server的查询分析器中,输入以下代码:

  declare @tot_amt int

  execute order_tot_amt 1,@tot_amt output

  select @tot_amt

  以上代码是执行order_tot_amt这一存储过程,以计算出定单编号为1的定单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果。

  存储过程具有以下特点:

  1.具有立即访问数据库的能力;

  2.是数据库服务器端的执行代码,在服务器执行操作时,减少网络通讯,提高执行效率。

  3.保证数据库安全,自动完成提前设定的作业。

八、存储过程的缺点

  1:调试麻烦,但是用PL/SQL Developer 调试很方便!弥补这个缺点。

  2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

  3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

  4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的。维护起来更加麻烦!

]九、存储过程中临时表的创建问题

  (针对SQL2000/2OO5)

  可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。

  本地临时表的名称前面有一个编号符(#table_name),而全局临时表的名称前面有两个编号符(##table_name)。

  SQL 语句使用CREATE TABLE 语句中为table_name 指定的名称引用临时表:

  CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

  INSERT INTO #MyTempTable VALUES (1)

  如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追加一个数字后缀。存储在tempdb 数据库的sysobjects 表中的临时表,其全名由CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的表名table_name 不能超过116 个字符。

  除非使用DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:

  当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。

  所有其它本地临时表在当前会话结束时自动除去。

  全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的Transact-SQL 语句完成后,将自动除去此表

摘自 浩子的程序员之路