「java储存过程」java如何调用存储过程

博主:adminadmin 2022-12-14 19:09:08 69

今天给各位分享java储存过程的知识,其中也会对java如何调用存储过程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何创建Java存储过程

1、操作系统:windows 2000 Server

2、数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版

3、安装路径:C:\ORACLE

实现方法:

1、  创建一个文件为TEST.java

public class TEST

{

public static void main (String args[])

{

System.out.PRintln("HELLO THIS iS A JAVA PROCEDURE");

}

}

2、  javac TEST.java

3、  java TEST

4、  SQL conn system/manager

SQL grant create any Directory to scott;

SQL conn scott/tiger

SQL create or replace directory test_dir as 'd:\'

目录已创建。

SQL create or replace java class using bfile(test_dir,'TEST.CLASS')

2 /

Java 已创建。

SQL select object_name,object_type,STATUS from user_objects;

SQL create or replace procedure test_java

as language java

name 'TEST.main(java.lang.String[])';

/

过程已创建。

SQL set serveroutput on size 5000

SQL call dbms_java.set_output(5000);

调用完成。

SQL execute test_java;

HELLO THIS iS A JAVA PROCEDURE

PL/SQL 过程已成功完成。

SQL call test_java();

HELLO THIS iS A JAVA PROCEDURE

调用完成。

Java中是如何调用存储过程的?

//存储过程create or replace Procedure countBySal(

p_sal emp.sal%type,

p_count OUT number

)as

begin

select count(*) into p_count from emp where sal = p_sql;

end countBySal; //调用步奏import java.sql.CallableStatement; //带哦用存储过程所必须的语句借口

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.Types;public class EmpUtil {

public static int countBySal(double sal) throws Exception{

Class.forName("oracle.jdbc.driver.OracleDriver");

String url="jdbc:oracle:thin:@localhost:1521:test";

Connection cn=DriverManager.getConnection(url, "scott", "tiger");

String sql="{call countBySal(?,?)}";//调用存储过程的语句,call后面的就是存储过程名和需要传入的参数

CallableStatement cst=cn.prepareCall(sql);

cst.setDouble(1, sal);//设置in参数的值

cst.registerOutParameter(2, Types.INTEGER);//注册out参数的类型

cst.execute();

int result = cst.getInt(2);

cst.close();

cn.close();

return result;

}

public static void main(String[] args) {

int count;

try {

count = EmpUtil.countBySal(3000);

System.out.println("工资在3000元以上的人数为:"+count);

} catch (Exception e) {

e.printStackTrace();

}

}

}

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 }

java中怎么用存储过程啊?

对已储存过程的调用是CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。结果参数是一种输出(OUT)参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。问号将用作参数的占位符。在JDBC中调用已储存过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并非语法的组成部份。 {call过程名[(?,?,...)]} 返回结果参数的过程的语法为: {?=call过程名[(?,?,...)]} 不带参数的已储存过程的语法类似: {call过程名} 通常,创建CallableStatement对象的人应当知道所用的DBMS是支持已储存过程的,并且知道这些过程都是些什么。然而,如果需要检查,多种DatabaseMetaData方法都可以提供这样的信息。例如,如果DBMS支持已储存过程的调用,则supportsStoredProcedures方法将返回true,而getProcedures方法将返回对已储存过程的描述。 CallableStatement继承Statement的方法(它们用于处理一般的SQL语句),还继承了PreparedStatement的方法(它们用于处理IN参)。 CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分:注册OUT参数的JDBC类型(一般SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为JDBCNULL。 JDBC存储过程1、创建CallableStatement对象 CallableStatement对象是用Connection方法prepareCall创建的。下例创建CallableStatement的实例,其中含有对已储存过程getTestData调用。该过程有两个变量,但不含结果参数:CallableStatementc stmt=con.prepareCall("{callgetTestData(?,?)}");其中?占位符为IN、OUT还是INOUT参数,取决于已储存过程getTestData。 JDBC存储过程2、IN和OUT参数 将IN参数传给CallableStatement对象是通过setXXX方法完成的。该方法继承自PreparedStatement。所传入参数的类型决定了所用的setXXX方法(例如,用setFloat来传入float值等)。如果已储存过程返回OUT参数,则在执行CallableStatement对象以前必须先注册每个OUT参数的JDBC类型(这是必需的,因为某些DBMS要求JDBC类型)。注册JDBC类型是用registerOutParameter方法来完成的。语句执行完后,CallableStatement的getXXX方法将取回参数值。正确的getXXX方法是为各参数所注册的JDBC类型所对应的Java类型。换言之,registerOutParameter使用的是JDBC类型(因此它与数据库返回的JDBC类型匹配),而getXXX将之转换为Java类型。 作为示例,下述代码先注册OUT参数,执行由cstmt所调用的已储存过程,然后检索在OUT参数中返回的值。方法getByte从第一个OUT参数中取出一个Java字节,而getBigDecimal从第二个OUT参数中取出一个BigDecimal对象(小数点后面带三位数): CallableStatementc stmt=con.prepareCall("{callgetTestData(?,?)}"); cstmt.registerOutParameter(1,java.sql.Types.TINYINT); cstmt.registerOutParameter(2,java.sql.Types.DECIMAL,3); cstmt.executeQuery(); byte x=cstmt.getByte(1); java.math.BigDecimaln=cstmt.getBigDecimal(2,3); CallableStatement与ResultSet不同,它不提供用增量方式检索大OUT值的特殊机制。JDBC存储过程3、INOUT参数 既支持输入又接受输出的参数(INOUT参数)除了调用registerOutParameter方法外,还要求调用适当的setXXX方法(该方法是从PreparedStatement继承来的)。setXXX方法将参数值设置为输入参数,而registerOutParameter方法将它的JDBC类型注册为输出参数。setXXX方法提供一个Java值,而驱动程序先把这个值转换为JDBC值,然后将它送到数据库中。这种IN值的JDBC类型和提供给registerOutParameter方法的JDBC类型应该相同。然后,要检索输出值,就要用对应的getXXX方法。例如,Java类型为byte的参数应该使用方法setByte来赋输入值。应该给registerOutParameter提供类型为TINYINT的JDBC类型,同时应使用getByte来检索输出值。 下例假设有一个已储存过程reviseTotal,其唯一参数是INOUT参数。方法setByte把此参数设为25,驱动程序将把它作为JDBCTINYINT类型送到数据库中。接着,registerOutParameter将该参数注册为JDBCTINYINT。执行完该已储存过程后,将返回一个新的JDBCTINYINT值。方法getByte将把这个新值作为Javabyte类型检索。 CallableStatementc stmt=con.prepareCall("{callreviseTotal(?)}"); cstmt.setByte(1,25); cstmt.registerOutParameter(1,java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x=cstmt.getByte(1); 1)返回一个结果集(ResultSet)。2)返回一个特定的值。 下面来详细的说明。 1)返回一个结果集(ResultSet),这种类似通常的处理结果集如果事先就有一个类似如下的procedure CREATE PROCEDURE getShipQuantity @jsid int ASSELECT jf_js_id,SUM(jf_ship_quantity) AS shipqty FROM tjobsheet_finish f WHERE (jf_js_id=@jsid)GROUP BY jf_js_id 那么我们将通过如下的代码来调用 String sql = "{ call getShipQuantity(?) }";Connection con = conn.connection();ResultSet rs = null;BigDecimal shipQuantity = new BigDecimal(0);try{ CallableStatement cs = con.prepareCall(sql); cs.setInt(1,jsoId);//设置输入参数 rs = cs.executeQuery();//返回结果集 if(rs.next()){ shipQuantity = new BigDecimal(rs.getDouble(2)); } logger.debug("shipQuantity --------------------- "+shipQuantity);}catch(Exception e){ logger.debug(e);}2)返回一个特定的值。也就是说,在procedure的定义中已经用output输出参数了。请看下面的proceduercreate procedure getSingleWgt @@singleWgt numeric(8,3) output,@jsnum varchar(11) = '0000-0480'asdeclare @stwgt numeric(8,3)select @stwgt = sum(b.stwgt)from js as ainner join jsactdtl as b on a.jsnum = b.jsnumwhere a.completion = 1 and b.stflag = 22and a.jsnum = @jsnumselect @@singleWgt = (@stwgt/orderedqty) from js where jsnum = @jsnum那么我们将通过如下的代码来调用String sql = "{ call getSingleWgt(?,?) }";Connection con = getSession().connection();//得到connectiontry{ CallableStatement cs = con.prepareCall(sql);//通过它来执行sql cs.registerOutParameter(1,java.sql.Types.FLOAT);//注册输出参数 cs.setString(2,shipment.getJsnum());//指出输入参数 if(cs.execute()){//执行 float output = cs.getFloat(1);//返回值 }}catch(Exception e){logger.debug(e);}

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();

关于java储存过程和java如何调用存储过程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-14,除非注明,否则均为首码项目网原创文章,转载请注明出处。