java中如何调用数据库的存储过程

java中如何调用数据库的存储过程

本文目录

  • java中如何调用数据库的存储过程
  • prepareCall和prepareStatement有什么区别
  • java怎么和数据库连接
  • JDBC使用步骤过程
  • js怎样调用存储过程
  • plsql自定义函数 不需要返回值怎样写
  • java如何调用oracle函数
  • java里面怎么调用存储过程

java中如何调用数据库的存储过程


Java调用存储过程的方法是通过调用Connection的实例方法prepareCall,prepareCall方法返回CallableStatement对象用于填充存储过程的参数。prepareCall方法形参是调用存储过程的sql语句,此参数的语法格式如下:

{call storedProcedureName(parameter-list)}

其中,storedProcedureName是存储过程名称,parameter-list是存储过程参数列表。

例如,存储过程名为usp_test,有两个输入参数a,b。则调用代码看起来如下所示:

CallableStatement callableStatement = connection.prepareCall(“{call usp_test(?,?)}“);
callableStatement.setObject(“a“,“value-1“);
callableStatement.setObject(“b“,“value-2“);
callableStatement.execute();

prepareCall和prepareStatement有什么区别


通常来说createStatement方法用于简单的SQL语句(不带参数)、prepareStatement方法用于带一个或多个IN参数的SQL语句或经常执行的简单SQL语句,而prepareCall方法用于调用已储存过程。

java怎么和数据库连接


使用java连接MySQL数据库与其他的数据库连接核心是一样的,如果说区别,那就是所需的驱动不一样。

工具/原料

MySQL、JDK

方法/步骤

1、首先需要安装好JDK(配置环境变量),如图所示:

2、其次要安装好MySQL数据库,可以使用可视化Navicar For MySQL,如图所示:

3、最后通过代码进行连接。

(1)确定连接路径URL:

String url=“jdbc:mysql://localhost(可以是本机IP地址):3306(端口号)/mysqltest(数据库名称)?“+“user=用户账号&password=用户密码&useUnicode=字符编码“;

(2)加载驱动:

Class.forName(“com.mysql.jdbc.Driver“);

(3)连接,获取Connection对象

Connection conn=DriverManager.getConnection(url)

(4)可以通过conn对象检验连接与否。


JDBC使用步骤过程


JDBC操作数据库的基本步骤:

1、加载JDBC驱动程序

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。成功加载后,会将Driver类的实例注册到DriverManager类中。

2、提供JDBC连接的URL。

连接URL定义了连接数据库时的协议、子协议、数据源标识。

书写形式:协议:子协议:数据源标识。

3、创建数据库的连接。

要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。

使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。

4、创建一个Statement,要执行SQL语句,必须获得java.sql.Statement实例。

Statement实例分为以下3 种类型

(1)执行静态SQL语句。通常通过Statement实例实现。

(2)执行动态SQL语句。通常通过PreparedStatement实例实现。

(3)执行数据库存储过程。通常通过CallableStatement实例实现。

5、执行SQL语句。

Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute

6、处理两种情况的结果。

(1)执行更新返回的是本次操作影响到的记录数。

(2)执行查询返回的结果是一个ResultSet对象。

ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。

使用结果集(ResultSet)对象的访问方法获取数据。

7、关闭JDBC对象(关闭结果集--》关闭数据库操作对象--》关闭连接)。

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反:

(1)关闭记录集。

(2)关闭声明。

(3)关闭连接对象。

扩展资料:

一、JDBC(Java DataBase Connectivity,java数据库连接)

是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

二、特性

Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。而 JDBC 正是作为此种用途的机制。

三、用途

简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。

参考资料来源:百度百科-JDBC


js怎样调用存储过程


JDBC调用存储过程:CallableStatement 在Java里面调用存储过程,写法那是相当的固定: Class.forName(.... Connectionconn=DriverManager.getConnection(.... /** *p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替 *其余地方写法固定 */ CallableStatementcstmt=conn.prepareCall(“{callp(?,?,?,?)}“); /** *告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定 *下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的 *Types后面具体写什么类型,得看你的存储过程参数怎么定义的 */ cstmt.registerOutParameter(3,Types.INTEGER); cstmt.registerOutParameter(4,Types.INTEGER); /** *p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替 *其余地方写法固定 */ CallableStatementcstmt=conn.prepareCall(“{callp(?,?,?,?)}“); /** *在我这里第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类型拿出来 intthree=cstmt.getInt(3); System.out.println(three); //把第4个参数的值当成int类型拿出来 intfour=cstmt.getInt(4); System.out.println(four); //用完别忘给人家关了,后开的先关 cstmt.close(); conn.close(); JDBC调用存储过程,掌握这一个程序足够了. 以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的. createorreplaceprocedurep (v_ainnumber,v_bnumber,v_retoutnumber,v_tempinoutnumber) is begin if(v_a》v_b)then v_ret:=v_a; else v_ret:=v_b; endif; v_temp:=v_temp 1; end;

plsql自定义函数 不需要返回值怎样写


游标变量
通过游标,我们可以取得返回结果集(往往是select语句查询的结果集)中的任何一行数据,从而提高共享的效率。
参照变量ref cursor使用:
定义游标:
1.定义一个游标类型:
Type自定义游标名 is ref cursor; 2.定义一个游标变量: 变量名 自定义游标名;
打开游标:
Open 游标变量 for select语句;
取出当前游标指向的行:
Fetch 游标变量  into 其他变量;
判断游标是否指向记录最后:
游标变量%notfound; 关闭游标: Close 游标名。

案例:
1. 请使用pl/sql编写一个过程,可以输入部门号,并显示该部门所有员工的姓名和
工资。
create or replace procedure pro1(in_deptno number)is

type htf_cursor is ref cursor; --定义一个变量
        test_cursor htf_cursor; --定义两个变量
        v_ename emp.ename%type;         v_sal emp.sal%type; begin
--执行语句
open test_cursor for select ename,sal from emp where deptno=in_deptno; --取出游标指向的每行数据,用循环语句 loop
--这句话会引起游标向下走
fetch test_cursor into v_ename, v_sal; --判断当前游标是否指向最后
exit when   test_cursor %notfound; --输出
 dbms_output.put_line(’用户名’||v_ename||’,薪水’||v_sal); end loop;
close test_cursor; end;
begin pro1(10);end;
 
2. 如果某个部门员工的工资低于2000,就增加100元。
create or replace procedure pro1(in_deptno number)is
type htf_cursor is ref cursor;
            test_cursor htf_cursor;             v_empno emp.empno%type;             v_ename emp.ename%type;             v_sal emp.sal%type; begin
--打开游标
open test_cursor for select empno, ename, sal from emp where deptno = in_deptno;
--取出用游标指向的每行数据,用循环语句 loop
fetch test_cursor into  v_empno, v_ename, v_sal;--游标下移一位 --判断当前游标是否走到最后
exit when test_cursor%notfound; if
                  v_sal《2000 then
update emp set sal = sal+100 where empno = v_empno;

end if; end loop; end; 
begin pro1(10);end;
 
pl/sql 函数
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须包含return语句返回的数据。我们可以使用create function来建立函数,实际案例:
建立函数的基本语法:
create function 函数名(参数1,...) return 数据类型 is  定义变量; begin
 执行语句; end; / 
函数调用的基本语法: 第一种

第二种:
var 变量名 变量类型
call 函数名(参数值,...) into :变量名; print 变量名 第三种:
select 函数名(参数,...) from dual;

 案例:请编写一个函数,可以接收用户名并返回该用户的年薪。 create function inName_outSal(v_in_name varchar2) return number is
 v_annual_sal number; begin
 select (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=v_in_name;  return v_annual_sal; end; / 
函数和过程的区别:
1、函数必须有返回值,而过程可以没有; 2、函数和过程在java中调用的方式不一样;
java中调用oracle函数可以在select语句中直接调用,如:select 自定义的函数名(参数) from 表;
过程则是使用CallableStatement完成调用。 
Java调用函数方式: package com.test;
import java.sql.ResultSet; import java.sql.SQLException; public class TestFunction {
 //如何在java中调用自己编写的函数
 public static void main(String args) {
  String sql=“select inName_outSal(’KING’) annual from dual“;   ResultSet rs=SQLHelper.executeQuery(sql, null);   try {
   if(rs.next()){
    System.out.println(rs.getDouble(“annual“));//此处可以用数字或别名接收返回值    }
  } catch (SQLException e) {    e.printStackTrace();   }finally{
   if(rs!=null){     try {
     rs.close();
    } catch (SQLException e) {      e.printStackTrace();     }    }
   rs=null;   }  }

Java调用过程方式: package com.test; 
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; public class TestProcedure {
 //调用oracle中update_sal存储过程
 public static void main(String args) {   Connection ct=null;
  CallableStatement cs=null;   try {
   //加载驱动
   Class.forName(“oracle.jdbc.driver.OracleDriver“);    //得到连接  
 ct=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:orcl“,“scott“, “tiger“);
   //创建CallableStatement接口引用对象
   cs=ct.prepareCall(“{call update_sal(?,?)}“);    //给?赋值
   cs.setString(1, “BOSS“);    cs.setFloat(2, 8888f);    //执行我们的语句    cs.execute();    //提交
   ct.commit();
  } catch (Exception e) {    e.printStackTrace();   }finally{    try {
    if(cs!=null){      cs.close();     }
    if(ct!=null){      ct.close();     }
   } catch (Exception e2) {     e2.printStackTrace();    }
   cs=null;    ct=null;   }

 } } 
pl/sql知识--包(扩张了解,自己看)
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。 1、我们可以使用create package命令来创建包: 建包基本语法:
create [or replace] package 包名 is
 procedure 过程名(变量名 变量类型,...);
 function 函数名(变量名 变量类型,...) return 数据类型; end; /
包的规范:只包含了过程和函数的说明,但是没有过程和函数的实现代码。 包体:用于实现包规范的过程和函数。 
请编写一个包,该包有一个过程,该过程可以接收用户名和新的薪水。(将来用于通过用户去更新薪水)还有一个函数,该函数可以接收一个用户名(将来要实现得到该用户的年薪是多少)
create package emp_package is
 procedure update_sal(v_in_ename varchar2,v_in_newsal number);  function inName_outSal(v_in_name varchar2) return number; end;
2、建立包体可以使用create package body 命令 建立包体基本语法:
create or replace package body 包名 is
 procedure 过程名(变量名 变量类型,...) is   --声明变量;  begin
  --执行语句;  exception
 when 异常名 then   --异常处理;  end;
 function 函数名(变量名 变量类型,...)  return 数据类型 is   --声明变量;  begin
  --执行语句;  end; end; / 
案例:请实现前面定义的包中的过程和函数。

gin
  select (sal+nvl(comm,0))*13 into v_annual_sal from emp where  
ename=v_in_name;
  return v_annual_sal;  end; end; / 
细节说明:
1、包体中要现实的函数或过程,应当在包规范中声明;
2、在调用包中的某个函数或过程的时候,需要使用对应的方法才可以调用。 3、如何调用包的过程或函数
当调用包的过程或是函数时,在过程和函数前需要带有包名,如果要访问其它方案的包,还需要在包名前加方案名。 调用基本方法:
exec 方案名.包名.过程名(参数,...); call 方案名.包名.函数名(参数,...);
也可以直接用select 方案名.包名.函数名(参数,...) from dual;


java如何调用oracle函数


调用数据库里的一个函数

一个函数本质上一个返回一个结果的存储过程,这个例子示范了怎么调用有in、out和in/out参数的函数

***********************************/

CallableStatement cs;

try {

// 调用一个没有参数的函数; 函数返回 a VARCHAR

// 预处理callable语句

cs = connection.prepareCall(“{? = call myfunc}“);
// 注册返回值类型

cs.registerOutParameter(1, i);
// Execute and retrieve the returned value

cs.execute();

String retValue = cs.getString(1);
// 调用有一个in参数的函数; the function returns a VARCHAR

cs = connection.prepareCall(“{? = call myfuncin(?)}“);
// Register the type of the return value

cs.registerOutParameter(1, Types.VARCHAR);
// Set the value for the IN parameter

cs.setString(2, “a string“);
// Execute and retrieve the returned value

cs.execute();

retValue = cs.getString(1);
// 调用有一个out参数的函数; the function returns a VARCHAR

cs = connection.prepareCall(“{? = call myfuncout(?)}“);
// Register the types of the return value and OUT parameter

cs.registerOutParameter(1, Types.VARCHAR);

cs.registerOutParameter(2, Types.VARCHAR);
// Execute and retrieve the returned values

cs.execute();

retValue = cs.getString(1); // return value

String outParam = cs.getString(2); // OUT parameter
// 调用有一个in/out参数的函数; the function returns a VARCHAR

cs = connection.prepareCall(“{? = call myfuncinout(?)}“);
// Register the types of the return value and OUT parameter

cs.registerOutParameter(1, Types.VARCHAR);

cs.registerOutParameter(2, Types.VARCHAR);
// Set the value for the IN/OUT parameter

cs.setString(2, “a string“);
// Execute and retrieve the returned values

cs.execute();

retValue = cs.getString(1); // return value

outParam = cs.getString(2); // IN/OUT parameter

} catch (SQLException e) {

}

java里面怎么调用存储过程


最近做一个自动发邮件的schedule,由于取数据的sql太长,直接分割很麻烦,就想到调用PL/SQL,网上查了资料做了练习,在此做下小结。
1、只有输入参数而没有返回结果的存储过程。
sql:
1 create or replace procedure prc_1(deptno in number,dname in varchar2,loc in varchar2)
2 is
3 begin
4 insert into dept values(deptno,dname,loc);
5 end prc_1;
java:
1 static void test1(){
2 Connection conn=null;
3 CallableStatement csmt=null;
4 try {
5 conn=JDBCUtils.getConnection();
6 conn.setAutoCommit(false);
7 csmt=conn.prepareCall(“call prc_1(?,?,?)“);
8 csmt.setInt(1,80);
9 csmt.setString(2,“ioc“);
10 csmt.setString(3,“fhp“);
11 csmt.execute();
12 conn.commit();
13 System.out.println(“success insert data“);
14 } catch (SQLException e) {
15 e.printStackTrace();
16 }
17 }
2、有输入参数且有一个返回值的存储过程。
sql:
1 create or replace procedure prc_2(p_deptno in number,p_loc out varchar2) is
2 begin
3 select loc into p_loc from dept where deptno=p_deptno;
4 end prc_2;
java:
1 static void test2(){
2 Connection conn=null;
3 CallableStatement csmt=null;
4 try {
5 conn=JDBCUtils.getConnection();
6 conn.setAutoCommit(false);
7 csmt=conn.prepareCall(“call prc_2(?,?)“);
8 csmt.setInt(1,70);
9 csmt.registerOutParameter(2,Types.VARCHAR);
10 csmt.execute();
11 conn.commit();
12 System.out.println(“MIS位置:“+csmt.getString(2));
13 } catch (SQLException e) {
14 e.printStackTrace();
15 }
16 }
3、返回多行记录(游标)的存储过程。
sql:
首先要建立一个返回游标,以便接收返回结果。
1 create or replace package testpackage is
2 type test_cursor is ref cursor;
3 end testpackage;
4
5 create or replace procedure prc_3(p_cursor out testpackage.test_cursor)is
6 begin
7 open p_cursor for
8 select * from dept order by deptno;
9 end prc_3;
java:
1 static void test3(){
2 Connection conn=null;
3 CallableStatement csmt=null;
4 ResultSet rs=null;
5 try {
6 conn=JDBCUtils.getConnection();
7 conn.setAutoCommit(false);
8 csmt=conn.prepareCall(“call prc_3(?)“);
9 csmt.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
10 csmt.execute();
11 rs=(ResultSet) csmt.getObject(1);
12 while(rs.next()){
13 System.out.println(rs.getString(“deptno“)+’\t’+rs.getString(“dname“)+’\t’+rs.getString(“loc“));
14 }
15 } catch (SQLException e) {
16 // TODO Auto-generated catch block
17 e.printStackTrace();
18 }finally{
19 JDBCUtils.free(rs, csmt, conn);
20 }
21 }

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部