如何使用 JDBC 调用存储在c 调用数据库函数中的函数或存

Java中调用存储过程或函数
1.调用函数
& & &CallableStatement cs=con.prepareCall(&{?=call get_pname(?,?,?)}&);
& & &第一个?表示返回的值,后面的?可以是输入参数,也可以是输出参数。
& & &第一个?是返回参数,所以必须有语句:
& & &connection.registerOutParameter(1, Types.VARCHAR);(Types.varchar是类型)
& & &后面的?如果是输出参数,应该也加上registerOutParameter语句:&
& & &connection.registerOutParameter(2, Types.VARCHAR);(2是第2个占位符,Types.varchar是类型)
& & &最后打印输出的结果:
& & &System.out.println(cs.getString(1)); (1是对应输出参数,第一个输出参数)
& 2.调用存储过程
& & &CallableStatement cs=con.prepareCall(&{call stu_pro(?,?,?)}&);(与函数的区别是:没有?=)
& & &java程序中要打印调用过程获得的值,需调用有输出参数的存储过程,用法和调用函数一样。
& 3.简单例子
package com.dgy. &
import java.sql.CallableS &
import java.sql.C &
import java.sql.DriverM &
import java.sql.SQLE &
import java.sql.T &
public class Pro { &
& & &* 连接&
& & public static Connection getConnection(){ &
& & & & &Connection con = &
& & & & &try { &
& & & & & & Class.forName(&oracle.jdbc.driver.OracleDriver&); &
& & & & & & String url = &jdbc:oracle:thin:@PC-:1521:dgy&; &
& & & & & & String user = &dwj&; &
& & & & & & String pwd = &dwj&; & & & & &&
& & & & & & con = DriverManager.getConnection(url,user,pwd); &
& & & & } catch (ClassNotFoundException e) { &
& & & & & & e.printStackTrace(); &
& & & & } catch (SQLException e) { &
& & & & & & e.printStackTrace(); &
& & & & } &
& & public static void main(String[] args) throws SQLException { &
& & & & &//System.out.println(OraclePro.getConnection()); & & & &&
& & & & Connection con=OraclePro.getConnection(); &
& & & & CallableStatement cs=con.prepareCall(&{?=call get_pname}&);//没有参数的函数 &
& & & & cs.registerOutParameter(1, Types.VARCHAR);//第一个占位为输出,类型是varchar &
& & & & cs.execute(); & & & & & & & & &//不能忘记execute() &
& & & & System.out.println(cs.getString(1)); //打印输出结果,对应registerOutParameter &
//有1个输入参数的函数 & & & & &
CallableStatement cs=con.prepareCall(&{?=call get_pname1(?)}&); &
cs.registerOutParameter(1, Types.VARCHAR); &
cs.setLong(2,25); & & &//输入参数是25 &
cs.execute(); &
//有1个输出参数的函数 & & &
CallableStatement cs=con.prepareCall(&{?=call get_pname2(?)}&); &
cs.registerOutParameter(1, Types.VARCHAR); &
cs.registerOutParameter(2, Types.VARCHAR); &
cs.execute(); &
System.out.println(cs.getString(1)); &
System.out.println(cs.getString(2)); &
//上面两个结果一样,因为两个意思是一样的 &
//1个输入参数,1个输出参数 & & & & &
CallableStatement cs=con.prepareCall(&{?=call get_pname3(?,?)}&); &
//第1个是返回值,第2个是输入参数,第3个是输出参数 & & & & &
cs.registerOutParameter(1, Types.VARCHAR); &
cs.setLong(2, 25); & & &
cs.registerOutParameter(3, Types.VARCHAR); & & & & &
cs.execute(); &
System.out.println(cs.getString(1)); &
System.out.println(cs.getString(3)); &
调用存储过程与调用函数的方法一样,就只是con.prepareCall(&{call &procedure(?,?)}&)没有?=。java中调用数据库中的存储过程和函数
public static void main(String[] args)
&Connection conn =getConnection(url,user,
&System.out.println("数据连接成功");
&CallableStatement cs=
&//调用数据库中的存储过程
conn.prepareCall("{call
pro_deleteproducttype(?,?)}");//pro_deleteproducttype是//要调用的存储过程的名字,第一个参数是整形输入参数,第二个参数是输出参数
& //设置存储过程的输入参数
&cs.setInt(1, 24);
&//设置存储过程返回值类型,并执行
&cs.registerOutParameter(2,
java.sql.Types.VARCHAR);
&cs.execute();
&//接收返回值,并打印
&String str = cs.getString(2);
&System.out.println(str);
//调用数据库函数
& &cs1 = conn.prepareCall("{?=call&fun_str()}");&//其中 fun_str()&是函数名,?是返回值的占位符
cs1.registerOutParameter(1,
java.sql.Types.VARCHAR);&
&cs1.execute();&
string1=cs1.getString(1);&
&System.out.println(“函数调用的结果是:”+string1);
&catch (SQLException e)
&// TODO Auto-generated catch block
&e.printStackTrace();
&{//关闭所有连接
&closeAll(conn, cs, null);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客分类:
博客分类:
Java jdbc调用Oracle数据库存储过程
一、了解CallableStatement接口
1.callablestatement接口提供了两种调用形式
{?= call &procedure-name&[(&arg1&,&arg2&, ...)]}
//包含结果参数的调用形式
如:函数(funciton)
{call &procedure-name&[(&arg1&,&arg2&, ...)]}
//不包含结果参数的调用形式
如:存储过程(procedure)
2.callablestatement接口提供的方法
void registerOutParameter(int parameterIndex, int sqlType)
throws SQLE
registerOutParameter接口中有四个该方法的重载实现,具体的可以查看源码了解
setXXX(int parameterIndex,XXX x)
getXXX(int x)
3.callablestatement接口产生的异常提示
如下源码:
void registerOutParameter(int parameterIndex, int sqlType)
当我们使用registerOutParameter方法设置输出参数类型的时候,需要注意对于某一些类型是不能够
进行设置的如上中所以提到的类型都会引发SQLFeatureNotSupportedException异常,对于能够支持
的类型可以查看java.sql.Types和oracle.jdbc.OracleTypes
如下源码:
当我们在给过程设置参数信息的时候,不能够同时使用下标和名称来指定对应参数的。
二、具体的Java代码实现
package org.viancent.call.
import java.sql.CallableS
import java.sql.C
import java.sql.DriverM
import java.sql.ResultS
import java.sql.SQLE
import java.sql.T
import com.sun.corba.se.spi.orbutil.fsm.Guard.R
import oracle.jdbc.OracleT
@SuppressWarnings("unused")
public class CallProcedure {
private static Connection conn = null;
private static CallableStatement cs = null;
private static ResultSet rs = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@0.0.0.0:1521:orcl", "scott", "tiger");
} catch (Exception e) {
e.printStackTrace();
public void callProcedureY(Connection conn) throws Exception
cs = conn.prepareCall("{call updateName(?,?)}");
cs.setInt(1, 7499);
cs.setString(2, "www");
cs.execute();
public void callProcedure(Connection conn) throws Exception
cs = conn.prepareCall("{call insertLine}");
cs.execute();
public void callProcedureYY(Connection conn) throws Exception
cs = conn.prepareCall("{call deleteLine(?,?)}");
cs.setInt(1, 7839);
cs.registerOutParameter(2, OracleTypes.NUMBER);
cs.execute();
System.out.println(cs.getString(2));
public void callProcedureYYL(Connection conn) throws Exception
cs = conn.prepareCall("{call someUtils.selectRows(?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.execute();
rs = (ResultSet) cs.getObject(1);
while(rs.next())
System.out.println(rs.getInt(1)+"\t"+rs.getString(2));
public void callProcedureFY(Connection conn) throws Exception
cs = conn.prepareCall("{? = call useOther(?)}");
cs.registerOutParameter(1, OracleTypes.CHAR);
cs.setInt(2, 1111);
cs.execute();
System.out.println(cs.getString(1));
public void closeConn(Connection conn,ResultSet rs)
if (rs != null) {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
if (conn != null) {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
public static void main(String[] args) {
CallProcedure cp = new CallProcedure();
conn.setAutoCommit(true);
cp.callProcedure(conn);
cp.callProcedureY(conn);
cp.callProcedureFY(conn);
cp.callProcedureYY(conn);
cp.callProcedureYYL(conn);
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
} catch (Exception e1) {
e1.printStackTrace();
cp.closeConn(conn, rs);
浏览: 6247 次
来自: 上海
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'在JDBC中调用存储过程 首先就要在数据库中存在 要调用的过程& ,存储过程是一组SQL语句的集合,我们吧实现某一功能的 SQL语句集合在一起来使用,方便了用户,不光是这样,存储过程可以预编译,也就是说只要调用了一次存储过程,那么下次在调用存储过程的时候 就不需要进行再次编译了& 。提高了 数据库访问的效率 。。
在 SQL& SERVER20008& 中创建存储过程&&& 语法如下&
&&&&& Create&& Procedure&& 过程名字(@parameter1& int ,@parameter2& char(10) .........)&&& as&&&&&& &SQL命令&&
&&&& 例子:&
&&& Create& Procedure& a& as& select& *& from& info&& //&&创建了存储过程&a& 表示查询 info表的所有数据& &&&
& 在 JDBC中调用&& 方法&& 。。。
&&&&&& Connection& c =DriverManager.getConnection(&jdbc:odbc:datasoure&) ;& //连接数据库&
&&&&&&&CallableStatement& m=c.prepareCalle(&call p(?,?)&) ;& //创建CallableStatement对象& 并传递存储过程调用 的SQL执行语句&&& ?表示 JDBC存储过程参数的通用格式
&&&&& m.setString(1,&one&);&
&&&& m.setString(2.&two&);& //分别设置第一个参数?和第二个参数?的值&
&&&& 然后调用& m.executeUpdate() ;//执行存储过程&&
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
&& 在JDBC操作中 我们还记得& Connection的 commit方法 吗?&& 这个方法 是提交SQL命令 ,默认状态下是自动提交& .也就是说 不用我们 显示的去调用这个方法来提交SQL命 令& 。&
&& 在一般的& SQL& 查询 更新删除 等操作的时候 我们不用去设置它的状态,自动提交就行 。但是在事务中,我们不得不用到 commit方法手动提交 ,关于什么事务 下面我详细说&& 明& ....&
&&&&&& 事务?其实就是几个SQL语句的组合 ,但是这个组合有特性 ,就是他们有原子性?什么是原子性呢 ,就是 事务中的 SQL操作要么都执行 ,要么 一个也不执行 ,这就是事务的概念 ,& 什么时候用到事务呢 ,比如说 我们 在处理银行转账服务的同时 是一个账号 扣钱& 一个账户加钱, 这两个操作只能同时进行 ,但却不能一个执行而另一个不执行,事务的用处在银行转账得到了很好的体现。。。。。。
事务的处理 我们就不能用自动提交模式了 ,
&&&&&&&&&&&&&&& 1、我们需要调用& Connection类的& setAutoCommit(false)方法设置模式为手动提交,设置了这个模式之后我们调用 executeUpdate等方法执行的SQL命令都不会提交
&&&&&&&&&&&&&& 除非我们显示调用了Connection类的 commit()方法 。
&&&&&&&&&&&&&&& 2、如果在事务处理当中 某一条件不符合的时候 我们就可以调用& Connection类的 rollBack()函数回滚事务& ,取消之前所作的一切事务操作 ,
本文已收录于以下专栏:
相关文章推荐
线程安全问题的2种解决方法:
同步synchronized ,是一把锁,线程A操作变量X的时候,这把锁会锁住,此时其他线程B无法操作。
等线程A操作结束,锁打开,此时变量X可以被线程B操作 ...
/***********************************************************
**如何查看死锁的表:方法一************************...
一、使用Batch批量处理数据库
当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。;
1、实现批处理有两种方式,第一种方式:...
package test.
import java.sql.*;
public class JDBCTest {
private static Connection co...
一、使用Batch批量处理数据库
当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。;
1、实现批处理有两种方式,第一...
一、JDBC常用的API深入详解及存储过程的调用
1、存储过程(Stored Procedure)的介绍
2、JDBC调用无参存储过程
3、JDBC调用含输入参数存储过程
存储过程是由SQL语句,及其数据库相关的增强指令和流程控制语句书写的过程程序,经过数据库编译和优化后储存在数据可服务器中。利用存储过程完成应用系统的逻辑操作处理,可以提高系统的运行性能和可维护性,但会...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)JDBC调用存储过程步骤:1 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例。在使用Connection对象的prepareCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程{?= call &procedure-name&[(&arg1&,&arg2&, ...)]}
{call &procedure-name&[(&arg1&,&arg2&, ...)]}
2 通过CallableStatement对象的registerOutParameter()方法注册OUT参数3 通过CallableStatement对象的setXxx()方法设定IN或IN OUT参数
若想将参数默认值设为Null,可以使用setNull()方法4 通过CallableStatement对象的execute()方法执行存储过程5 如果所调用的是带返回参数的存储过程,还需要通过CallableStatement对象的getXxx()方法获取其返回值注:通过数据字典查看存储过程或函数的定义
select text from user_source where lower(name)='add_fun';调用函数:
package com.atguigu.
import static org.junit.Assert.*;
import java.sql.CallableSimport java.sql.Cimport java.sql.SQLEimport java.sql.T
import javax.sql.DataS
import org.junit.T
import com.mchange.boPooledDataS
public class JDBCTest {
* 如何使用 JDBC 调用存储在数据库中的函数或存储过程
*/ @Test public void testCallableStatment() {
Connection connection =
CallableStatement callableStatement =
connection = JDBCTools.getConnection();
// 1. 通过 Connection 对象的 prepareCall()
// 方法创建一个 CallableStatement 对象的实例.
// 在使用 Connection 对象的 preparedCall() 方法时,
// 需要传入一个 String 类型的字符串, 该字符串用于指明如何调用存储过程.
String sql = "{?= call sum_salary(?, ?)}";
callableStatement = connection.prepareCall(sql);
// 2. 通过 CallableStatement 对象的
//reisterOutParameter() 方法注册 OUT 参数.
callableStatement.registerOutParameter(1, Types.NUMERIC);
callableStatement.registerOutParameter(3, Types.NUMERIC);
// 3. 通过 CallableStatement 对象的 setXxx() 方法设定 IN 或 IN OUT 参数. 若想将参数默认值设为
// null, 可以使用 setNull() 方法.
callableStatement.setInt(2, 80);
// 4. 通过 CallableStatement 对象的 execute() 方法执行存储过程
callableStatement.execute();
// 5. 如果所调用的是带返回参数的存储过程,
//还需要通过 CallableStatement 对象的 getXxx() 方法获取其返回值.
double sumSalary = callableStatement.getDouble(1);
long empCount = callableStatement.getLong(3);
System.out.println(sumSalary);
System.out.println(empCount);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, callableStatement, connection);
@Test public void testC3P0() throws SQLException {
DataSource dataSource = new ComboPooledDataSource("c3p0");
System.out.println(dataSource.getConnection()); }
阅读(...) 评论()

我要回帖

更多关于 linq 调用数据库函数 的文章

 

随机推荐