ORACLE存储过程调用JAVA CLASS类
如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程(详解)如何在Oracle中使用Java存储过程(详解)一、如何缔造java存储过程?通常有三种步骤来缔造java存储过程。
1. 使用oracle的sql语句来缔造:e.g. 使用create or replace and compile java source named "" as后边跟上java源程序。
要求类的步骤必须是public static的,威力用于存储过程。
1.SQL> create or replace and compile java source named "javademo1"2. as3. import java.sql.*;4. public class JavaDemo15. {6. public static void main(String[] argv)7. {8. System.out.println("hello, java demo1");9. }10. }11. /12.13.Java 已14.15.缔造。
16.17.SQL> show errors java source "javademo1"18.没有19.20.舛误。
21.22.SQL> create or replace procedure javademo123. 2 as24.3 language java name JavaDemo1.main(/doc/58c87bea102de2bd970 58806.html ng.String[]);25. 4 /26.27.过程已28.30.31.SQL> set serveroutput on32.SQL> call javademo1();33.34.调用35.实现。
36.37.SQL> call dbms_java.set_output(5000);38.39.调用40.实现。
Java调用Oracle存储过程详解

Java调⽤Oracle存储过程详解Java调⽤Oracle存储过程详解步骤:1、编写Oracle存储过程2、编写数据库获取连接⼯具类3、编写简单应⽤调⽤存储过程实现:1、Oracle存储过程:/*测试表*/create table test(id varchar2(32),name varchar2(32));/*存储过程插⼊数据*/CREATE OR REPLACE PROCEDURE insert_procedure(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO test (id, name) VALUES (PARA1, PARA2);END insert_procedure;/*存储过程返回结果集*/CREATE OR REPLACE PROCEDURE select_procedure(para_id IN VARCHAR2,name OUT sys_refcursor /* 这个sys_refcursor类型在SYS.STANDARD包中 */) ASBEGINOPEN name FORSELECT * FROM test WHERE id = para_id;END;2、JDBC⼯具类import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DBUtil {public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";public static final String URL = "jdbc:oracle:thin:@localhost:1521/orcl";public static final String USERNAME = "pfm";public static final String PASSWORD = "pfm";/*** 通过静态代码块注册数据库驱动*/static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获得Connection** @returnConnection conn = null;try {conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) {e.printStackTrace();}return conn;}/*** 获得Statement** @return*/public static Statement getStatement() {Statement st = null;try {st = getConnection().createStatement();} catch (SQLException e) {e.printStackTrace();}return st;}/*** 关闭ResultSet** @param rs*/public static void closeResultSet(ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭Statement** @param st*/public static void closeStatement(Statement st) {if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭Connection** @param conn*/public static void closeConnection(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭全部** @param rs* @param sta* @param connpublic static void closeAll(ResultSet rs, Statement sta, Connection conn) {closeResultSet(rs);closeStatement(sta);closeConnection(conn);}}3、调⽤存储过程:import java.sql.CallableStatement;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import oracle.jdbc.driver.OracleTypes;/*** 测试调⽤存储过程**/public class StoredTest {public static void main(String[] args) {insert_call();//select_call();}/*** 执⾏存储过程插⼊数据*/public static void insert_call() {Connection conn = DBUtil.getConnection();PreparedStatement pst = null;CallableStatement proc = null; // 创建执⾏存储过程的对象try {proc = conn.prepareCall("{ call insert_procedure(?,?) }");proc.setString(1, "1"); // 设置第⼀个输⼊参数proc.setString(2, "hello call"); // 设置第⼀个输⼊参数proc.execute();// 执⾏} catch (SQLException e) {e.printStackTrace();} finally {try {// 关闭IO流proc.close();DBUtil.closeAll(null, pst, conn);} catch (Exception e) {e.printStackTrace();}}}/*** 执⾏存储过程查询数据*/public static void select_call() {Connection conn = DBUtil.getConnection();CallableStatement stmt;try {stmt = conn.prepareCall("{ call select_procedure(?, ?) }"); // ⽤此调⽤⽅法不能实现多⾏语法 stmt.setString(1, "1");stmt.registerOutParameter(2, OracleTypes.CURSOR);stmt.execute();ResultSet rs = (ResultSet) stmt.getObject(2);while (rs.next()) {System.out.println(rs.getString("name"));}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.closeConnection(conn);}}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
oracle调用JAVA类的方法

oracle调⽤JAVA类的⽅法导⼊jar包在oracle中导⼊需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle⾥⾯写简单的调⽤就可以了, 1、操作系统需要拥有⽀持loadjava命令的jdk。
2、加载jlha.jar包,到oracle数据库中。
操作过程:在dos环境下,输⼊命令: loadjava -r -f -o -user usscares/usscares@usscares jlha.jar注意:jar包要在1.4的环境下编译,项⽬右键 properties java compiler compoler compliance level 1.4 即可否则报version 49 类似的错误调⽤JAVA类oracle调⽤JAVA类的⽅法主要有以下三种:1. ⽤loadjava⽅法装载;可能是调试⽅便,据说这种⽅法⽐较通⽤。
c:\test\hello.javaJava Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15public class hello{public static void main(String[] args){System.out.println("Hello");hello h = new hello();h.insertM(9);}public static void insertM(int pid){System.out.println("This is the method insertM."); }}C:\test>loadjava -u -v -resolve hello.javaSQL> create procedure prc_hehe as language java name 'hello.main(ng.String[])过程已创建。
SQL> call prc_hehe();调⽤完成。
存储过程调用java代码的方法

存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。
在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。
2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。
3)设置输入参数和输出参数。
输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。
4)执行存储过程。
可以使用execute()或executeUpdate()方法执行。
5)获取输出参数。
以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。
以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。
```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。
用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客

用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客三:返回列表由于oracle存储过程没有返回值,它的所有返回值都是通过out 参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。
如下:CREATE OR REPLACE PACKAGE TESTPACKAGE ASTYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;2,建立存储过程,存储过程为:CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.T est_CURSOR) ISBEGINOPEN 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.CURS OR);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) { }}}}。
Oracle集合类型输出参数的PLSQL存储过程及其Java调用

Oracle集合类型输出参数的PL/SQL存储过程及其Java调用- -有段时间为了用存储过程做统计报表,写了这文章。
现在的java的数据库-关系映射技术似乎不提倡用存储过程,其实存储过程更能发挥数据库的效率。
1 引言存储过程因其执行效率高、与事务处理的结合、运行更安全等优点,在数据库应用程序中被广泛采用。
PL/SQL是用于从各种环境中访问Oracle数据库的一种编程语言,它与数据库服务器集成在一起,PL/SQL编写的存储过程编译效率高,网络系统开销小,同时PL/SQL直观性好,是大多数人的选择。
以Number、Varchar等基本标量类型为输出参数的PL/SQL存储过程,每个输出参数只能返回一个对应值。
而在实际数据库应用程序中,尤其是在进行系统综合查询统计时,往往需要返回二维数组或结果集,这时应考虑在存储过程中使用集合这种数据结构。
对于集合,我们可以一次把许多元素作为一个整体进行操作,也可以对集合中的单个元素进行操作,使用方便、灵活。
2 PL/SQL存储过程及Java程序的编写2.1 索引表作为输出参数索引表是无约束的,其大小的唯一限制(除可用内存外)就是它的关键字BINARY_INTEGER类型所能表示数值的约束(-2147483647...+2147483647),其元素不需要按任何特定顺序排列。
在声明时,我们不需要指定其大小,而且对索引表的元素可以直接赋值,不用初始化,可见使用索引表极其方便。
2.1.1存储过程的编写我们可以在PL/SQL语句块中定义索引表,但作为输出参数的索引表,必须要在包(package)里定义,方法如下:create or replace package out_param is---- 定义了元素是varchar2类型的一个索引表类型type out_index_table_typ is table of varchar2(50) index by binary_integer;end out_param;接下来就可以在pl/sql存储过程里引用在包里定义的索引表类型:create or replace procedure testPro1(in_param in varchar2,o_table out out_param. out_index_table_typ ) isbegin-------这里略去程序体end testPro1;其中,返回的索引表类型前必须用包名加上句点来引用out_param. out_index_table_typ 2.1.2 J ava程序的编写索引表与数据库表很形似,有key和value两列,但它不是真正的数据库表,不可以存储到数据库中。
论在Oracle中调用Java类

论在Oracle中调用Java类一、写作目的在生产系统中,往往会有一种情况是通过Oracle存储过程来调用Java程序,已达到更优的处理结果。
现就在生产过程中遇到的问题来简介在Oracle中如何调用Java类。
二、Oracle调用Java类简介Oracle数据库的Instance是由SGA和process组成的,在SGA中有6个不同的池,分别为Large pool,Java pool, Shared pool,Redo buffer,Block buffers 和Fixed SGA 。
Java 池(Java pool)是Oracle 8.1.5版本中增加的,目的是支持在数据库中运行Java。
存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来。
这种分离可以降低整个应用程序的复杂性,并提供其重用性、安全性、性能和可伸缩性。
但是,妨碍存储过程广泛采用的一个主要障碍是不同数据库厂商使用各种专有的、且依赖于数据库的实现语言。
使用基于Java的存储过程可以解决这一问题。
Oracle已经实现了ANSI 标准,这些标准规定了从SQL中将静态Java方法作为过程或函数进行调用的能力。
这种实现被简单地称作"Java存储过程"。
三、生产中遇到的问题在EBS生产环境中,银行给员工发工资时,在进行账户校验以及付款时,是以并发请求的形式调用Java程序,表现出运行效率极低,付一笔款需要2-3分钟,分析原因有:1、并发程序运行时,会多次调用并发管理器,会有耗时。
2、如果此时有多个并发程序在运行,也会降低程序运行效率。
3、生产环境数据量巨大,也会对付款程序运行效率有影响。
解决方案:通过以上分析,原因2和3在生产上是在所难免的,可优化的余地并不是很大,因此,我们决定直接通过oracle调用java类,越过并发程序这一步骤,减少调用并发管理器的时间,从而缩短付款流程的时间,提升付款效率。
Oracle8i中使用Java语言来开发存储过程

Oracle8i中使用Java语言来开发存储过程在Oracle8i之前,开发人员只能使用PL/SQL来开发存储过程。
而在Oracle8i之中,不仅可以使用原有的PL/SQL开发存储过程,而且也可以使用Java语言来开发存储过程。
本篇文章将简单介绍关于这方面的知识,包括以下内容:∙存储过程简介;∙Java存储过程∙Java存储过程的开发步骤∙使用Java开发过程;∙使用Java开发函数;∙使用Java开发包;∙使用Java开发触发器;∙使用Java开发对象方法;∙使用JDeveloper开发JSP。
存储过程简介存储过程是存储在数据库中的一段存储程序。
当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。
设计存储过程的方针∙在定义存储过程时,要使用其完成单一、相对集中的任务。
∙在定义存储过程时,不要定义已经由其它特征所提供功能的过程。
例如,不要定义强制数据完整性的过程(使用完整性约束)。
2. 存储过程的优点1) 安全性当创建了存储过程之后,可以将执行该过程的权限授予其它用户,从而使得他可以执行特定的数据库操作,而不能访问其它模式对象(例如表)。
例如,你可以将执行过程(更新表)的权限授予其它用户,但不授予它们直接访问该表的权限。
2) 性能∙存储过程只被发送到数据库一次,相对于SQL语句或PL/SQL块而言,其网络通信量更小。
∙当调用存储过程时,数据库会直接运行该存储过程,无需进行编译。
相对于SQL语句或PL/SQL块而言,其执行速度更快。
3) 内存分配存储过程充分利用了Oracle共享内存的能力。
在将存储过程装载到内存中后,多个用户可以同时调用该存储过程,从而降低了应用对Oracle的实际内存需求。
4) 生产力存储过程提高了开发生产力。
通过将公共集合编写为存储过程,避免了冗余代码,从而提高了开发生产力。
例如,我们可以编写用于插入、更新、删除AUTHS表的过程,此后应用可以直接调用这些过程,而无需重写SQL语句。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL> create or replace procedure testjavaproc as language java name ''OracleJavaProc.main(ng.String[])'';
2/
过程已创建。
SQL> call testjavaproc();
过程已创建。
SQL> set serveroutput on SQL> call javademo1();
调用完成。
SQL> call dbms_java.set_output(5000);
调用完成。
SQL> call javademo1(); hello, java demo1
调用完成。
SQL> call javademo1(); hello, java demo1 调用完成。 2. 使用外部 class 文件来装载创建 e.g. 这里既然用到了外部文件,必然要将 class 文件放到 oracle Server 的某一目录 下边。
e.g.修改 OracleJavaProc 类内容如下:
import java.sql.*; import oracle.jdbc.*;
public class OracleJavaProc ...{
// Add a salgrade to the database. public static void addSalGrade(int grade, int losal, int hisal) ...{
+ e.getMessage()); } } } 使用 loadjava 命令将其装载到服务器端并编译:
D:eclipse3.1workspacedbtest>loadjava -u scott/tiger@iihero.oracledb -v -resolve Or acleJavaProc.java arguments: ''-u'' ''scott/tiger@iihero.oracledb ''-v'' ''-resolve'' ''OracleJavaProc.java'' creating : source OracleJavaProc loading : source OracleJavaProc resolving: source OracleJavaProc 查询一下状态:
OBJECT_TYPE US ------------------------------------ -------------OracleJavaProc JAVA CLASS
STAT VALID
OracleJavaProc JAVA SOURCE 测试一下存储过程:
VALID
SQL> create or replace procedure add_salgrade(id number, losal number, hisal num ber) as language java name ''OracleJavaProc.addSalGrade(int, int, int)'';
+ e.getMessage()); } }
public static int getHiSal(int grade) ...{
try ...{ Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "SELECT hisal FROM salgrade WHERE grade = ?"; PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1,
D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or acleJavaProc/tiger@iihero.oracledb.java arguments: ''-u'' ''scott/tiger@iihero.oracledb'' ''-v'' ''-resolve'' ''OracleJavaProc.java'' creating : source OracleJavaProc loading : source OracleJavaProc resolving: source OracleJavaProc 后边的应用示例:
SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE ''JAVA%'';
OBJECT_NAME --------------------------------------------------------------------------------
oracle 存储过程调用 java class
文章分类:Java 编程 /Phoenix_99/archive/2009/11/27/4886907.aspx 一、如何创建 java 存储过程? 通常有三种方法来创建 java 存储过程。
1. 使用 oracle 的 sql 语句来创建:
10 } 11 /
Java 已创建。
SQL> show errors java source "javademo1" 没有错误。
SQL> create or replace procedure javademo1 2 as 3 language java name ''JavaDemo1.main(ng.String[])''; 4/
public class OracleJavaProc {
public static void main(String[] argv) {
System.out.println procedure."); } }
SQL> grant create any directory to scott;
授权成功。
SQL> conn scott/tiger@iihero.oracledb 已连接。 SQL> create or replace directory
目录已创建。
test_dir
as ''d:\oracle'';
SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.class') 2/
System.out.println("Creating new salgrade for EMPLOYEE...");
try ...{ Connection conn = DriverManager.getConnection("jdbc:default:connection:");
String sql = "INSERT INTO salgrade " + "(GRADE,LOSAL,HISAL) " + "VALUES(?,?,?)";
先创建一个类, e.g.
import java.sql.*; import oracle.jdbc.*;
public class OracleJavaProc ...{
//Add a salgrade to the database. public static void addSalGrade(int grade, int losal, int hisal) ...{
2/
过程已创建。
SQL> set serveroutput on size 2000 SQL> call dbms_java.set_output(2000);
调用完成。
SQL> execute add_salgrade(6, 10000, 15000); Creating new salgrade for EMPLOYEE...
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production
PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,grade); pstmt.setInt(2,losal); pstmt.setInt(3,hisal); pstmt.executeUpdate(); pstmt.close(); } catch(SQLException e) ...{ System.err.println("ERROR! Adding Salgrade: "
PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,grade); pstmt.setInt(2,losal); pstmt.setInt(3,hisal); pstmt.executeUpdate();