当前位置: 首页 > news >正文

oracle 存储过程调用java_oracle 存储过程调用java一

一、如何创建java存储过程?

通常有三种方法来创建java存储过程。

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

e.g. 使用create or replace and compile java source named "" 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

全文完!

文章出处:http://www.diybl.com/course/7_databases/oracle/oraclejs/200838/103247.html

相关文章:

  • java春天_java – 春天的Aspectj
  • java开发微信设计论文_集客微信公众号: 本科毕业设计:基于WxJava框架的集客微信公众号的设计与实现...
  • java 判断是不是英文怎么说_java判断一个字符串是中文还是英文
  • linux+mysql运算符_MySQL 运算符
  • saxreader java_SAXReader saxReader = new SAXReader();来解析xml文件
  • 埃森哲java转sfdc_【SFDC salesforce职责】2021年埃森哲SFDC salesforce岗位职责-看准网...
  • JAVA循环读取菜单_java循环菜单
  • mysql一条sql的执行过程_【MySQL深入】一条SQL的执行过程
  • java高级编程英语单词_Java高级编程
  • 强对象 java_java对象的强引用,软引用,弱引用和虚引用
  • grafana mysql插件_grafana插件动态数据
  • java runtime api_java runtime 入门
  • java中capitals_Java程序按值对映射进行排序
  • PHP两文件嵌套循环引用,thinkphp模板多层循环嵌套无效问题?
  • php提供了什么来实现反射,php提供了什么来实现反射
  • [NodeJS] 关于Buffer
  • 30天自制操作系统-2
  • JavaScript设计模式之工厂模式
  • mysql常用命令汇总
  • Redis在Web项目中的应用与实践
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • SwizzleMethod 黑魔法
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Vue.js-Day01
  • vue-cli在webpack的配置文件探究
  • vue-loader 源码解析系列之 selector
  • 复杂数据处理
  • 面试遇到的一些题
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 事件委托的小应用
  • 第二十章:异步和文件I/O.(二十三)
  • ​ArcGIS Pro 如何批量删除字段
  • ​io --- 处理流的核心工具​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #include
  • (1)bark-ml
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)重识new
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Framework杂记
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET命令行(CLI)常用命令
  • @在php中起什么作用?
  • [Angular 基础] - 数据绑定(databinding)
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [CF]Codeforces Round #551 (Div. 2)
  • [Hive] 常见函数
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • [lintcode easy]Maximum Subarray