在 Oracle 中调用 Java 源的方法
通常有三种方法来创建java存储过程。 一、手动编写Java存储过程/函数 利用SQL脚本代码,手动编写可供Oracle调用的Java存储过程或函数,和普通的存储过程/函数创建方法类,以存储过程为例,语法如下: CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED java_
通常有三种方法来创建java存储过程。
一、手动编写Java存储过程/函数
利用SQL脚本代码,手动编写可供Oracle调用的Java存储过程或函数,和普通的存储过程/函数创建方法类似,以存储过程为例,语法如下:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED java_soure_name
AS
示例:创建一个简单的Hello World输出过程,调用JavaSource实现
- 创建Java Source
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED OracleJavaProc AS public class OracleJavaProc { public static void main(String[] args) { System.out.println("Hello World!"); } }
2. 创建存储过程 ,调用Java Source
CREATE OR REPLACE PROCEDURE testoraclejava AS LANGUAGE JAVA NAME 'OracleJavaProc.main(java.lang.String [])';
3. 调用存储过程
begin dbms_java.set_output(2000); ---设置Java输出缓冲区大小,否则无法输出数据 testoraclejava; ---调用存储过程 end;
二、使用外部class文件装载创建
将外部编译好的Java类文件(*.class)通过命令导入到数据库服务器中,实现Java存储过程的创建。
- 首先,既然要外部文件导入,那么就需要建立一个目录来存放*.class文件
- 其次,将编译好的class文件导入到服务器中
- 创建存储过程,调用导入的Java Source
创建目录和Java Source
SQL> create or replace directory test_dir as 'd:/oracle'; 目录已创建。 SQL> create or replace java class using bfile(test_dir, 'OracleJavaProc.class') 2 / Java 已创建。
TIPS:如果第二步时出现:ORA-29516: Aurora 断言失败: Assertion failure at eox.c:359
Uncaught exception System error: java/lang/UnsupportedClassVersionError 的错误,机器装了多个Java版本,oracle的Java版本低于环境变量设置的版本。
解决办法:用$ORACLE_HOME/jdk/bin/javac 重新编译java文件。
三、使用loadjava命令远程装载并创建
- 先创建一个类:
import java.sql.*; import oracle.jdbc.*; public class OracleJavaProc { //Insert a record to the database. public static void insertRecord(int id, String name, int age ,String xman_id) { System.out.println("Inserting new records for EMP..."); try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "INSERT INTO emp " + "(ID,NAME,SALARY,XMAN_ID) " + "VALUES(?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,id); pstmt.setString(2,name); pstmt.setInt(3,age); pstmt.setString(4,xman_id); pstmt.executeUpdate(); pstmt.close(); } catch(SQLException e) { System.err.println("ERROR! Inserting record: " + e.getMessage()); } } //Select a reords from database public static boolean recordQuery(int id) { System.out.println("Querying records from EMP..."); try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "SELECT * FROM emp WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,id); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+ rs.getInt(3)+"\t"+rs.getString(4)); } return true; } catch (SQLException e) { System.err.println("ERROR! Querying record: " + e.getMessage()); return false; } } }
- 使用loadjava命令将其装载到服务器端并编译:
D:\Oracle>loadjava -u hbi/hbi@orcl -v -resolve OracleJavaProc.java
arguments: '-u' 'hbi/hbi@orcl' '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading : source OracleJavaProc
resolving: source OracleJavaProc
Classes Loaded: 0
Resources Loaded: 0
Sources Loaded: 1
Published Interfaces: 0
Classes generated: 0
Classes skipped: 0
Synonyms Created: 0
Errors: 0
- 创建存储过程和函数:
创建存储过程,实现数据插入:
create or replace procedure INSERT_RECORD(V_ID number, V_NAME varchar2, V_SALARY number, V_XMAN_ID varchar2) as language java name 'OracleJavaProc.insertRecord(int,java.lang.String,int,java.lang.String)';
create or replace function QUERY_TABLE(v_id number) return number as language java name 'OracleJavaProc.recordQuery(int) return int';
- 测试一下结果:
SQL> set serveroutput on size 2000 SQL> call dbms_java.set_output(2000); 调用完成。 SQL> execute add_salgrade(29, 'Charles', 5000, '029'); Inserting new records for EMP... PL/SQL 过程已成功完成。
- 更新你已经编写的Java存储过程
修改好Java源代码后,先dropjava ,再loadjava。
D:\Oracle>dropjava -u hbi/hbi@orcl -v OracleJavaProc
dropping: source OracleJavaProc
D:\Oracle>loadjava -u hbi/hbi@orcl -v -resolve OracleJavaProc.java
arguments: '-u' 'hbi/hbi@orcl' '-v' '-resolve' 'OracleJavaProc.java'
creating : source OracleJavaProc
loading : source OracleJavaProc
resolving: source OracleJavaProc
Classes Loaded: 0
Resources Loaded: 0
Sources Loaded: 1
Published Interfaces: 0
Classes generated: 0
Classes skipped: 0
Synonyms Created: 0
Errors: 0
推荐阅读
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
在Java中,部分文字在转码过程中出现乱码的情况修复方法
-
在JSP中引入Java文件的方法
-
在JSP中引入Java和Vue的实现方法
-
在JSP中嵌入Java代码并添加HTML标签的方法
-
Java实现div元素在页面中的垂直居中方法详解
-
四种在Java中获取当前日期和时间的方法:利用java.util.Date类
-
Intellij IDEA 插件开发入门详解 - 如何添加 Application 和 Project Component,并创建 Action? 在本文中,我们将详细介绍如何在 IntelliJ IDEA 中添加 Application 和 Project Component,并且通过这些组件来创建一个简单的 Action。 首先,我们将在 src 目录上使用 Alt+Insert 快捷键打开 New 对话框,然后从中选择 Application Component 并输入名称如 MyComponent。接下来,我们在 MyComponent 类中添加一个 sayHello 方法并编写相关逻辑。 然后,我们需要为我们的插件添加一个 Action,使用户可以通过菜单或其它方式访问它。为此,我们将创建一个新的类 SayHelloAction 继承自 AnAction 类,并在 actionPerformed 方法中获取 Application 和 MyComponent 对象,最后调用 MyComponent 的 sayHello 方法。 最后,我们需要为我们的插件配置相关的文件以确保它可以正常运行。在本文中,我们将详细介绍如何进行这些配置。
-
在Java中播放视频文件的方法
-
在Java中自定义并使用本地包的方法