`

建java存储过程

    博客分类:
  • 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> 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
全文完!

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

分享到:
评论

相关推荐

    Java存储过程实现Oracle远程逻辑备份与恢复.pdf

    【Java存储过程实现Oracle远程逻辑备份与恢复】 Oracle数据库是一个基于网络计算的系统,它内建了对Java的支持,包括Oracle JVM(Java Virtual Machine),这使得开发者能够在数据库服务器端执行复杂的计算任务,...

    MySQL存储过程编程教程.pdf

    2. 创建存储过程程序:掌握事务处理的方法,了解MySQL内建函数的使用,学习如何定义存储过程函数,以及如何创建触发器来响应数据库事件。 3. 在应用程序中使用存储过程:了解如何在不同的编程语言环境中(如PHP、...

    java建站源码

    3. **MyBatis**: 是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和...

    JAVA读取Excel,建库建表,并生成java实体

    下面我们将详细探讨如何使用Java来实现这个过程。 首先,我们需要一个能够读取Excel文件的库。Apache POI是一个广泛使用的Java API,它允许我们处理Microsoft Office格式的文件,包括Excel。通过使用POI库,我们...

    mtons的java的博客建站

    【标题】"mtons的java的博客建站" 指的是一个专注于Java技术的个人博客网站的构建过程。在IT行业中,建立一个个人博客是分享技术知识、记录学习历程和提升个人影响力的有效方式。使用Java作为技术栈,意味着这个博客...

    纯java开发邮件服务器(SMTP和POP3协议)

    在Java中,我们可以使用`MimeMessage`的`reply()`或`forward()`方法来实现这一过程。 在实际开发过程中,为了实现一个完整的邮件服务器,还需要考虑以下几点: 1. **多线程处理**:邮件服务器需要同时处理多个...

    山建java上机实验报告材料及问题详解.doc

    在Java中,`int`用于存储整数。例如,通过`Scanner`类获取用户输入的整数`i`,然后利用`%`运算符判断`i`是否为偶数。如果`i % 2 == 0`,那么`i`是偶数,否则是奇数。此外,还用到了`if-else`语句判断`i`是否在0到9...

    建二叉树编程语言是java

    根据给定的信息,本文将详细解释如何使用Java编程语言构建一个基本的二叉树,并针对提供的代码示例进行深入分析。 ### 建立二叉树的基础知识 #### 二叉树简介 二叉树是一种非线性数据结构,每个节点最多有两个子...

    java实体转mysql建表语句

    在Java开发中,将Java实体类转换为MySQL数据库的建表语句是一项常见的任务,它有助于快速构建数据库模型,尤其在使用ORM(对象关系映射)框架如Hibernate、MyBatis时更为便捷。本篇文章将深入探讨这个过程,并提供...

    Java 实现的微云盘系统(仿百度云盘)

    【Java实现的微云盘系统】是一个基于Java技术构建的在线存储服务,旨在模仿百度云盘的功能和用户体验。该项目的核心目标是提供一个便捷、安全的平台,让用户能够上传、下载文件,并查看自己的云盘空间使用情况。下面...

    用JAVA实现远程图片批量下载

    3. **HTML解析器**:Java提供了一个内建的HTML解析器(Swing HTML解析器),可以方便地解析HTML文档,提取所需的图片链接。 #### 四、设计实现 为了实现远程图片批量下载的功能,可以按照以下步骤进行设计: 1. **...

    java爬取天涯社区

    Java可以通过HttpProxyServer库或者自建代理服务器实现这一功能。 7. **深度与广度优先遍历**:根据需求选择合适的爬取策略,深度优先遍历适用于深度较大的网站,而广度优先遍历则适合爬取页面结构较扁平的网站。 ...

    java KD树的构建

    - **性能优化**:合理使用Java的集合框架,如ArrayList或LinkedList,根据需求选择合适的数据结构来存储子节点。 - **多线程支持**:如果应用需要并行处理,可以考虑实现线程安全的版本,或者在查询过程中使用并发...

    Java自建云盘系统,含客户端与服务端

    【Java自建云盘系统:构建基础与技术详解】 在当今数字化时代,云盘系统已经成为存储、管理和分享数据的重要工具。使用Java自建云盘系统,可以满足个性化需求,提高数据安全性,并允许开发者进行定制化的功能扩展。...

    Java+Weblogic+Oracle整和开发培训教程

    本教程将涵盖Oracle的基本操作,如SQL语言、表和索引的创建、数据查询与更新、存储过程的编写等。除此之外,你还将学习如何在Java应用中使用JDBC(Java Database Connectivity)来连接和操作Oracle数据库,包括连接...

    java开源版企业门户网站_功能齐全,带后台

    同时,“带数据库”说明此系统与数据库紧密集成,用于存储和管理网站的数据,如用户信息、文章、产品数据等。数据库的选择可能会是MySQL、PostgreSQL等关系型数据库,也可能是MongoDB等非关系型数据库,具体取决于...

    java jdk实列宝典 光盘源代码

    调用存储过程,StorageProcedure.java; 一个数据库连接池,JDBCInfo.java; 15 applet java可以编写两类程序,applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java...

    Java文件上传案例

    Servlet 3.0及以上版本提供了内建的支持,可以简化文件上传的处理。 **jsp**(JavaServer Pages)是Java Web开发中的视图层技术,它允许将HTML代码与Java代码混合编写。在文件上传的场景下,jsp可以用来创建用户...

    网建短信包(Java).7z

    【标题】"网建短信包(Java)"是一个与Java编程相关的资源包,它可能是用于构建网络建设中的短信发送功能的代码库或者工具集合。在Java开发中,短信服务通常用于验证用户身份、发送通知或者进行营销活动。这个压缩包...

Global site tag (gtag.js) - Google Analytics