什么事java中的存储过程,数据库存储过程是什么
大家好,关于什么事java中的存储过程很多朋友都还不太明白,今天小编就来为大家分享关于数据库存储过程是什么的知识,希望对各位有所帮助!
java编程中怎样调用存储过程
JDBC调用存储过程: CallableStatement
在Java里面调用存储过程,写法那是相当的固定:
Class.forName(....
Connection conn= DriverManager.getConnection(....
/**
*p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替
*其余地方写法固定
*/
CallableStatement cstmt= conn.prepareCall("{call p(?,?,?,?)}");
/**
*告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定
*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的
*Types后面具体写什么类型,得看你的存储过程参数怎么定义的
*/
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
/**
*在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出
*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5
*没设第3个,因为它是输出参数
*/
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
//执行
cstmt.execute();
//把第3个参数的值当成int类型拿出来
int three= cstmt.getInt(3);
System.out.println(three);
//把第4个参数的值当成int类型拿出来
int four= cstmt.getInt(4);
System.out.println(four);
//用完别忘给人家关了,后开的先关
cstmt.close();
conn.close();
JDBC调用存储过程,掌握这一个程序足够了.
以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.
create or replace procedure p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a> v_b) then
v_ret:= v_a;
else
v_ret:= v_b;
end if;
v_temp:= v_temp+ 1;
end;
数据库存储过程是什么
问题一:sql数据库中的存储过程该怎么理解有什么用啊?存储过程是SQL语句和流程控制语句的预编译***,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
问题二:数据库中什么是存储过程?作用是什么?存储过程,就是带有名字的一个程序块。
存储,是指这个程序块创建了之后,是存储在数据库内部的,然后我们可以在自己写的程序中通过某种手段去调用这段程序,然后这段程序就会做一件事,做什么事?我们定义存储过程的时候怎么写的,它到时候就做什么;
过程,就是程序块,说白了就是一段程序。
存储过程,创建完成之后,就存储在数据库内部了,数据库帮你记着,存储过程创建的时候都有一个名字,将来你在你的程序当中,通过某种方式(不同编程语言有不同的方式),一般来讲通过这个名字,去调用存储过程,就像使用一个方法或者函数一样,它就去做一件事!
不同的数据库的存储过程,都是用当前自己这个数据库的编程语言来编写的,比如Oracle的PL/SQL编程,等等。
自己写一个就明白了,语法不用我多说了吧?
问题三:什么叫作数据库的存储过程?存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同SQL语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。存储过程的优点 1.存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL语句和程序代码语句的分离,可以提高程序代码的可读性。 3.存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:(1)系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。(2)扩展存储过程以XP_开头,用来调用操作系统提供的功能exec master..xp_cmdshell'ping 10.8.16.1'(3)用户自定义的存储过程,这是我们所指的存储过程常用格式模版:Create procedure procedue_name [@parameter data_type][output][with]{repile|encryption} as sql_statement解释:output:表示此参数是可传回的 with{repile|encryption} repile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。
问题四:数据库中存储过程有什么主要作用,或都说它的主要用途?存储过程的概念
存储过程(Stored Procedure)是一组预先编绎好的Transact-SQL语句。将其放在服务器上,由用户通过指定存储过程的名字来执行它。存储过程可以作为一个独立的数据库对象,也可以作为一个单元被用户的应用程序调用。存储过程可以接收和输出参数,返回执行存储过程的状态值,还可以嵌套调用。
存储过程同其他编程语言中的过程(Procedure)类似,主要体现在以下几个方面:
(1)存储过程可以接收参数,并以接收参数的形式返回多个参数给调用存储过程和批处理。
(2)包含执行数据库操作的编程语句,也可以调用其他的存储过程。
(3)向调用过程或批处理返回状态值,以反映存储过程的执行情况。
注意:存储过程跟函数不同,存储过程不能在被调用的位置上返回数据,也不能被应用在语句当中,例如不可以用类似“@Proc=存储过程名”的方式使用存储过程。但是,存储过程可以使用变量的形式来返回参数。
存储过程的优点表现在以下几个方面:
(1)执行速度快
存储过程在创建时就经过了语法检查和性能优化,因此在执行时不必再重复这些步骤。存储过程在第一次调用后,就驻留在内存中,不必再经过编译和优化,所以执行速度很快。在有大量批处理的Transact-SQL语句要重复执行的时候,使用存储过程可以极大地提高运行效率。
(2)模块化程序设计
只需创建存储过程一次,并将其存储在数据库中,可以在程序中多次调用该存储过程。用户可以独立于应用程序而对存储过程进行修改。
(3)减少网络通信量
存储过程中可以包含大量的Transact-SQL语句。在进行调用时,只需要使用一条语句就可以实现,而不需要在网络中发送数百行代码。
(4)保证系统的安全性
可以设置用户通过存储过程来对某些关键数据进行访问,但不允许用户直接使用Transact-SQL语句或企业管理器来对数据进行访问。
问题五:数据库存储过程和函数的区别函数分两种,表值函数跟标量函数
表值函数最后要返回一个表变量,而标量函数最后要返回一个标量值
存储过程即一组批处理,可以返回或不返回值,仅仅是执行其内部的全部语句
函数可以与一般sql语句一同编写,而存储过程不可以,需要单独执行
问题六:数据库编辑存储过程是什么意思一般来说,程序员都希望编写出来的程序能有最大化的应变能力,存储过程的最大作用是可以降低代码维护的工作量,很多需求的变化不用修改代码进而发布程序,而只需要调整一下存储过程即可实现
例如你打算开发一个报表,该报表会对数据库的数据进行一定程度的加工,然后再呈现给用户,那么你的实现方法有两个
1.使用代码调用SQL,取到基础数据后,在程序代盯里面进行加工,并呈现给用户
2.也可以编写一段存储过程,该存储过程先取基础数据,然后在存储过程里面进行数据加工,最后把最终的结果一次性的反馈给程序代码,程序代码只需要把执行完存储过程的结果呈现给用户即可
这两个方法都可以实现你想实现的功能,但是如果万一有一天需求变化了,用户需要呈现的结果中增加或者减少了部分内容,那么第一个方法就只能修改代码了,而第二个方法只需要调整存储过程即可实现
问题七:在SQL中存储过程的一般语法是什么? sql server存储过程语法
存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。
定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个:
第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。
第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。
第三、有利于SQL语句的重用。
在ASP中,一般通过mand对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类:
1.只返回单一记录集的存储过程
假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明):
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
begin
select* from dbo.[userinfo]
end
go
以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过mand对象调用该存储过程的ASP代码如下:
'**通过mand对象调用存储过程**
DIM Mym,MyRst
Set Mym= Server.CreateObject(ADODB.mand)
Mym.ActiveConnection= MyConStr'MyConStr是数据库连接字串
Mym.mandText= getUserList'指定存储过程名
Mym.mandType= 4'表明这是一个存储过程
Mym.Prepared= true'要求将SQL命令先行编译
Set MyRst= Mym.Execute
Set Mym= Nothing
存储哗程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。
在以上代码中,mandType属性表明请求的类型,取值及说明如下:
-1表明mandText参数的类型无法确定
1表明mandText是一般的命令类型
2表明mandText参数是一个存在的表名称
4表明mandText参数是一个存储过程的名称
还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下:
'**通过Connection对象调用存储过程**
DIM MyConn,MyRst
Set MyConn= Server.CreateObject(&qu......>>
问题八:T-SQL和存储过程有什么区别 20分区别T-SQL是语言,存储过程是数据库一种对象
T-SQL即 Transact-SQL,是 SQL在 Microsoft SQL Server上的增强版,它是用来让应用程式与 SQL Server沟通的主要语言。
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。
?存储过程的概念
存储过程Procedure是一组为了完成特定功能的SQL语句***,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。
问题九:数据库存储过程怎么调用存储过程在存储过程里用exec执行另一存储过程名及它需要的参数就可以了
如 exec abc'1','2'(abc是存储过程的名字,'1','2'是它的参数)
Java数据库程序中的存储过程设计
本文阐述了怎么使用DBMS存储过程阐述了使用存储过程的基本的和高级特性比如返回ResultSet本文假设你对DBMS和JDBC已经非常熟悉也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言)但是并不要求你有任何存储过程的编程经历
存储过程是指保存在数据库并在数据库端执行的程序你可以使用特殊的语法在Java类中调用存储过程在调用时存储过程的名称及指定的参数通过JDBC连接发送给DBMS执行存储过程并通过连接(如果有)返回结果
使用存储过程拥有和使用基于EJB或CORBA这样的应用服务器一样的好处区别是存储过程可以从很多流行的DBMS中免费使用而应用服务器大都非常昂贵这并不只是许可证费用的问题使用应用服务器所需要花费的管理编写代码的费用以及客户程序所增加的复杂性都可以通过DBMS中的存储过程所整个地替代
你可以使用Java Python Perl或C编写存储过程但是通常使用你的DBMS所指定的特定语言 Oracle使用PL/SQL PostgreSQL使用pl/pgsql DB使用Procedural SQL这些语言都非常相似在它们之间移植存储过程并不比在Sun的EJB规范不同实现版本之间移植Session Bean困难并且存储过程是为嵌入SQL所设计这使得它们比Java或C等语言更加友好地方式表达数据库的机制
因为存储过程运行在DBMS自身这可以帮助减少应用程序中的等待时间不是在Java代码中执行个或个SQL语句而只需要在服务器端执行个存储过程网络上的数据往返次数的减少可以戏剧性地优化性能
使用存储过程
简单的老的JDBC通过CallableStatement类支持存储过程的调用该类实际上是PreparedStatement的一个子类假设我们有一个poets数据库数据库中有一个设置诗人逝世年龄的存储过程下面是对老酒鬼Dylan Thomas(old soak Dylan Thomas不指定是否有关典故文化请批评指正译注)进行调用的详细代码
try{int age=;String poetName= dylan thomas;CallableStatement proc= connection prepareCall({ call set_death_age(??)});proc setString( poetName);proc setInt( age);cs execute();}catch(SQLException e){//}
传给prepareCall方法的字串是存储过程调用的书写规范它指定了存储过程的名称?代表了你需要指定的参数
和JDBC集成是存储过程的一个很大的便利为了从应用中调用存储过程不需要存根(stub)类或者配置文件除了你的DBMS的JDBC驱动程序外什么也不需要
当这段代码执行时数据库的存储过程就被调用我们没有去获取结果因为该存储过程并不返回结果执行成功或失败将通过例外得知失败可能意味着调用存储过程时的失败(比如提供的一个参数的类型不正确)或者一个应用程序的失败(比如抛出一个例外指示在poets数据库中并不存在 Dylan Thomas)
结合SQL操作与存储过程
映射Java对象到SQL表中的行相当简单但是通常需要执行几个SQL语句可能是一个SELECT查找ID然后一个INSERT插入指定ID的数据在高度规格化(符合更高的范式译注)的数据库模式中可能需要多个表的更新因此需要更多的语句 Java代码会很快地膨胀每一个语句的网络开销也迅速增加
将这些SQL语句转移到一个存储过程中将大大简化代码仅涉及一次网络调用所有关联的SQL操作都可以在数据库内部发生并且存储过程语言例如PL/SQL允许使用SQL语法这比Java代码更加自然下面是我们早期的存储过程使用Oracle的PL/SQL语言编写
create procedure set_death_age(poet VARCHAR poet_age NUMBER)poet_id NUMBER;beginSELECT id INTO poet_id FROM poets WHERE name= poet;INSERT INTO deaths(mort_id age) VALUES(poet_id poet_age);end set_death_age;
很独特?不我打赌你一定期待看到一个poets表上的UPDATE这也暗示了使用存储过程实现是多么容易的一件事情 set_death_age几乎可以肯定是一个很烂的实现我们应该在poets表中添加一列来存储逝世年龄 Java代码中并不关心数据库模式是怎么实现的因为它仅调用存储过程我们以后可以改变数据库模式以提高性能但是我们不必修改我们代码
下面是调用上面存储过程的Java代码
public static void setDeathAge(Poet dyingBard int age)throws SQLException{Connection con= null;CallableStatement proc= null;
try{con= connectionPool getConnection();proc= con prepareCall({ call set_death_age(??)});proc setString( dyingBard getName());proc setInt( age);proc execute();}finally{try{proc close();}catch(SQLException e){}con close();}}
为了确保可维护性建议使用像这儿这样的static方法这也使得调用存储过程的代码集中在一个简单的模版代码中如果你用到许多存储过程就会发现仅需要拷贝粘贴就可以创建新的方法因为代码的模版化甚至也可以通过脚本自动生产调用存储过程的代码
Functions
存储过程可以有返回值所以CallableStatement类有类似getResultSet这样的方法来获取返回值当存储过程返回一个值时你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么你也必须调整存储过程调用来指示该过程返回一个值
下面接着上面的例子这次我们查询Dylan Thomas逝世时的年龄这次的存储过程使用PostgreSQL的pl/pgsql
create function snuffed_it_when(VARCHAR) returns integer declarepoet_id NUMBER;poet_age NUMBER;begin first get the id associated with the poet SELECT id INTO poet_id FROM poets WHERE name=$; get and return the age SELECT age INTO poet_age FROM deaths WHERE mort_id= poet_id;return age;end; language pl/pgsql;
另外注意pl/pgsql参数名通过Unix和DOS脚本的$n语法引用同时也注意嵌入的注释这是和Java代码相比的另一个优越性在Java中写这样的注释当然是可以的但是看起来很凌乱并且和SQL语句脱节必须嵌入到Java String中
下面是调用这个存储过程的Java代码
connection setAutoCommit(false);CallableStatement proc=connection prepareCall({?= call snuffed_it_when(?)});proc registerOutParameter( Types INTEGER);proc setString( poetName);cs execute();int age= proc getInt();
如果指定了错误的返回值类型会怎样?那么当调用存储过程时将抛出一个RuntimeException正如你在ResultSet操作中使用了一个错误的类型所碰到的一样
复杂的返回值
关于存储过程的知识很多人好像就熟悉我们所讨论的这些如果这是存储过程的全部功能那么存储过程就不是其它远程执行机制的替换方案了存储过程的功能比这强大得多
当你执行一个SQL查询时 DBMS创建一个叫做cursor(游标)的数据库对象用于在返回结果中迭代每一行 ResultSet是当前时间点的游标的一个表示这就是为什么没有缓存或者特定数据库的支持你只能在ResultSet中向前移动
某些DBMS允许从存储过程中返回游标的一个引用 JDBC并不支持这个功能但是Oracle PostgreSQL和DB的JDBC驱动器都支持在ResultSet上打开到游标的指针(pointer)
设想列出所有没有活到退休年龄的诗人下面是完成这个功能的存储过程返回一个打开的游标同样也使用PostgreSQL的pl/pgsql语言
create procedure list_early_deaths() return refcursor as declaretoesup refcursor;beginopen toesup forSELECT poets name deaths ageFROM poets deaths all entries in deaths are for poets but the table might bee generic WHERE poets id= deaths mort_idAND deaths age<;return toesup;end; language plpgsql;
下面是调用该存储过程的Java方法将结果输出到PrintWriter
PrintWriter:
static void sendEarlyDeaths(PrintWriter out){Connection con= null;CallableStatement toesUp= null;try{con= ConnectionPool getConnection();
// PostgreSQL needs a transaction to do this con setAutoCommit(false);
// Setup the call CallableStatement toesUp= connection prepareCall({?= call list_early_deaths()});toesUp registerOutParameter( Types OTHER);getResults execute();
ResultSet rs=(ResultSet) getResults getObject();while(rs next()){String name= rs getString();int age= rs getInt();out println(name+ was+ age+ years old);}rs close();}catch(SQLException e){// We should protect these calls toesUp close();con close();}}
因为JDBC并不直接支持从存储过程中返回游标我们使用Types OTHER来指示存储过程的返回类型然后调用getObject()方法并对返回值进行强制类型转换
这个调用存储过程的Java方法是mapping的一个好例子 Mapping是对一个集上的操作进行抽象的方法不是在这个过程上返回一个集我们可以把操作传送进去执行本例中操作就是把ResultSet打印到一个输出流这是一个值得举例的很常用的例子下面是调用同一个存储过程的另外一个方法实现
public class ProcessPoetDeaths{public abstract void sendDeath(String name int age);}
static void mapEarlyDeaths(ProcessPoetDeaths mapper){Connection con= null;CallableStatement toesUp= null;try{con= ConnectionPool getConnection();con setAutoCommit(false);
CallableStatement toesUp= connection prepareCall({?= call list_early_deaths()});toesUp registerOutParameter( Types OTHER);getResults execute();
ResultSet rs=(ResultSet) getResults getObject();while(rs next()){String name= rs getString();int age= rs getInt();mapper sendDeath(name age);}rs close();}catch(SQLException e){// We should protect these calls toesUp close();con close();}}
这允许在ResultSet数据上执行任意的处理而不需要改变或者复制获取ResultSet的方法
static void sendEarlyDeaths(final PrintWriter out){ProcessPoetDeaths myMapper= new ProcessPoetDeaths(){public void sendDeath(String name int age){out println(name+ was+ age+ years old);}};mapEarlyDeaths(myMapper);}
这个方法使用ProcessPoetDeaths的一个匿名实例调用mapEarlyDeaths该实例拥有sendDeath方法的一个实现和我们上面的例子一样的方式把结果写入到输出流当然这个技巧并不是存储过程特有的但是和存储过程中返回的ResultSet结合使用是一个非常强大的工具
结论
存储过程可以帮助你在代码中分离逻辑这基本上总是有益的这个分离的好处有
快速创建应用使用和应用一起改变和改善的数据库模式
数据库模式可以在以后改变而不影响Java对象当我们完成应用后可以重新设计更好的模式
存储过程通过更好的SQL嵌入使得复杂的SQL更容易理解
编写存储过程比在Java中编写嵌入的SQL拥有更好的工具——大部分编辑器都提供语法高亮!
存储过程可以在任何SQL命令行中测试这使得调试更加容易
并不是所有的数据库都支持存储过程但是存在许多很棒的实现包括免费/开源的和非免费的所以移植并不是一个问题 Oracle PostgreSQL和DB都有类似的存储过程语言并且有在线的社区很好地支持
存储过程工具很多有像TOAD或TORA这样的编辑器调试器和IDE提供了编写维护PL/SQL或pl/pgsql的强大的环境
lishixinzhi/Article/program/Java/hx/201311/25906END,本文到此结束,如果可以帮助到大家,还望关注本站哦!