- 浏览: 259820 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
no_studio:
期待实现SqlServer
发布异种数据库导入工具jmyetl-1.0.2 -
babydeed:
不错 再接再厉
发布异种数据库导入工具jmyetl-1.0.2 -
iihero:
niwtsew 写道贴个俺自己写的linux下的版本,其实没必 ...
命令行快速找出class文件所在的jar包 -
niwtsew:
说错,是strings不是string
命令行快速找出class文件所在的jar包 -
niwtsew:
贴个俺自己写的linux下的版本,其实没必要用7z,直接jar ...
命令行快速找出class文件所在的jar包
其实,这篇短文,我早就应该写了。因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。
任何转载,请尊重版权。(作者:iihero on csdn)
一、如何创建java存储过程?
通常有三种方法来创建java存储过程。
1. 使用oracle的sql语句来创建:
e.g. 使用create or replace and compile java source named "<name>" as
后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。
SQL>createorreplaceandcompilejavasourcenamed"javademo1"
2as
3importjava.sql.*;
4publicclassJavaDemo1
5{
6publicstaticvoidmain(String[]argv)
7{
8System.out.println("hello,javademo1");
9}
10}
11/
Java已创建。
SQL>showerrorsjavasource"javademo1"
没有错误。
SQL>createorreplaceprocedurejavademo1
2as
3languagejavaname'JavaDemo1.main(java.lang.String[])';
4/
过程已创建。
SQL>setserveroutputon
SQL>calljavademo1();
调用完成。
SQL>calldbms_java.set_output(5000);
调用完成。
SQL>calljavademo1();
hello,javademo1
调用完成。
SQL>calljavademo1();
hello,javademo1
调用完成。
2as
3importjava.sql.*;
4publicclassJavaDemo1
5{
6publicstaticvoidmain(String[]argv)
7{
8System.out.println("hello,javademo1");
9}
10}
11/
Java已创建。
SQL>showerrorsjavasource"javademo1"
没有错误。
SQL>createorreplaceprocedurejavademo1
2as
3languagejavaname'JavaDemo1.main(java.lang.String[])';
4/
过程已创建。
SQL>setserveroutputon
SQL>calljavademo1();
调用完成。
SQL>calldbms_java.set_output(5000);
调用完成。
SQL>calljavademo1();
hello,javademo1
调用完成。
SQL>calljavademo1();
hello,javademo1
调用完成。
2. 使用外部class文件来装载创建
e.g. 这里既然用到了外部文件,必然要将class文件放到oracle Server的某一目录下边。
publicclassOracleJavaProc
{
publicstaticvoidmain(String[]argv)
{
System.out.println("It'saJavaOracleprocedure.");
}
}
SQL>grantcreateanydirectorytoscott;
授权成功。
SQL>connscott/tiger@iihero.oracledb
已连接。
SQL>createorreplacedirectorytest_diras'd:\oracle';
目录已创建。
SQL>createorreplacejavaclassusingbfile(test_dir,'OracleJavaProc.CLASS')
2/
Java已创建。
SQL>createorreplaceproceduretestjavaprocaslanguagejavaname'OracleJavaProc.main(java.lang.String[])';
2/
过程已创建。
SQL>calltestjavaproc();
调用完成。
SQL>executetestjavaproc;
PL/SQL过程已成功完成。
SQL>setserveroutputonsize5000
SQL>calldbms_java.set_output(5000);
调用完成。
SQL>executetestjavaproc;
It'saJavaOracleprocedure.
{
publicstaticvoidmain(String[]argv)
{
System.out.println("It'saJavaOracleprocedure.");
}
}
SQL>grantcreateanydirectorytoscott;
授权成功。
SQL>connscott/tiger@iihero.oracledb
已连接。
SQL>createorreplacedirectorytest_diras'd:\oracle';
目录已创建。
SQL>createorreplacejavaclassusingbfile(test_dir,'OracleJavaProc.CLASS')
2/
Java已创建。
SQL>createorreplaceproceduretestjavaprocaslanguagejavaname'OracleJavaProc.main(java.lang.String[])';
2/
过程已创建。
SQL>calltestjavaproc();
调用完成。
SQL>executetestjavaproc;
PL/SQL过程已成功完成。
SQL>setserveroutputonsize5000
SQL>calldbms_java.set_output(5000);
调用完成。
SQL>executetestjavaproc;
It'saJavaOracleprocedure.
3. 我推荐的一种方法,直接使用loadjava命令远程装载并创建。
先创建一个类, e.g.
importjava.sql.*;
importoracle.jdbc.*;
publicclassOracleJavaProc...{
//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal)...{
System.out.println("CreatingnewsalgradeforEMPLOYEE...");
try...{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLExceptione)...{
System.err.println("ERROR!AddingSalgrade:"
+e.getMessage());
}
}
}
importoracle.jdbc.*;
publicclassOracleJavaProc...{
//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal)...{
System.out.println("CreatingnewsalgradeforEMPLOYEE...");
try...{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLExceptione)...{
System.err.println("ERROR!AddingSalgrade:"
+e.getMessage());
}
}
}
使用loadjava命令将其装载到服务器端并编译:
D:eclipse3.1workspacedbtest>loadjava-uscott/tiger@iihero.oracledb-v-resolveOr
acleJavaProc.java
arguments:'-u''scott/tiger@iihero.oracledb'-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
acleJavaProc.java
arguments:'-u''scott/tiger@iihero.oracledb'-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
查询一下状态:
连接到:
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production
WiththePartitioning,OLAPandOracleDataMiningoptions
JServerRelease9.2.0.1.0-Production
SQL>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPESTATUS
--------------------------------------------------
OracleJavaProc
JAVACLASSVALID
OracleJavaProc
JAVASOURCEVALID
Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production
WiththePartitioning,OLAPandOracleDataMiningoptions
JServerRelease9.2.0.1.0-Production
SQL>SELECTobject_name,object_type,statusFROMuser_objectsWHEREobject_typeLIKE'JAVA%';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPESTATUS
--------------------------------------------------
OracleJavaProc
JAVACLASSVALID
OracleJavaProc
JAVASOURCEVALID
测试一下存储过程:
SQL>createorreplaceprocedureadd_salgrade(idnumber,losalnumber,hisalnum
ber)aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)';
2/
过程已创建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
调用完成。
SQL>executeadd_salgrade(6,10000,15000);
CreatingnewsalgradeforEMPLOYEE...
PL/SQL过程已成功完成。
SQL>select*fromsalgradewheregrade=6;
GRADELOSALHISAL
------------------------------
61000015000
ber)aslanguagejavaname'OracleJavaProc.addSalGrade(int,int,int)';
2/
过程已创建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
调用完成。
SQL>executeadd_salgrade(6,10000,15000);
CreatingnewsalgradeforEMPLOYEE...
PL/SQL过程已成功完成。
SQL>select*fromsalgradewheregrade=6;
GRADELOSALHISAL
------------------------------
61000015000
二、如何更新你已经编写的java存储过程?
假如要往类OracleJavaProc里添加一个存储过程方法,如何开发?
正确的步骤应该是先dropjava, 改程序,再loadjava。
e.g.修改OracleJavaProc类内容如下:
importjava.sql.*;
importoracle.jdbc.*;
publicclassOracleJavaProc...{
//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal)...{
System.out.println("CreatingnewsalgradeforEMPLOYEE...");
try...{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLExceptione)...{
System.err.println("ERROR!AddingSalgrade:"
+e.getMessage());
}
}
publicstaticintgetHiSal(intgrade)
...{
try...{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql="SELECThisalFROMsalgradeWHEREgrade=?";
PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setInt(1, grade);
ResultSetrset=pstmt.executeQuery();
intres=0;
if(rset.next())
...{
res=rset.getInt(1);
}
rset.close();
returnres;
importoracle.jdbc.*;
publicclassOracleJavaProc...{
//Addasalgradetothedatabase.
publicstaticvoidaddSalGrade(intgrade,intlosal,inthisal)...{
System.out.println("CreatingnewsalgradeforEMPLOYEE...");
try...{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql=
"INSERTINTOsalgrade"+
"(GRADE,LOSAL,HISAL)"+
"VALUES(?,?,?)";
PreparedStatementpstmt=conn.prepareStatement(sql);
pstmt.setInt(1,grade);
pstmt.setInt(2,losal);
pstmt.setInt(3,hisal);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLExceptione)...{
System.err.println("ERROR!AddingSalgrade:"
+e.getMessage());
}
}
publicstaticintgetHiSal(intgrade)
...{
try...{
Connectionconn=
DriverManager.getConnection("jdbc:default:connection:");
Stringsql="SELECThisalFROMsalgradeWHEREgrade=?";
PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setInt(1, grade);
ResultSetrset=pstmt.executeQuery();
intres=0;
if(rset.next())
...{
res=rset.getInt(1);
}
rset.close();
returnres;
}
catch(SQLExceptione)
...{
System.err.println("ERROR!QueryingSalgrade:"
+e.getMessage());
return -1;
}
}
}
catch(SQLExceptione)
...{
System.err.println("ERROR!QueryingSalgrade:"
+e.getMessage());
return -1;
}
}
}
如何更新呢?
D:eclipse3.1workspacedbtest>dropjava-uscott-vOracleJavaProc
D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava-uscott-v-resolveOr
acleJavaProc/tiger@iihero.oracledb.java
arguments:'-u''scott/tiger@iihero.oracledb''-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava-uscott-v-resolveOr
acleJavaProc/tiger@iihero.oracledb.java
arguments:'-u''scott/tiger@iihero.oracledb''-v''-resolve''OracleJavaProc.java'
creating:sourceOracleJavaProc
loading:sourceOracleJavaProc
resolving:sourceOracleJavaProc
后边的应用示例:
SQL>createorreplacefunctionquery_hisal(gradenumber)returnnumberaslangu
agejavaname'OracleJavaProc.getHiSal(int)returnint';
2/
函数已创建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
调用完成。
SQL>selectquery_hisal(5)fromdual;
QUERY_HISAL(5)
--------------
9999
agejavaname'OracleJavaProc.getHiSal(int)returnint';
2/
函数已创建。
SQL>setserveroutputonsize2000
SQL>calldbms_java.set_output(2000);
调用完成。
SQL>selectquery_hisal(5)fromdual;
QUERY_HISAL(5)
--------------
9999
全文完!
用法个人见解:不要手动drop java source, 不要手动drop procedure。
发表评论
-
发布异种数据库导入工具jmyetl-1.0.2
2012-06-11 05:14 1735利用空闲时间,折腾了一个,界面不太擅长,比较简陋,但是相信大家 ... -
各种数据库临时表的使用区别总结
2012-05-24 08:22 2452[size=large]虽然SQL92, 99, 2003, ... -
Oracle11.2.0非安装版(简装版)制作完成(仅供开发人员参考使用)
2012-03-11 13:57 1807作者: iihero@CSDN, 2012.3.11. 请尊重 ... -
常用的数据库连接串(JDBC篇)
2011-12-23 06:58 0看到网上传来传去的jdbc url连接串总结,好多都是粘来粘去 ... -
DBCP连接池的最简单应用(用于ORACLE数据库)
2011-11-19 05:54 4461鉴于有人问起DBCP直接用于JDBC连接的问题,我做了一个最简 ... -
Oracle的几位创始人
2011-11-04 00:31 1826Oracle共有三位创始人。 1. Larry Ellison ... -
DBeaver数据库管理工具连接Sybase数据库使用体验
2011-09-26 20:12 7254从http://dbeaver.jkiss.org/下 ... -
OCI几个小问题
2011-04-26 10:23 17561、CLOG/BLOG的插入 找了很多OCI的例子以及一些P ... -
关于Oracle中的rownum两个使用原则
2005-12-07 10:49 953rownum 只能< 不能>rownum 是在排序 ... -
突破Oracle for win2k的2G内存限制
2005-12-10 23:54 966....众所周知,在32位的操作系统如win2K上,操作系统能 ... -
访问Oracle Spatial中的SDO_GEOMETRY字段的方法(windows下)
2005-12-10 23:57 27641.使用oci或者occi,在安装oracle后可以在orac ... -
WindowsNT/2000/XP中的Oracle服务简介
2005-12-12 20:19 932这里以9.0.1为例,对9.2以及10g都有效。 注:SID ... -
Oracle服务启动的问题
2005-12-12 20:32 935软件环境: 操作系统:Windows 2000 Advanc ... -
使用 ADO.NET 和 Oracle 进行高级数据访问
2005-12-15 20:47 1310使用 ADO.NET 和 Oracle 进行高级数据访问 [ ... -
Oracle9i中OCCI在VC6下不能DEBUG的问题及解决方法
2006-08-20 17:13 1040前段时间,在csdn论坛上 ... -
看了看几个数据库厂商的发展历史
2006-08-20 18:01 1161这两天把Oracle以及DB2、Sybase、SQL Serv ... -
关于Oracle数据库中的undo回滚段
2006-09-25 22:50 1090Oracle数据库当中,关于日志与回滚那一部分,与别的数据库确 ... -
使用exp/imp传输表空间(Oracle)
2006-09-25 22:52 1065有时候,可以使用exp将 ... -
Oracle中SCN的理解
2006-09-25 22:54 836系统检查点scn(v$database(c ... -
Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理
2007-02-26 20:38 854设有表:createtableblobimg(idintpri ...
相关推荐
- **`StoredQueryInfo`**:该类封装了存储过程的元信息,如名称、参数等,方便在调用过程中使用。 - **`RowMapper`**:这是Apache Commons DBUtils提供的一个接口,用于从数据库结果集中提取数据并映射到Java对象。...
在这段Java代码中,我们使用了`CallableStatement`来调用Oracle存储过程`TESTA`。关键点包括: - `prepareCall`方法用于准备调用存储过程。 - 使用`setString`方法设置输入参数的值。 - 调用`execute`方法执行存储...
### JAVA调用ORACLE存储过程知识点详解 #### 一、背景与概述 在现代软件开发过程中,集成多种技术栈是常态。特别是在企业级应用中,Java 和 Oracle 数据库的组合非常常见。通过 Java 调用 Oracle 存储过程不仅能够...
在Oracle数据库中,触发器是一种特殊类型的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。在这个场景中,我们关注的是一个特定的触发器,它在插入数据后被调用,并通过存储过程来...
### Java存储Oracle中的CLOB类型知识点详解 #### 一、CLOB类型简介及Java操作方法 CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,在Oracle数据库中被广泛使用,可以支持最大4GB的数据量。...
在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储过程。下面将详细讲解这个主题。 首先,`c.sql`、`b.sql`和`student.sql`可能是包含存储过程定义的脚本文件。这些...
Oracle 存储过程是数据库管理中的重要组成部分,它是一组为了完成特定功能的SQL语句集,被编译后存储在数据库中,可以被多次调用,以提高应用程序的性能和效率。本文将深入探讨Oracle存储过程的基础知识、基本语法...
### Java调用Oracle存储过程详解 #### 一、概述 在企业级应用开发中,数据库存储过程被广泛用于实现复杂的业务逻辑处理。由于其高效性和安全性,存储过程常常成为首选方案之一。Java作为主流的企业级开发语言之一...
### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...
Mybatis调用Oracle存储过程的方法详解 Mybatis是一款流行的持久层框架,广泛应用于Java企业级应用开发中。 Oracle存储过程是一种高效的数据库操作方式,通过存储过程可以实现复杂的业务逻辑操作。那么,如何使用...
本文通过示例详细介绍了如何在Java中使用Oracle存储过程。首先,我们创建了一个简单的`BOOK`表以及多个不同功能的存储过程。接着,在Java程序中通过`CallableStatement`对象调用了这些存储过程,包括无返回值的存储...
- **原理**: 通过Java存储过程的方式,使得存储过程可以调用Java类的方法。 - **示例**: 定义一个Java类并注册为存储过程,然后在存储过程中调用该Java方法。 #### 十一、Oracle高效分页存储过程实例 - **实现思路...
在Java应用程序中,可以使用`CallableStatement`来调用存储过程并获取结果集。下面是一个简单的示例: ```java // 创建 CallableStatement 对象 CallableStatement csmt = conn.prepareCall("{call pkg_test.get(?)...
Oracle PlSql 存储过程详解 Oracle PlSql 存储过程是 Oracle 数据库中的一种编程语言,用于实现复杂的业务逻辑和数据处理。下面是对 Oracle PlSql 存储过程的详细介绍: 一、 Oracle 存储过程目录 Oracle 存储...
Java在Oracle数据库中使用存储过程是一项重要的技术,它允许开发者结合Java的强大编程能力与Oracle数据库的高效处理。本文将详细讲解如何在Java环境下创建和使用Oracle存储过程。 首先,我们来看第一种创建Java存储...
2. **SELECT INTO 语句:** 在存储过程中使用`SELECT INTO`语句时,必须确保数据库中有对应的记录,否则会抛出`NO DATA FOUND`异常。 3. **别名与字段名冲突:** 在存储过程中,别名不能与字段名称相同,否则在运行...
根据提供的文件信息,我们可以深入解析如何在Java中通过JDBC(Java Database Connectivity)调用Oracle数据库的存储过程。 ### Java调用存储过程实例:详解 #### 存储过程简介 存储过程是一种在数据库中编写的SQL...
### Java调用Oracle存储过程与分页示例详解 #### 一、无返回值的存储过程调用 在Java中调用Oracle存储过程时,若该过程无返回值,主要利用`CallableStatement`对象来执行。以下是一个具体的示例: ##### 存储过程...
### Oracle存储过程实例详解 #### 一、存储过程概述 在Oracle数据库中,存储过程是一种预编译的SQL代码块,它可以包含...通过上述步骤,我们可以轻松地在Oracle环境中实现存储过程的功能,并通过Java程序进行交互。