java编写Oracle存储过程

      Oracle里可以使用多种语言来编写存储过程,比如Pro*C/C++,PL/SQL,COBOL,在Oracle8i开始支持用Java编写存储过程。用pl/sql写存储过程对很多人来说时比较陌生的,用自己熟悉的语言处理起来也比较方便。

      用到用java编写存储过程,网络上的一些资料有些乱,在这简单的整理下使用过程,和注意的地方。

 

Java存储过程与一般的JDBC程序有所不同的

有安全限制,毕竟是在oracle内部运行的,不允许访问操作系统的资源,如文件。 获取数据库联接方式,connection = new OracleDriver().defaultConnection(); 或则Connection conn = DriverManager.getConnection("jdbc:default:connection:"); System.out,System.err,System.in等输入输出有所不同。可以利用某些命令重定向。

 

下面是一个简单的例子

第一步:在plsqldeveloper里,java source里增加一个TestJava1类,也可以直接从IDE中拷贝过来

 

create or replace and compile java source named HelloJava as

import oracle.jdbc.OracleDriver;

public class HelloJava{
  public static void test(int m,float){
     //Connection conn    = new OracleDriver().defaultConnection();
     // 或则Connection conn = DriverManager.getConnection("jdbc:default:connection:");
     //其它部分和一般的JDBC程序一样就可以了
   System.out.println("Hello");
  }
}

 执行它,以保存并编译

 

第二步:增加一个procedure,在command window里执行如下命令:

create or replace procedure myTest(n number,m float)
      as language java 
name 'HelloJava.test(int,float)';

  注意:必须写成float,不能写成java.lang.Float,String型应该写成java.lang.String

第三步:在command window里输入

SET SERVEROUTPUT ON;   
CALL dbms_java.set_output(2000); 

 以使System.out重定向到当前窗口;

第四步:

    在command window里输入,exec myTest(1,1.0); 
    即可看到结果:

    Hello

 

==============================分隔线===========================================

以下转载自:WPS2000的窝的博客

地址:http://hi.baidu.com/zhangsilly/blog/item/fa513438c731b62b96ddd8a4.html

这段时间一直是在和存储过程打交到,PL/SQL很好好强大,但Java其实也不慢(比起PHP)

Java编写存储过程
获取连接 (Class.forname 可以省掉了)
       Connection conn    = new OracleDriver().defaultConnection();
       或者
       Connection conn = DriverManager.getConnection("jdbc:default:connection:");

其它部分和一般的JDBC程序一样就可以了

import java.sql.Connection;
import java.sql.PreparedStatement;
import oracle.jdbc.OracleDriver;
/**
 *@author Zhangxinling
 */
public class PorcedureSample{
          public static void sample(long number) throws SQLException{
               Connection conn = new OracleDriver().defaultConnection();
               conn.setAutoCommit(false);
               PreparedStatement ptmt 
                                 = conn.prepareStatement("INSERT INTO test values(??)");
               for(long i=0L;i<number;i++){
                    stmt.setLong(1,i);
                    stmt.setString(2,"Zhangxinling@kingsoft.com");
                    stmt.executeUpdate();
               }
               stmt.close();
          }
}
 



部署:
      将编写好的Java源代码拷贝到服务器上(我本地是 JDK 1.6 u 12 的,编译的在Oracle 1.42 的JDK上一般来说是运行不了的,不过没试过直接使用编译好的 .class 文件),使用 oracle 自带的 jdk 编译:

       E:\oracle\product\10.2.0\db_1\jdk\bin\javac -classpath E:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar PorcedureSample.java

      打开 em(Enterprise Manager) ,点击 Schema 下的 Java Classes ,点击 Load Java 按钮, Schema 选择你要挂的Schema,这里我选择 TEST
Schema ,看看刚刚的那个 Class 状态是否是 Valid ,不是的话多compile几次

建存储过程:

      然后 Search 这个



测试:
速度还是飞快的(上例速度约是 PL/SQL的 1/3):

==============================================================================

测试代码,参数均为 100000(10w),调用2次:
Java版:8.64秒、8.069秒
PL/SQL版:3.219秒、3.094秒

(以上结果来自于一台默认安装的 Windows XP 机器,未做任何优化)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值