`
antivir
  • 浏览: 95288 次
  • 来自: ...
社区版块
存档分类
最新评论

oracle存储过程调用java class

阅读更多
http://blog.csdn.net/Phoenix_99/archive/2009/11/27/4886907.aspx
一、如何创建java存储过程?
通常有三种方法来创建java存储过程。

1. 使用oracle的sql语句来创建:

e.g. 使用create or replace and compile java source named "<name>" as
       后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。

SQL> create or replace and compile java source named "javademo1"
  2  as
  3  import java.sql.*;
  4  public class JavaDemo1
  5  {
  6  public static void main(String[] argv)
  7  {
  8  System.out.println("hello, java demo1");
  9  }
10  }
11  /

Java 已创建。

SQL> show errors java source "javademo1"
没有错误。

SQL> create or replace procedure javademo1
  2  as
  3  language java name ''JavaDemo1.main(java.lang.String[])'';
  4  /

过程已创建。

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的某一目录下边。


public class OracleJavaProc
{
    public static void main(String[] argv)
    {
        System.out.println("It''s a Java Oracle 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  /

Java 已创建。

SQL> create or replace procedure testjavaproc as language java name ''OracleJavaProc.main(java.lang.String[])'';
  2  /

过程已创建。

SQL> call testjavaproc();

调用完成。

SQL> execute testjavaproc;

PL/SQL 过程已成功完成。

SQL> set serveroutput on size 5000
SQL> call dbms_java.set_output(5000);

调用完成。

SQL> execute testjavaproc;
It''s a Java Oracle procedure.
3. 我推荐的一种方法,直接使用loadjava命令远程装载并创建。
    先创建一个类, 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) ...{

      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(?,?,?)";
         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: "
           + 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
查询一下状态:


连接到:
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

SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE ''JAVA%'';

OBJECT_NAME
--------------------------------------------------------------------------------

OBJECT_TYPE                          STATUS
------------------------------------ --------------
OracleJavaProc
JAVA CLASS                           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)'';
  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...

PL/SQL 过程已成功完成。

SQL> select * from salgrade where grade=6;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         6      10000      15000


二、如何更新你已经编写的java存储过程? 

假如要往类OracleJavaProc里添加一个存储过程方法,如何开发?
正确的步骤应该是先dropjava, 改程序,再loadjava。

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) ...{

      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(?,?,?)";
         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: "
           + 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, grade);
        ResultSet rset = pstmt.executeQuery();
        int res = 0;
        if (rset.next())
        ...{
            res = rset.getInt(1);
        }
        rset.close();
        return res;
       }
    catch (SQLException e)
    ...{
        System.err.println("ERROR! Querying Salgrade: "
           + e.getMessage());
          return -1;
    }   
   }
     
}

如何更新呢?


D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc

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> create or replace function query_hisal(grade number) return number as langu
age java name ''OracleJavaProc.getHiSal(int) return int'';
  2  /

函数已创建。

SQL> set serveroutput on size 2000
SQL> call dbms_java.set_output(2000);

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

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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Phoenix_99/archive/2009/11/27/4886907.aspx
分享到:
评论

相关推荐

    个人亲测oracle触发器调用java程序

    这将创建一个名为test的存储过程,该存储过程调用Java程序的modify方法。 四、创建触发器 最后,我们需要创建一个触发器来调用存储过程。我们可以使用CREATE TRIGGER语句来实现这一步骤。例如: ``` create or ...

    Spring jdbcTemplate调用Oracle存储过程返回List集合

    下面是使用 Spring jdbcTemplate 调用 Oracle 存储过程返回 List 集合的 Java 代码: ```java package com.zc.test; import java.sql.CallableStatement; import java.sql.ResultSet; import java.sql....

    oci-java-sdk:适用于Java的Oracle Cloud Infrastructure SDK

    您可以通过调用exec:java目标并为exec.mainClass和.exec.arguments属性传递适当的值来运行任何示例,例如: ObjectStorageGetBucketExample类需要3个参数,分别是隔离专区的OCID,存储区名称,对象名称。...

    java开源包1

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    JAVA上百实例源码以及开源项目源代码

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    JAVA上百实例源码以及开源项目

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    java开源包4

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包11

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包6

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包101

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包9

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包5

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包8

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包10

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包3

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    Java面试宝典2020修订版V1.0.1.doc

    19、用JDBC如何调用存储过程 69 20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 ...

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

    java面试宝典

    189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is HTTP Session tracking and why is it important? 45 191、What is session management, and how is ...

    java开源包2

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

    java开源包7

    php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包...

Global site tag (gtag.js) - Google Analytics