服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

使用java调用oracle数据库的存储过程实例

【赛迪网-it技术报道】一:无返回值的存储过程

1、建立存储过程

create or replace procedure testa(para1 in varchar2,para2 in varchar2) as

begin

insert into t_test (i_id,i_name) values (para1, para2);

end testa;

2、相应的java程序

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

public testprocedureone() {

}

public static void main(string[] args ){

string driver = "oracle.jdbc.driver.oracledriver";

string strurl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";

statement stmt = null;

resultset rs = null;

connection conn = null;

callablestatement cstmt = null;

try {

class.forname(driver);

conn = drivermanager.getconnection(strurl, "dbname", "password");

callablestatement proc = null;

proc = conn.preparecall("{ call dbname.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) {

}

}

}

}

二:有返回值的存储过程(非列表)

1、存储过程为

create or replace procedure testb(para1 in varchar2,para2 out varchar2) as

begin

select into para2 from testtb where i_id= para1;

end testb;

2、java代码

public class testproceduretwo {

public testproceduretwo() {

}

public static void main(string[] args ){

string driver = "oracle.jdbc.driver.oracledriver";

string strurl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";

statement stmt = null;

resultset rs = null;

connection conn = null;

try {

class.forname(driver);

conn = drivermanager.getconnection(strurl, "dbname", "password");

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、在sql*plus中建一个程序包

create or replace package testpackage as

type test_cursor is ref cursor;

procedure testc(cur_ref out test_cursor);

end testpackage;

建立存储过程,存储过程为:

create or replace package body testpackage as

procedure testc(cur_ref out test_cursor) is

begin

open cur_ref for select * from t_test;

end testc;

end testpackage;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

java程序如下:

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

public testprocedureone() {

}

public static void main(string[] args ){

string driver = "oracle.jdbc.driver.oracledriver";

string strurl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";

statement stmt = null;

resultset rs = null;

connection conn = null;

callablestatement cstmt = null;

try {

class.forname(driver);

conn = drivermanager.getconnection(strurl,"databasename" "password");

callablestatement proc = null;

proc = conn.preparecall("{ call cqsb.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) {

}

}

}

}

特别注意:

1、在执行前一定要先把oracle的驱动包放到class路径里。

2、toad在我建立存储过程中搞了很多莫名的错误,多数是没有创建成功而不报错,

或者是创建有误而不提示,应当引起重视。所以最好还是在sql*plus玩这些。

3、在sql*plus中的换行是无效的,要换行的时候一定要空格结尾,特别是你直接复制代码的时候!

扫描关注微信公众号