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)
{
}
}
}
}
查看全文
相关阅读:
android 开机启动
android 禁用home键盘
android 获取各种窗体高度
android 横竖屏切换
android 还原短信
android dp和px之间转换
android BitMap、Drawable、inputStream及byte[] 互转
手机卫士项目
Android01_Android入门
Android02_Activity
原文地址:https://www.cnblogs.com/ding0910/p/740465.html
最新文章
odoo10 费用报销
Ubuntu 16 安装odoo10 实录
postgreSQL 统计语句
Odoo Shell
odoo模块
kubernetes Ubuntu部署
关于面试时项目的介绍
Android快速开发系列 10个常用工具类
xUtils 中的BitmapUtils 全面注释
xUtils 中的BitmapUtils 全面注释
热门文章
Android开发具体流程
面试技术汇总
android 重启
android 隐藏以及显示软键盘以及不自动弹出键盘的方法
android 调节屏幕亮度
android 设置apn
android 权限列表
android 判断网络状态
android 挪动dialog的位置
android 开机启动应用
Copyright © 2011-2022 走看看