网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  使用java调用oracle数据库的存储过程实例     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:71次  录入:管理员--2008-08-12  
 

【赛迪网-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中的换行是无效的,要换行的时候一定要空格结尾,特别是你直接复制代码的时候!

 
 
上一篇: 如何在oracle数据库中使用java存储过程    下一篇: oracle中sqlplus的常用指令收集与技巧 (1)
  相关文档
监控数据库性能的"sql"语句都有哪些? (1) 02-27
快速解决oracle数据库10g导出错误6550 04-18
Oracle数据库中利用ASSM改善分段存储 04-12
oracle数据库中为什么会产生回滚与前退 04-18
oracle数据库中使用dbms_profiler进行调优 05-07
做了archive后如何收缩oracle的数据文件 02-28
巧用"rman"的tspitr技术找回删除的表 01-31
教你轻松掌握数据库和实例的启动和关闭 09-29
Oracle数据库中临时表的进一步深入研究 05-27
实例讲解oracle监听口令及监听器安全 03-06
详细讲解各种数据库使用jdbc连接的方式 03-28
轻松六步使你的Oracle存储过程迅速加密 05-27
oracle中sql语句执行效率的查找与解决 (1) 05-06
带你轻松接触"maa"结构中所包含的组件 03-05
statspack中的library hit是如何计算的 03-06
Oracle智能代理与OMS的问题解答 05-27
逐步讲解 Oracle数据库碎片如何整理 05-13
oracle数据库连接池下如何跟踪终端会话 (1) 04-16
Oracle中有没有系统数据库? 09-29
手工创建数据库的全部脚本及其说明 04-11
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息