java中怎么使用oracle的序列,过程和函数

java中怎么使用oracle的序列,过程和函数,第1张

JAVA中使用oracle序列

直接使用

String sql="insert into wf_hxinxi (oid,zsnumber,sortinfo,address,dateinfo)values(SEQ_SYSTEMADD.Nextval,'"+hxinxiVO.getZsnumber()+"','"+hxinxiVO.getSortinfo()+"','"+hw+"','"+hxinxiVO.getDateinfo()+"')"

使用存储过程就更多,看你的传入,和传出情况,

一:无返回值的存储过程

存储过程为:

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: hyq "

Statement stmt = null

ResultSet rs = null

Connection conn = null

CallableStatement cstmt = null

try {

Class.forName(driver)

conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ")

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:hyq"

Statement stmt = null

ResultSet rs = null

Connection conn = null

try {

Class.forName(driver)

conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ")

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:hyq"

Statement stmt = null

ResultSet rs = null

Connection conn = null

try {

Class.forName(driver)

conn = DriverManager.getConnection(strUrl, "hyq", "hyq")

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) {

}

}

]

]

函数更是简单,具体的别人已经给更详细的说明,参考这个

http://zhidao.baidu.com/question/1567623.html?si=8

请注意看如下代码:

public List getObject(String sql, Object[] object) { //sql执行语句,object是你sql语句里面的参数

List list = new ArrayList()

Connection con = null

PreparedStatement pre = null

ResultSet rs = null

try{

con = C3P0Util.getInstance().getConnection()//这是你获得数据库连接,你把这里改成调用你自己写的jdbc方法

pre = con.prepareStatement(sql)//执行sql语句

if(object!=null){

for(int i=0i<object.lengthi++){

pre.setObject(i+1, object[i])//给sql里面的参数进行赋值

}

}

rs = pre.executeQuery()

while(rs.next()){

Users u = new User()

u.setUserName(rs.getString("UserName"))

u.setUserPas(rs.getString("UserPas"))list.add(u)

}

}catch(Exception e){

e.printStackTrace()

return null

}finally{

C3P0Util.close(con, pre, rs)//关闭数据库资源

}

return list//返回list集合

}

注意:list里面保存的是User对象的信息

你要获得User对象的信息,那么就要遍历list

for(int i=0i<list.sizei++){

User u = (User)list.get(i)System.out.println("UserName:"+u.getUserName())

System.out.println("UserPas:"+u.getUserPas())

} 上面是针对list里面有很多个User对象,当然list里面只有一个User对象,也是可以的。

如果你的list里面只有一个User,那么可以直接:User u = (User)list.get(0)

System.out.println("UserName:"+u.getUserName())

System.out.println("UserPas:"+u.getUserPas())

希望对你有帮助!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10644308.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存