存储过程通信
1. 怎样理解存储过程可以降低网络的通信量
比较复杂的操作过程,比如购买一件物品
程序从数据服务器查询用户信息 ->
程序判断用户是否有足够的余额 ->
程序->数据服务器,写入购买物品
程序->数据服务器, 减少用户余额
如果用存储过程的话通信过程就只有一步
程序提交购买物品到数据服务器(存储过程查询用户信息,判断余额,写入数据,返回执行结果)
把部分复杂的业务逻辑交给存储过程处理,就能减少客户端和数据服务器之间来回传输数据的次数。
2. 简单说说存储过程与触发器的概念与作用
存储过程就是一个sql的程序集 可以包含多个SQL语句 并可以附带各种逻辑判断及处理
触发器 就类似于程序里的事件触发
只是这里通常是某个字段的改变 某个表插入了数据 或者删除某些数据
以上这些处理引发的另外一些表数据的改变
3. 数据库中存储过程有什么作用
第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。
第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。
第四:存储过程主要是在服务器上运行,减少对客户机的压力。
第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。
第六:存储过程可以在单个存储过程中执行一系列 SQL 语句。
第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
其实存储过程还可以控制权限,比如一个表不直接允许用户直接访问,但要求允许用户访问和修改其中一个或多个字段,那就可以通过一个存储过程来实现并允许该用户使用该存储过程。
还有,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。
4. 后台运行一个主存储过程,主存储过程通过管道同前端过程通信的例子
beginmaxpro为提交主存储过程起动的程序maxpro 为主存储过程readmaxpro 为主存佳话使用ORACLE中的DBMS_PIPE管道能力 注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以在sqlpus用设定set serveroutput ON 进行测试通过 @testmaxpro sql 创始程序包测试过程如下SQL> call beginmaxpro();JOB= 调用完成 SQL> call readmaxpro();maxpro 的当前进行状态为 调用完成 SQL>*/ 建立状态表create table mytest(mystatus integer);delete from mytest;INSERT INTO MYTEST(MYSTATUS) VALUES( );mit;/ 不可重用的存储过程 并且处理过程通过管道给ORACEL内的存储过程通信 使用ORACLE中的DBMS_PIPE管道能力 注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以 首先 create table mytest(mystatus integer); INSERT INTO MYTEST(MYSTATUS) VALUES( ); CREATE OR REPLACE PROCEDURE maxpro(P_NEXTDATE IN OUT DATE) ASCREATE OR REPLACE PROCEDURE maxpro AS n integer; status NUMBER;BEGIN 取当前状态 SELECT mystatus INTO N FROM MYTEST; DBMS_OUTPUT PUT_LINE( n= || n); IF N= THEN DBMS_OUTPUT PUT_LINE( 过程不可重入 ); RETURN; END IF; 过程调用lock UPDATE MYTEST SET MYSTATUS= ;MIT; 通过DBMS_LOCK SLEEP( ); 模拟大的处理过程 过程处理一段时间后就将一些信息放入管道FOR N IN LOOP DBMS_PIPE PURGE( maxpro ); 清除原管道信息 DBMS_PIPE PACK_MESSAGE(N); 把信息放入缓冲区 status:=DBMS_PIPE SEND_MESSAGE( maxpro ); 信息放入管道mypipe 系统等待时间为 秒 最大长度 DBMS_LOCK SLEEP( ); END LOOP; 过程调用unlock DBMS_PIPE PURGE( maxpro ); 清除原管道信息 DBMS_PIPE PACK_MESSAGE( ); 把信息放入缓冲区 表示过程完成 信息放入管道mypipe 系统等待时间为 秒 最大长度 原长度为 现在设为 是担心长度不足出错 status:=DBMS_PIPE SEND_MESSAGE( maxpro ); UPDATE MYTEST SET MYSTATUS= ;DBMS_OUTPUT PUT_LINE( 过程处理完成 );MIT; P_NEXTDATE:=NULL;END maxpro;//*对于maxpro存储过程的状态进行读取的过程 主要使用读取管道的方法*/CREATE OR REPLACE PROCEDURE readmaxpro AS n integer;status integer;begin 接受等待时间为 秒 可以为 立即调用或DBMS_PIPE RECEIVE_MESSAGE( mypipe ) 等待 天 status:= DBMS_PIPE RECEIVE_MESSAGE( maxpro ); status为 为成功可以UNPACK_MESSAGE 为超时没有数据 为信息太大 为内部错误 IF status <> THEN SELECT mystatus INTO N FROM MYTEST; IF N= THEN DBMS_OUTPUT PUT_LINE( maxpro 过程没有起动 ); ELSE DBMS_OUTPUT PUT_LINE( maxpro 过程起动 但管道中现在没有信息返回 ); END IF; return; END IF; DBMS_PIPE UNPACK_MESSAGE(n); DBMS_OUTPUT PUT_LINE( maxpro 的当前进行状态为 || n);end; 起动maxpro为后台进程的存储过程/CREATE OR REPLACE PROCEDURE beginmaxpro ASJOB BINARY_INTEGER;BEGIN DBMS_JOB SUBMIT(JOB maxpro; sysdate sysdate+( /( * * )) TRUE); DBMS_JOB SUBMIT(JOB maxpro; sysdate sysdate+( /( * * )) ); 提交做业 秒后执行 注意设定实例ini文件中的job_queue_interval = DBMS_JOB SUBMIT(JOB maxpro; sysdate NULL FALSE); DBMS_JOB SUBMIT(JOB maxpro; sysdate+( /( * * )) NULL FALSE); DBMS_OUTPUT PUT_LINE( JOB= || JOB); MIT;end;/ lishixin/Article/program/Oracle/201311/16828
5. 什么是存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。所以效率会高 一 存储过程介绍 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化 后存储在数据库服务器中,使用时只要调用即可。在ORACLE中,若干个 有联系的过程可以组合在一起构成程序包。 使用存储过程有以下的优点: * 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可 以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。 * 可保证数据的安全性和完整性。 # 通过存储过程可以使没有权限的用户在控制之下间接地存取数据 库,从而保证数据的安全。 # 通过存储过程可以使相关的动作在一起发生,从而可以维护数据 库的完整性。 * 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出 了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执 行。 * 可以降低网络的通信量。 * 使体现企业规则的运算程序放入数据库服务器中,以便: # 集中控制。 # 当企业规则发生变化时在服务器中改变存储过程即可,无须修改 任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运 算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序 工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可 以了,应用程序无须任何变化。 不同数据库存储过程的写法不一,在后面的讲座中将分别介绍ORACLE 和SYBASE存储过程的用法。 二 ORACLE 的存储过程 ORACLE 创建存储过程的语法为: create [or replace] procere 过程名 参数1 [in|out|in out] 数据类型 [,参数2 [in|out|in out] 数据类型]... pl/sql 语句 下面举例说明ORACLE数据库存储过程的写法和用法。 可以建立一个存储过程,每当用户修改数据库的重要数据时,即把 用户的用户名、掌诤筒僮骼嘈图锹枷吕矗?nbsp; create procere update_log is begin insert into update_log_tab(use_name,update_date,operation) values(user,sysdate,'update' end; 可以在恰当的位置调用这个存储过程来记录用户对表的修改。例如下面在 表sal_comm上建立一个修改触发器,每当用户修改此表后,用户的名称、修改 时间和操作即被记录在了表update_log_tab中: create trigger audit_update after update on sal_comm for each row begin update_log end --三 Sybase的存储过程 尽管Sybase存储过程的功能和写法与ORACLE类似,但他们之间还是 有一定的差别。下面讲述SYBASE的存储过程。 SYBASE可以用CREATE PROCere命令生成存储过程: CREATE PROCere 存储过程名 [;number] [[(] @parameter_name datatype [=default] [OUTput] [, @parameter_name datatype [=default] [OUTput]]...[)]] [WITH RECOMPILE] AS SQL_statements 下面是一个查询作者编码、名称和生日的存储过程: create proc p_auths @author_code varchar(10) as select author_code, name, birthdate from auths where author_code=@author_code 下面执行过程p_auths: p_auths @author_code=A00001 在CREATE PROC语句中,可以为参数赋缺省值,该值可以是任何常量。 当用户不提供参数值时,该值便作为参数值提供给过程。
6. 存储过程是什么意思
存储过程(stored procere)是一组预先编译好的transcat-sql代码,由于是已经编译好的代码,所以执行的时候不必再次进行编译,从而提高了程序的运行效率.存储过程跟函数不同,存储过程不能在被调用的位置上返回数据,也不能被应用在语句当中.但是存储过程可以使用变量的形式来返回参数.存储过程具有执行速度快、模块化的程序设计、减少网络通信量、保证系统安全性等优点。使用存储过程的好处很大,存储过程比在ASP脚本中运行SQL命令效率更高;可以提高整体性能并减轻网络负载(减少了在网络服务器和数据服务器之间的交互);可以优化ASP代码和增强代码灵活性等等。
7. 使用存储过程有哪些优点
对于操作员来讲,存储过程简化了操作员的操作,进程定时调用,可以让系统自动进行定时化、批量化的操作,减少了操作员的工作量。
而且存储过程中可以增加一些日志处理,便于操作员对数据的跟踪。
8. 什么是存储过程
定义:
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?
Microsoft公司为什么还要添加这个技术呢?
那么存储过程与一般的SQL语句有什么区别呢?
存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,
如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储过程,这是我们所指的存储过程
常用格式
Create procere procee_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
如:
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52
实例1:查询表Book的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book
实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi 控件开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go
存储过程的3种传回值:
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中
实例3:设有两个表为Proct,Order,其表内容如下:
Proct
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Proct a inner join Order b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
&n bsp; print 'Fail'
go
存储过程介绍
一、先介绍一下什么是存储过程
存储过程是利用SQL Server所提供的Tranact-SQL语言所编写的程序。Tranact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix-4GL语言一样。这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:
1)、变量说明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程控制命令(if…else…、while….)
4)、内部函数
二、存储过程的书写格
CREATE PROCEDURE [拥有者.]存储过程名[;程序编号]
[(参数#1,…参数#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数
(SQL Server 7.0以上版本),参数的使用方法如下:
@参数名 数据类型 [VARYING] [=内定值] [OUTPUT]
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。
[=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。
例子:
CREATE PROCEDURE order_tot_amt @o_id int,@p_tot int output AS
SELECT @p_tot = sum(Unitprice*Quantity)
FROM orderdetails
WHERE ordered=@o_id
例子说明:
该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id),由定单明细表(orderdetails)中计算该定单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序
三、在SQL Server中执行存储过程
在SQL Server的查询分析器中,输入以下代码:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt
以上代码是执行order_tot_amt这一存储过程,以计算出定单编号为1的定单销售金额,我们定义@tot_amt为输出参数,用来承接我们所要的结果
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化 后存储在数据库服务器中,使用时只要调用即可。在ORACLE中,若干个 有联系的过程可以组合在一起构成程序包。
使用存储过程有以下的优点:
* 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可 以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。
* 可保证数据的安全性和完整性。
# 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
# 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
* 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出 了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执 行。
* 可以降低网络的通信量。
* 使体现企业规则的运算程序放入数据库服务器中,以便:
# 集中控制。
# 当企业规则发生变化时在服务器中改变存储过程即可,无须修改 任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运 算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序 工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可 以了,应用程序无须任何变化。
9. 关于存储过程的疑问!!求帮助!!
首先,存储过程在执行的时候不需要预编译,就速度上来说占优势
另外,存储过程相当于开发中的封装,内部的查询逻辑对于程序来说是不需要知道的,这样在你的数据结构或者查询逻辑有改动的时候,不会影响到程序这点是非常好的
再者,在很多查询中我们需要连接很多表或者变量或者其它的时候,我们用存储过程可以将临时表,变量等锁定在存储过程中,它们的生命周期仅存在于存储过程的执行期内不会影响到其它的应用
其它好处有很多,不一一列举了。。
前台调用的话要看开发工具了,工具不同执行方式不同
在SQL的查询分析器中可以直接调用
例如:exec procName 参数,参数(注意字符串或者时间都要加'',例如:'1988-12-14','参数1')
如果有不明白的地方可以给我留言