`

如何在Oracle中使用Java存储过程 (详解)

 
阅读更多

其实,这篇短文,我早就应该写了。因为,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
调用完成。

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.

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());
}

}

}

使用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

查询一下状态:

连接到:
Oracle9iEnterpriseEditionRelease
9.2.0.1.0-Production
WiththePartitioning,OLAPandOracleDataMiningoptions
JServerRelease
9.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);
Creatingnewsalgrade
forEMPLOYEE...

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;
}
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

后边的应用示例:

SQL>createorreplacefunctionquery_hisal(gradenumber)returnnumberaslangu
agejavaname
'OracleJavaProc.getHiSal(int)returnint'
;
2/


函数已创建。

SQL
>setserveroutputonsize2000
SQL
>calldbms_java.set_output(2000);

调用完成。
SQL
>selectquery_hisal(5)from
dual;

QUERY_HISAL(
5
)
--------------

9999

全文完!

用法个人见解:不要手动drop java source, 不要手动drop procedure。



分享到:
评论

相关推荐

    JAVA调用ORACLE存储过程通用类

    - **`StoredQueryInfo`**:该类封装了存储过程的元信息,如名称、参数等,方便在调用过程中使用。 - **`RowMapper`**:这是Apache Commons DBUtils提供的一个接口,用于从数据库结果集中提取数据并映射到Java对象。...

    oracle 存储过程 函数 dblink

    在这段Java代码中,我们使用了`CallableStatement`来调用Oracle存储过程`TESTA`。关键点包括: - `prepareCall`方法用于准备调用存储过程。 - 使用`setString`方法设置输入参数的值。 - 调用`execute`方法执行存储...

    JAVA调用ORACLE存储过程

    ### JAVA调用ORACLE存储过程知识点详解 #### 一、背景与概述 在现代软件开发过程中,集成多种技术栈是常态。特别是在企业级应用中,Java 和 Oracle 数据库的组合非常常见。通过 Java 调用 Oracle 存储过程不仅能够...

    oracle 触发器实时调用java 中http接口

    在Oracle数据库中,触发器是一种特殊类型的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。在这个场景中,我们关注的是一个特定的触发器,它在插入数据后被调用,并通过存储过程来...

    java存储oracle中的clob类型

    ### Java存储Oracle中的CLOB类型知识点详解 #### 一、CLOB类型简介及Java操作方法 CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型,在Oracle数据库中被广泛使用,可以支持最大4GB的数据量。...

    oracle的一个简单存储过程实例

    在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储过程。下面将详细讲解这个主题。 首先,`c.sql`、`b.sql`和`student.sql`可能是包含存储过程定义的脚本文件。这些...

    oracle_存储过程详解

    Oracle 存储过程是数据库管理中的重要组成部分,它是一组为了完成特定功能的SQL语句集,被编译后存储在数据库中,可以被多次调用,以提高应用程序的性能和效率。本文将深入探讨Oracle存储过程的基础知识、基本语法...

    java调用oracle存储过程

    ### Java调用Oracle存储过程详解 #### 一、概述 在企业级应用开发中,数据库存储过程被广泛用于实现复杂的业务逻辑处理。由于其高效性和安全性,存储过程常常成为首选方案之一。Java作为主流的企业级开发语言之一...

    java中读取ORACLE中BLOB字段存储的图片

    ### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...

    Mybatis调用Oracle存储过程的方法图文详解

    Mybatis调用Oracle存储过程的方法详解 Mybatis是一款流行的持久层框架,广泛应用于Java企业级应用开发中。 Oracle存储过程是一种高效的数据库操作方式,通过存储过程可以实现复杂的业务逻辑操作。那么,如何使用...

    java中存储过程的使用

    本文通过示例详细介绍了如何在Java中使用Oracle存储过程。首先,我们创建了一个简单的`BOOK`表以及多个不同功能的存储过程。接着,在Java程序中通过`CallableStatement`对象调用了这些存储过程,包括无返回值的存储...

    oracle 存储过程学习经典

    - **原理**: 通过Java存储过程的方式,使得存储过程可以调用Java类的方法。 - **示例**: 定义一个Java类并注册为存储过程,然后在存储过程中调用该Java方法。 #### 十一、Oracle高效分页存储过程实例 - **实现思路...

    oracle的存储过程如何返回结果集

    在Java应用程序中,可以使用`CallableStatement`来调用存储过程并获取结果集。下面是一个简单的示例: ```java // 创建 CallableStatement 对象 CallableStatement csmt = conn.prepareCall("{call pkg_test.get(?)...

    Oracle PlSql 存储过程

    Oracle PlSql 存储过程详解 Oracle PlSql 存储过程是 Oracle 数据库中的一种编程语言,用于实现复杂的业务逻辑和数据处理。下面是对 Oracle PlSql 存储过程的详细介绍: 一、 Oracle 存储过程目录 Oracle 存储...

    Java下使用Oracle存储过程(详解)第1/3页

    Java在Oracle数据库中使用存储过程是一项重要的技术,它允许开发者结合Java的强大编程能力与Oracle数据库的高效处理。本文将详细讲解如何在Java环境下创建和使用Oracle存储过程。 首先,我们来看第一种创建Java存储...

    Oracle_PLSQL_存储过程

    2. **SELECT INTO 语句:** 在存储过程中使用`SELECT INTO`语句时,必须确保数据库中有对应的记录,否则会抛出`NO DATA FOUND`异常。 3. **别名与字段名冲突:** 在存储过程中,别名不能与字段名称相同,否则在运行...

    java调用存储过程实例

    根据提供的文件信息,我们可以深入解析如何在Java中通过JDBC(Java Database Connectivity)调用Oracle数据库的存储过程。 ### Java调用存储过程实例:详解 #### 存储过程简介 存储过程是一种在数据库中编写的SQL...

    java调用oracle存储过程示例+分页示例

    ### Java调用Oracle存储过程与分页示例详解 #### 一、无返回值的存储过程调用 在Java中调用Oracle存储过程时,若该过程无返回值,主要利用`CallableStatement`对象来执行。以下是一个具体的示例: ##### 存储过程...

    oracle 存储过程实例

    ### Oracle存储过程实例详解 #### 一、存储过程概述 在Oracle数据库中,存储过程是一种预编译的SQL代码块,它可以包含...通过上述步骤,我们可以轻松地在Oracle环境中实现存储过程的功能,并通过Java程序进行交互。

Global site tag (gtag.js) - Google Analytics