`
uule
  • 浏览: 6352867 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

存储过程

阅读更多

1、  存储过程是数据库管理系统的专用术语,相当与普通编程语言的函数、过程。普通过程的作用是完成特定的工作,存储过程专用于处理数据库的数据更新、查询。  
   普通工程往往有编译程序生成,存在与操作系统的特定文件中,存储过程由数据库管理系统生成存放到数据库的数据字典中。
 
   直接通过SQL语句访问数据库时,SQL语句以字符串的形式提交给服务器,服务器要经过分析、编译,然后才执行;若将SQL语句写到存储过程中,那么分析和编译是在生成存储过程时完成的,需要执行时只需要调用存储过程就可以了。
 
   如下SQL语句完成数据的更新,可以将他们写到存储过程中
   update   table1   set   column1='1',column2='2';
   update   table2   set   column1='11',column2='22';
   若将他们直接提交给服务器每一条语句都需要经过分析、编译、执行。
   将他们写入如下存储过程中(对oracle)

   create   or   replace   procedure   proc_name   is
   begin
      update   table1   set   column1='1',column2='2';
      update   table2   set   column1='11',column2='22';
   end   proc_name;
 
   需要执行更新时直接调用(exec   proc_name)存储过程proc_name。若你一次要执行很多SQL语句而且这些语句要反复执行就应该写成存储过程。  
 
2、   存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
  每个参数名前要有一个“@”符号 ,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用。

 例子:
  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这一参数输出给调用这一存储过程的程序。

 

优点:
1,减少网络带宽,按理论存储过程会提高性能.
2,无需重新编译,更改后即可运行,无需重新编译代码
3,安全性,(在传输用户名密码时,可防止注入等情况)

缺点:
1,依赖于数据库厂商,难以移植(当一个小系统发展到大系统时,对数据库的要求也会发生改变)
2,业务逻辑大的时候,封装性不够,难调试难以维护
3,复杂的应用用存储过程来实现,就把业务处理的负担压在数据库服务器上了。没有办法通过中间层来灵活分担负载和压力.均衡负载等

 

存储过程文章:

http://wangqiaowqo.iteye.com/blog/576343

http://baike.baidu.com/view/68525.htm#sub68525

 

    用java调用存储过程:

1、最简单的例子:

create  proc proc_select
    @pid varchar(20)
    @address varchar(20) output
    as
    select @address=address from userinfo where pid=@pid
    go

 

class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动
Connection con=DriverManager.getConnection("Jdbc:Odbc:test\","sa",""); //获得连接
String call="{call proc_select(?,?)};" //调用语句
CallableStatement proc=con.preparecall(call); //调用存储过程
proc.setString(1,"12345678"); //给输入参数传值
proc.registerOutParameter(2,Type.varchar); //声明输出参数是什么类型的
proc.execute(); //执行
String address=proc.getString(2); //获得输出参数

  存储过程可以有返回值,所以CallableStatement类有类似getResultSet这样的方法来获取返回值。当存储过程返回一个值时,你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么

 

例子2:

	String message = (String)this.baseDao.getHibernateTemplate().execute(
			new HibernateCallback(){
				public Object doInHibernate(Session session)  throws HibernateException, SQLException{
					Connection conn = session.connection();
					java.sql.CallableStatement cs = conn.prepareCall("{Call FareAdmin.ImportAndUpdateTariff(?)}",
							java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE, java.sql.ResultSet.CONCUR_READ_ONLY);
					cs.setString(1, loginName);
					cs.execute();
					String message = "";
					
					ResultSet rs = cs.getResultSet();
					if(rs != null) {
						while(rs.next()) {
							String msg = rs.getString(1);
							int linenumber = rs.getInt(2);
							message += "<br/> Row : " + linenumber + " " + msg + ""; 
						}
					}
					return message;
				}
			});

 

sql server 2005下:
开启xp_cmdshell的办法
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;

开启'OPENROWSET'支持的方法:
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Ad Hoc Distributed Queries',1;
RECONFIGURE;

关闭:
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure


开启'sp_oacreate'支持的方法:
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'Ole Automation Procedures',1;
RECONFIGURE;

 

 

 

charindex(@name,Ttopic)>0
判断@name在字符Ttopic中首次出现的位置,如果@name在Ttopic里存在,返回>0,否则返回0。

CHARINDEX('SQL', 'Microsoft SQL Server')
  这个函数命令将返回在“Microsoft SQL Server”中“SQL”的起始位置,在这个例子中,CHARINDEX函数将返回“S”在“Microsoft SQL Server”中的位置11。

 

 

 

2、Oracle存储过程

建立一个最简单的存储过程
create or replace procedure test_xg_p1 is
begin
dbms_output.put_line('hello world! this is the first procedure');
end;
建立一个带输入输出参数的存储过程:把输入的数据传给输出参数
create or replace procedure test_xg_p2(a in number,x out number) is
begin
x:=a;
end test_xg_p2;
建立一个逻辑判断的存储过程,并包含输入输出参数:近似分数的登记判断
create or replace procedure test_xg_p3(a in number,x out varchar2) is
begin
if a>=90 then
   begin
   x := 'A';
   end;
end if;
if a<90 then
   begin
   x:='B';
   end;
end if;
if a<80 then
   begin
   x:='C';
   end;
end if;
if a<70 then
   begin
   x:='D';
   end;
end if;
if a<60 then
   begin
   x:='E';
   end;
end if;
end test_xg_p3;
建立一个带循环逻辑的存储过程:近似累加函数
create or replace procedure test_xg_p4(a in number,x out varchar2) is
tempresult number(16);
begin
tempresult :=0;
for tempa in 0..a loop
    begin
    tempresult := tempresult + tempa;
    end;
end loop;
x:=tempresult;
end test_xg_p4;
建立一个能从数据库中特定表中返回数据的存储过程:
create or replace procedure test_xg_p5(x out varchar2) is
tempresult varchar2(1024);
begin
tempresult := 'start->';
select hotelid||hotelname into tempresult from hotel where hotelid =10041764;
x:=tempresult;
end test_xg_p5;
建立一个能使用游标的带循环的存储过程:
create or replace procedure test_xg_p6(x out varchar2) is
tempresult varchar2(10240);
cursor cursor1 is select * from hotel where hotelname like '浙江%';
begin
tempresult := 'start->';
for cursor_result in cursor1 loop
begin
tempresult :=tempresult||cursor_result.hotelid||cursor_result.hotelname;
end;
end loop;
x:=tempresult;
end test_xg_p6;

 

 

分享到:
评论

相关推荐

    SAP HANA 中调试存储过程

    SAP HANA是一个高性能的内存数据库系统,它提供了一系列功能强大的工具来进行数据分析、应用开发、存储过程编写等操作。其中,对于存储过程的调试是开发者日常开发工作中的一个重要环节,SAP HANA为存储过程提供了...

    oracle存储过程解锁

    在IT领域,尤其是在数据库管理与优化中,存储过程的解锁是一项关键技能,尤其对于Oracle数据库而言。当存储过程被锁定时,可能会影响系统的性能和稳定性,因此掌握如何解锁存储过程至关重要。以下是对“oracle存储...

    SQL存储过程试题及答案

    SQL存储过程试题及答案 SQL存储过程是数据库中的一种程序单元,能够完成特定的数据库操作。今天,我们将讨论三道关于SQL存储过程的试题,这些试题涵盖了存储过程的创建、调用和参数传递等方面。 1. 创建分数存储...

    pb调用存储过程

    在IT行业中,数据库操作是日常开发中的重要环节,而存储过程是数据库中一种高效、封装性强的预编译语句集合。本问题涉及到的是在PowerBuilder(简称Pb)环境中如何调用Oracle或SQL Server等数据库中的存储过程。以下...

    db2 存储过程语法与实例

    DB2存储过程是一种在数据库管理系统中预编译的SQL代码集合,它允许开发人员封装复杂的业务逻辑和数据处理操作,并可以被多次调用。DB2作为一款强大的关系型数据库管理系统,其存储过程功能强大,提高了应用程序的...

    pl sql developer调试存储过程及调试包中创建的存储过程

    PL/SQL Developer 调试存储过程及调试包中创建的存储过程 PL/SQL Developer 调试存储过程是指使用 PL/SQL Developer 工具来调试 Oracle 数据库中的存储过程。调试存储过程可以帮助开发者快速地定位和解决存储过程...

    存储过程的优点

    ### 存储过程的优点 #### 一、提升执行效率 1. **编译优势**:存储过程在创建时仅编译一次,之后每次执行时都无需再次编译。相比之下,一般的SQL语句每次执行都需要重新编译。这种差异使得存储过程能够显著提高...

    mysql存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元,从而提高数据处理的效率和代码的复用性。本教程将深入探讨MySQL存储过程的创建、调用以及相关概念...

    SQL Server存储过程

    **SQL Server 存储过程详解** SQL Server 存储过程是一种预编译的数据库对象,它集合了一系列的SQL语句和控制流语句,用于执行特定的数据库操作。存储过程的作用在于提高数据库的性能和安全性,减少网络流量,提供...

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    MySQL存储过程的异常处理方法

    在MySQL中,存储过程是一种预编译的SQL代码集合,它可以执行复杂的操作并提供更好的性能。在编写存储过程时,异常处理是确保程序稳定性和健壮性的重要环节。本实例展示了如何在MySQL存储过程中实现异常处理,以捕获...

    用友r9知识存储过程

    《用友R9知识存储过程详解》 在IT行业中,特别是在企业级财务系统中,数据库的高效管理和数据处理是至关重要的。用友R9作为一款先进的财务管理系统,它利用存储过程这一强大的数据库功能来优化账务处理,提高系统...

    学习sql存储过程的心得

    SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,它们被预先编译并存储在数据库中,可以通过一个名称来调用执行。学习SQL存储过程是提升数据库管理和应用开发效率的关键步骤,它可以帮助我们更好...

    创建存储过程,触发器

    在数据库管理中,存储过程和触发器是两个重要的概念,它们极大地增强了数据库的功能和效率。存储过程是一组预先编写的SQL语句,可以被多次调用,减少了网络流量,提高了性能,并提供了更好的安全性。而触发器则是一...

    Informatica调用存储过程图文流程

    Informatica调用存储过程图文流程 Informatica 是一款功能强大的数据集成工具,能够帮助用户快速、可靠地集成各种数据源。调用存储过程是 Informatica 中的一种常用功能,下面将详细介绍 Informatica 调用存储过程...

    存储过程文档--mysql

    存储过程文档--MySQL 存储过程是 MySQL 中的一个强大功能,它允许用户预先将常用的或复杂的工作写入 SQL 语句,并将其存储起来,以便在以后的数据库操作中可以快速调用和执行。存储过程可以提高数据库的执行速度,...

Global site tag (gtag.js) - Google Analytics