zoukankan
html css js c++ java
【转】java中调用ORACLE存储过程
选自:
http://www.javaresearch.org/article/66608.htm
一:无返回值的存储过程
存储过程为:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;
然后呢,在java里调用时就用下面的代码:
package
com.hyq.src;
import
java.sql.
*
;
import
java.sql.ResultSet;
public
class
TestProcedureOne
{
public
TestProcedureOne()
{
}
public
static
void
main(String[] args )
{
String driver
=
"
oracle.jdbc.driver.OracleDriver
"
;
String strUrl
=
"
jdbc:oracle:thin:@127.0.0.1:1521: database
"
;
Statement stmt
=
null
;
ResultSet rs
=
null
;
Connection conn
=
null
;
CallableStatement cstmt
=
null
;
try
{
Class.forName(driver);
conn
=
DriverManager.getConnection(strUrl,
"scott", "tiger");
CallableStatement proc
=
null
;
proc
=
conn.prepareCall(
"
{ call HYQ.TESTA(?,?) }
"
);
proc.setString(
1
,
"
100
"
);
proc.setString(
2
,
"
TestOne
"
);
proc.execute();
}
catch
(SQLException ex2)
{
ex2.printStackTrace();
}
catch
(Exception ex2)
{
ex2.printStackTrace();
}
finally
{
try
{
if
(rs
!=
null
)
{
rs.close();
if
(stmt
!=
null
)
{
stmt.close();
}
if
(conn
!=
null
)
{
conn.close();
}
}
}
catch
(SQLException ex1)
{
}
}
}
}
当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二:有返回值的存储过程(非列表)
存储过程为:
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID
=
PARA1;
END TESTB;
在java里调用时就用下面的代码:
package
com.hyq.src;
public
class
TestProcedureTWO
{
public
TestProcedureTWO()
{
}
public
static
void
main(String[] args )
{
String driver
=
"
oracle.jdbc.driver.OracleDriver
"
;
String strUrl
=
"
jdbc:oracle:thin:@127.0.0.1:1521:database
"
;
Statement stmt
=
null
;
ResultSet rs
=
null
;
Connection conn
=
null
;
try
{
Class.forName(driver);
conn
=
DriverManager.getConnection(strUrl,
"scott", "tiger");
CallableStatement proc
=
null
;
proc
=
conn.prepareCall(
"
{ call HYQ.TESTB(?,?) }
"
);
proc.setString(
1
,
"
100
"
);
proc.registerOutParameter(
2
, Types.VARCHAR);
proc.execute();
String testPrint
=
proc.getString(
2
);
System.out.println(
"
=testPrint=is=
"
+
testPrint);
}
catch
(SQLException ex2)
{
ex2.printStackTrace();
}
catch
(Exception ex2)
{
ex2.printStackTrace();
}
finally
{
try
{
if
(rs
!=
null
)
{
rs.close();
if
(stmt
!=
null
)
{
stmt.close();
}
if
(conn
!=
null
)
{
conn.close();
}
}
}
catch
(SQLException ex1)
{
}
}
}
}
}
注意,这里的proc.getString(
2
)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(
1
),如果是第三个位置,就是proc.getString(
3
),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,
1
, 建一个程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2
,建立存储过程,存储过程为:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
OPEN p_CURSOR FOR SELECT
*
FROM HYQ.TESTTB;
END TESTC;
可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
在java里调用时就用下面的代码:
package
com.hyq.src;
import
java.sql.
*
;
import
java.io.OutputStream;
import
java.io.Writer;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
oracle.jdbc.driver.
*
;
public
class
TestProcedureTHREE
{
public
TestProcedureTHREE()
{
}
public
static
void
main(String[] args )
{
String driver
=
"
oracle.jdbc.driver.OracleDriver
"
;
String strUrl
=
"
jdbc:oracle:thin:@127.0.0.1:1521:database
"
;
Statement stmt
=
null
;
ResultSet rs
=
null
;
Connection conn
=
null
;
try
{
Class.forName(driver);
conn
=
DriverManager.getConnection(strUrl,
"scott", "tiger");
CallableStatement proc
=
null
;
proc
=
conn.prepareCall(
"
{ call hyq.testc(?) }
"
);
proc.registerOutParameter(
1
,oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs
=
(ResultSet)proc.getObject(
1
);
while
(rs.next())
{
System.out.println(
"
<tr><td>
"
+
rs.getString(
1
)
+
"
</td><td>
"
+
rs.getString(
2
)
+
"
</td></tr>
"
);
}
}
catch
(SQLException ex2)
{
ex2.printStackTrace();
}
catch
(Exception ex2)
{
ex2.printStackTrace();
}
finally
{
try
{
if
(rs
!=
null
)
{
rs.close();
if
(stmt
!=
null
)
{
stmt.close();
}
if
(conn
!=
null
)
{
conn.close();
}
}
}
catch
(SQLException ex1)
{
}
}
}
}
查看全文
相关阅读:
hdu 4027 Can you answer these queries? 线段树
ZOJ1610 Count the Colors 线段树
poj 2528 Mayor's posters 离散化 线段树
hdu 1599 find the mincost route floyd求最小环
POJ 2686 Traveling by Stagecoach 状压DP
POJ 1990 MooFest 树状数组
POJ 2955 Brackets 区间DP
lightoj 1422 Halloween Costumes 区间DP
模板 有源汇上下界最小流 loj117
模板 有源汇上下界最大流 loj116
原文地址:https://www.cnblogs.com/ding0910/p/740465.html
最新文章
模板 后缀自动机
浅谈搜索
BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)
BZOJ1972: [Sdoi2010]猪国杀 (模拟)
Codeforces 451 E. Devu and Flowers(组合数学,数论,容斥原理)
Codeforces 718C. Sasha and Array(线段树)
codeforces 1037E. Trips(倒叙)
cf1051F. The Shortest Statement(最短路/dfs树)
图论-构造初级总结
Codeforces 919F. A Game With Numbers(博弈论)
热门文章
codeforces 1027F. Session in BSU
BZOJ2118: 墨墨的等式(最短路构造/同余最短路)
CF-558E (线段树/分块)
洛谷 P1341 无序字母对(欧拉回路)
洛谷P3403跳楼机(最短路构造/同余最短路)
HDU4630-No Pain No Game(离线,线段树)
模板 匈牙利算法
BZOJ1415: [Noi2005]聪聪和可可
BZOJ1812: [ioi2005]riv (树形Dp)
CF-833B The Bakery(线段树优化Dp)
Copyright © 2011-2022 走看看