当前位置:首页 » 存储配置 » java调存储过程

java调存储过程

发布时间: 2023-03-02 20:23:41

java调用存储过程返回游标的结果集无法关闭游标的问题

在过程里判断很简单呀

CREATE OR REPLACE PROCEDURE TESTPROC(CUR OUT SYS_REFCURSOR)
AS
default_c SYS_REFCURSOR;
BEGIN
OPEN CUR FOR SELECT * FROM AA;
if CUR%rowcount = 0 then
CUR:=default_c;
end if;
END;

定义一个默认空游标,没数据就返回它呗

㈡ Java中,怎样调用带输出参数的存储过程

1、创建带输出参数的存储过程 如: 在查询分析器中执行declare @mg nvarchar(100)
exec proc_CSCO_SalesFctByStore 100,200,'name',@mg output
print @mg 在Java中调用import java.sql.*;
public class Test{
public static void main(String args[]) throws Exception {//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); //获得连接
Connection conn = DriverManager.getConnection("jdbc:odbc:mydata", "sa",""); //创建存储过程的对象
CallableStatement c = conn.prepareCall("{call proc_CSCO_SalesFctByStore(?,?,?,?)}"); //给存储过程的第一个参数设置值
c.setInt(1, 100); //给存储过程的第一个参数设置值
c.setInt(2, 10000); //给存储过程的第一个参数设置值
c.setString(3, user); //注册存储过程的第四个参数
c.registerOutParameter(4, java.sql.Types.VARCHAR); //执行存储过程
c.execute(); //得到存储过程的输出参数值

㈢ Java调用SQL存储过程、事务

例示一个不带参数的简单存储过程。多数存储过程的功能比本例复杂多了,但这里主要说明存储过程的一些基本要点。如前面所述,不同DBMS定义存储过程的语法是不同的。例如,有些DBMS使用begin
.
.
.
end或其他关键字指明存储过程定义的开始和结束。在有些DBMS中,下面的SQL语句可创建一个存储过程:
create
procere
SHOW_SUPPLIERS
as
select
SUPPLIERS.SUP_NAME,
COFFEES.COF_NAME
from
SUPPLIERS,
COFFEES
where
SUPPLIERS.SUP_ID
=
COFFEES.SUP_ID
order
by
SUP_NAME
下面的代码将SQL语句放到一个字符串中,然后赋给变量createProcere以备后用:
String
createProcere
=
"create
procere
SHOW_SUPPLIERS
"
+
"as
"
+
"select
SUPPLIERS.SUP_NAME,
COFFEES.COF_NAME
"
+
"from
SUPPLIERS,
COFFEES
"
+
"where
SUPPLIERS.SUP_ID
=
COFFEES.SUP_ID
"
+
"order
by
SUP_NAME";
下面的代码段使用Connection对象con来创建Statement对象,用于把创建存储过程的SQL语句发送给数据库
Statement
stmt
=
con.createStatement();
stmt.executeUpdate(createProcere);
存储过程SHOW_SUPPLIERS将作为一个可调用的数据库对象在数据库中编译并存储,调用时就像调用其他方法一样。

㈣ 在JAVA中怎么调用带参数的存储过程

JDBC调用存储过程: CallableStatementx0dx0a在Java里面调用存储过程,写法那是相当的固定:x0dx0aClass.forName(....x0dx0aConnection conn = DriverManager.getConnection(....x0dx0a/**x0dx0a*p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替x0dx0a*其余地方写法固定x0dx0a*/x0dx0aCallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}");x0dx0a/**x0dx0a*告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定x0dx0a*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的x0dx0a*Types后面具体写什么类型,得看你的存储过程参数怎么定义的x0dx0a*/x0dx0acstmt.registerOutParameter(3, Types.INTEGER);x0dx0acstmt.registerOutParameter(4, Types.INTEGER);x0dx0a/**x0dx0a*在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出x0dx0a*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5x0dx0a*没设第3个,因为它是输出参数x0dx0a*/x0dx0acstmt.setInt(1, 3);x0dx0acstmt.setInt(2, 4);x0dx0acstmt.setInt(4, 5);x0dx0a//执行x0dx0acstmt.execute();x0dx0a//把第3个参数的值当成int类型拿出来x0dx0aint three = cstmt.getInt(3);x0dx0aSystem.out.println(three);x0dx0a//把第4个参数的值当成int类型拿出来x0dx0aint four = cstmt.getInt(4);x0dx0aSystem.out.println(four);x0dx0a//用完别忘给人家关了,后开的先关x0dx0acstmt.close();x0dx0aconn.close();x0dx0ax0dx0aJDBC调用存储过程,掌握这一个程序足够了.x0dx0a以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.x0dx0ax0dx0acreate or replace procere px0dx0a(v_a in number,v_b number,v_ret out number,v_temp in out number)x0dx0aisx0dx0abeginx0dx0aif(v_a > v_b) thenx0dx0av_ret := v_a;x0dx0aelsex0dx0av_ret := v_b;x0dx0aend if;x0dx0av_temp := v_temp + 1;x0dx0aend;

㈤ oracle 的存储过程在java怎么调用

java下实现调用oracle的存储过程和函数
在oracle下创建一个test的账户,然后按一下步骤执行:
1.创建表:STOCK_PRICES

--创建表格
CREATE TABLE STOCK_PRICES(
RIC VARCHAR(6) PRIMARY KEY,
PRICE NUMBER(7,2),
UPDATED DATE );

2.插入测试数据:

--插入数据
INSERT INTO stock_prices values('1111',1.0,SYSDATE);
INSERT INTO stock_prices values('1112',2.0,SYSDATE);
INSERT INTO stock_prices values('1113',3.0,SYSDATE);
INSERT INTO stock_prices values('1114',4.0,SYSDATE);

3.建立一个返回游标: PKG_PUB_UTILS

--建立一个返回游标
CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
--动态游标
TYPE REFCURSOR IS REF CURSOR;
END PKG_PUB_UTILS;

4.创建和存储过程:P_GET_PRICE

--创建存储过程
CREATE OR REPLACE PROCEDURE P_GET_PRICE
(
AN_O_RET_CODE OUT NUMBER,
AC_O_RET_MSG OUT VARCHAR2,
CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,
AN_I_PRICE IN NUMBER
)
IS
BEGIN
AN_O_RET_CODE := 0;
AC_O_RET_MSG := '操作成功';

OPEN CUR_RET FOR
SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;
EXCEPTION
WHEN OTHERS THEN
AN_O_RET_CODE := -1;
AC_O_RET_MSG := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;
END P_GET_PRICE;

5.创建函数:

--创建函数:F_GET_PRICE
CREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER)
RETURN PKG_PUB_UTILS.REFCURSOR
AS
stock_cursor PKG_PUB_UTILS.REFCURSOR;
BEGIN
OPEN stock_cursor FOR
SELECT * FROM stock_prices WHERE price < v_price;
RETURN stock_cursor;
END;

6.JAVA调用存储过程返回结果集
代码示例:JDBCoracle10G_INVOKEPROCEDURE.java

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/* 本例是通过调用oracle的存储过程来返回结果集:
* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip
*/
public class JDBCoracle10G_INVOKEPROCEDURE {
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
CallableStatement stmt = null;

String driver;
String url;
String user;
String pwd;
String sql;
String in_price;

public JDBCoracle10G_INVOKEPROCEDURE()
{
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@localhost:1521:ORCL";
// oracle 用户
user = "test";
// oracle 密码
pwd = "test";
init();
// mysid:必须为要连接机器的sid名称,否则会包以下错:
// java.sql.SQLException: Io 异常: Connection
// refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
// 参考连接方式:
// Class.forName( "oracle.jdbc.driver.OracleDriver" );
// cn = DriverManager.getConnection(
// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );

}

public void init() {
System.out.println("oracle jdbc test");
try {
Class.forName(driver);
System.out.println("driver is ok");
conn = DriverManager.getConnection(url, user, pwd);
System.out.println("conection is ok");
statement = conn.createStatement();
// conn.setAutoCommit(false);
// 输入参数
in_price = "3.0";
// 调用函数
stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");
stmt.registerOutParameter(1, java.sql.Types.FLOAT);
stmt.registerOutParameter(2, java.sql.Types.CHAR);
stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
stmt.setString(4, in_price);
stmt.executeUpdate();
int retCode = stmt.getInt(1);
String retMsg = stmt.getString(2);
if (retCode == -1) { // 如果出错时,返回错误信息
System.out.println("报错!");
} else {
// 取的结果集的方式一:
rs = ((OracleCallableStatement) stmt).getCursor(3);
// 取的结果集的方式二:
// rs = (ResultSet) stmt.getObject(3);
String ric;
String price;
String updated;
// 对结果进行输出
while (rs.next()) {
ric = rs.getString(1);
price = rs.getString(2);
updated = rs.getString(3);
System.out.println("ric:" + ric + ";-- price:" + price
+ "; --" + updated + "; ");
}
}

} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("close ");
}
}

public static void main(String args[])// 自己替换[]
{
new JDBCoracle10G_INVOKEPROCEDURE();
}
}

7.开发JAVA调用函数返回结果集
代码示例:JDBCoracle10G_INVOKEFUNCTION.java

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

/*
/* 本例是通过调用oracle的函数来返回结果集:
* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip
*/
public class JDBCoracle10G_INVOKEFUNCTION {
Connection conn = null;
Statement statement = null;
ResultSet rs = null;
CallableStatement stmt = null;

String driver;
String url;
String user;
String pwd;
String sql;
String in_price;

public JDBCoracle10G_INVOKEFUNCTION()
{
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@localhost:1521:ORCL";
// oracle 用户
user = "test";
// oracle 密码
pwd = "test";
init();
// mysid:必须为要连接机器的sid名称,否则会包以下错:
// java.sql.SQLException: Io 异常: Connection
// refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
// 参考连接方式:
// Class.forName( "oracle.jdbc.driver.OracleDriver" );
// cn = DriverManager.getConnection(
// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );
}

public void init() {
System.out.println("oracle jdbc test");
try {
Class.forName(driver);
System.out.println("driver is ok");
conn = DriverManager.getConnection(url, user, pwd);
System.out.println("conection is ok");
statement = conn.createStatement();
// conn.setAutoCommit(false);
// 输入参数
in_price = "5.0";
// 调用函数
stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");
// stmt.registerOutParameter(1, java.sql.Types.FLOAT);
// stmt.registerOutParameter(2, java.sql.Types.CHAR);
stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
stmt.setString(2, in_price);
stmt.executeUpdate();
// 取的结果集的方式一:
rs = ((OracleCallableStatement) stmt).getCursor(1);
// 取的结果集的方式二:
// rs = (ResultSet) stmt.getObject(1);
String ric;
String price;
String updated;

while (rs.next()) {
ric = rs.getString(1);
price = rs.getString(2);
updated = rs.getString(3);
System.out.println("ric:" + ric + ";-- price:" + price + "; --"
+ updated + "; ");
}

} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("close ");
}
}

public static void main(String args[])// 自己替换[]
{
new JDBCoracle10G_INVOKEFUNCTION();
}
}

㈥ java代码怎么调用存储过程

方法如下:importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;/***LoadJDBCDriver*最基本的方法通过JDBC连接数据库*@authorJacob**/publicclassLoadByPrimary{publicstaticvoidmain(String[]args)throwsClassNotFoundException{Stringdriver="oracle.jdbc.OracleDriver";Connectioncn=null;/***Class.forName手动加载一个类到方法区,Driver类中包含自动注册驱动的静态代码块*会自动在DriverManager中注册驱动*/Class.forName(driver);Stringurl="jdbc:oracle:thin:@localhost:1521:ORACLE";//1521代表端口号,默认的Stringuser="用户名";Stringpwd="密码";try{/**Connection是接口,返回值是一个引用对象,是Oracle驱动提供实现类ojdbc7.jar*使用JDBCAPI接口,实际上是驱动实现类*/cn=DriverManager.getConnection(url,user,pwd);Statementstmt=cn.createStatement();Stringsql="SELECT*FROMstu_empWHEREdeptno=10";ResultSetrs=stmt.executeQuery(sql);while(rs.next()){System.out.println(rs.getInt("empno")+""+rs.getString("ename")+""+rs.getString("job"));}rs.close();stmt.close();}catch(SQLExceptione){e.printStackTrace();}finally{try{if(cn!=null){cn.close();}}catch(SQLExceptione2){e2.printStackTrace();}}}}这是通过preparedstatement实现更新数据,这里我把连接数据库的方法进行了封装,每次直接调用了。publicstaticvoidmain(String[]args){PreparedStatementDemopsd=newPreparedStatementDemo();psd.updateSalary("JACOB",3000);psd.selectSalary("JACOB");}publicvoipdateSalary(Stringename,doublesal){Stringsql="Updatestu_empsetsal=?Whereename=?";Connectioncn=null;PreparedStatementps=null;try{cn=DBPUtil.getConnection();ps=cn.prepareStatement(sql);ps.setDouble(1,sal);ps.setString(2,ename);intnum=ps.executeUpdate();System.out.println("提示:总共有"+num+"条数据已经更新!");}catch(SQLExceptione){e.printStackTrace();}finally{DBUtil.stmtClose(ps);DBUtil.connClose(cn);}}publicvoidselectSalary(Stringname){Stringsql="Select*Fromstu_empWhereename=?";Connectioncn=null;PreparedStatementps=null;ResultSetrs=null;try{cn=DBPUtil.getConnection();ps=cn.prepareStatement(sql);ps.setString(1,name);rs=ps.executeQuery();while(rs.next()){System.out.println(rs.getString("ename")+"的工资是:"+rs.getInt("sal"));}}catch(SQLExceptione){e.printStackTrace();}finally{DBUtil.stmtClose(ps);DBUtil.rsClose(rs);DBUtil.connClose(cn);}}}

㈦ JAVA调用存储过程,Oracle自定义类型作参数怎么写法

1. 存储过程以及类型定义如下:

--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);

--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procere(ids IN idArray, exist OUT NUMBER);
END Lib_Package;

--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS

PROCEDURE Book_Check_Procere( ids IN idArray, exist OUT NUMBER) AS v_Index BINARY_INTEGER; BEGIN v_Index:= ids.FIRST; LOOP SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent' AND book_id=ids(v_Index); EXIT WHEN v_Index=ids.LAST OR exist>0; v_Index:= ids.NEXT(v_Index); END LOOP;END Book_Check_Procere;
END Lib_Package;

2.在Java中调用上面的存储过程
(1) 在Oracle中定义数组类型idArray (2) 在java构造数组并转换成Oracle中定义的数组类型,调用存储过程

/** * 当要删除图书时,检查是否仍然有图书复本处于借出状态 */ public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false; Connection conn = null; OracleCallableStatement cstmt = null; ArrayDescriptor desc = null; ARRAY bookIdArray = null; int count = 0; String sql = "{call LIB_PACKAGE.Book_Check_Procere(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance(); conn = dbManager.getConnection(Constants.DATABASE);
try { cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定义oracle中的数组类型 desc = ArrayDescriptor.createDescriptor("IDARRAY", conn); bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.execute(); count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); } catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus-->SQLException: " + e.getMessage()); DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); throw new DataAccessException( "When check the books, there is a SQLException: " + e.getMessage(), e.getCause()); }
if (count > 0) {
flag = true; }
return flag; }

热点内容
随机启动脚本 发布:2025-07-05 16:10:30 浏览:535
微博数据库设计 发布:2025-07-05 15:30:55 浏览:32
linux485 发布:2025-07-05 14:38:28 浏览:310
php用的软件 发布:2025-07-05 14:06:22 浏览:760
没有权限访问计算机 发布:2025-07-05 13:29:11 浏览:437
javaweb开发教程视频教程 发布:2025-07-05 13:24:41 浏览:735
康师傅控流脚本破解 发布:2025-07-05 13:17:27 浏览:249
java的开发流程 发布:2025-07-05 12:45:11 浏览:696
怎么看内存卡配置 发布:2025-07-05 12:29:19 浏览:288
访问学者英文个人简历 发布:2025-07-05 12:29:17 浏览:838