问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在Oracle中使用Java存储过程(详解)

发布网友 发布时间:2023-07-31 07:09

我来回答

1个回答

热心网友 时间:2024-07-15 21:26


其实,这篇短文,我早就应该写了。因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。 iihero on csdn) 一、如何创建java存储过程? 通常有三种方法来创建java存储过程。 1. 使用o




其实,这篇短文,我早就应该写了。因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。iihero on csdn)一、如何创建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 procere javademo1 2 as 3 language java name 'JavaDemo1.main(java.lang.String[])'; 4 /过程已创建。SQL>set serveroutput onSQL>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 procere."); }}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 procere testjavaproc as language java name 'OracleJavaProc.main(java.lang.String[])'; 2 /过程已创建。SQL>call testjavaproc();调用完成。SQL>execute testjavaproc;PL/SQL 过程已成功完成。SQL>set serveroutput on size 5000SQL>call dbms_java.set_output(5000);调用完成。SQL>execute testjavaproc;It's a Java Oracle procere.
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 OracleJavaProc.javaarguments: '-u' 'scott/tiger@iihero.oracledb '-v' '-resolve' 'OracleJavaProc.java'creating : source OracleJavaProcloading : source OracleJavaProcresolving: source OracleJavaProc
查询一下状态:
连接到:Oracle9i Enterprise Edition Release 9.2.0.1.0 - ProctionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.1.0 - ProctionSQL>SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE 'JAVA%';OBJECT_NAME--------------------------------------------------------------------------------OBJECT_TYPE STATUS------------------------------------ --------------OracleJavaProcJAVA CLASS VALIDOracleJavaProcJAVA SOURCE VALID
测试一下存储过程:
SQL>create or replace procere add_salgrade(id number, losal number, hisal number) as language java name 'OracleJavaProc.addSalGrade(int, int, int)'; 2 /过程已创建。SQL>set serveroutput on size 2000SQL>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 OracleJavaProcD:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve OracleJavaProc/tiger@iihero.oracledb.javaarguments: '-u' 'scott/tiger@iihero.oracledb' '-v' '-resolve' 'OracleJavaProc.java'creating : source OracleJavaProcloading : source OracleJavaProcresolving: source OracleJavaProc
后边的应用示例:
SQL>create or replace function query_hisal(grade number) return number as language java name 'OracleJavaProc.getHiSal(int) return int'; 2 /函数已创建。SQL>set serveroutput on size 2000SQL>call dbms_java.set_output(2000);调用完成。SQL>select query_hisal(5) from al;QUERY_HISAL(5)-------------- 9999
全文完!用法个人见解:不要手动drop java source, 不要手动drop procere。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
胶原蛋白线双眼皮是不是永久性 双眼皮埋线是蛋白质还是尼龙绳-双眼皮埋线蛋白线多久能吸收 人体输液的“港口”完全植入式输液港 双眼皮宽变窄修复的方法 同心保家庭重疾险靠不靠谱?便宜吗? 做完双眼皮一宽一窄怎么办 喝全脂奶粉对长高有没有什么好处? redmine中“选择一个项目..."下拉列表框中为什么只列出一个项目,我建... 南充市龙门中学实力现在怎样?他的奥赛班是重点班么? 感情中为什么总是不知足呢? 屈原(生活时期.代表作品,评价)??? 书法家苏国华价格 单位欠交的取暖费已二十多年,现买房更名受阻,怎么办 欠二十年取暖费会怎样 昆山二代更换三代报销比例一样吗 出门不在家花怎么浇水 四川民航大学2023录取分数线是多少 亚洲龙汽车排气管可以打个小眼吗 ...人人上发现视频和音乐不能播放,反而是idm直接下载了,求帮助_百度知 ... 怎么挽回自己分手的女人 如何挽回失去的女朋友? “的确良”是什么东西,是不是一个店铺名字? 怎么从隐私政策进入网站 天津融创滨海中心写字楼房价多少钱一平? 潍坊福润得商务中心写字楼房价多少钱一平? 黔西南博强商务写字楼房价多少钱一平? 发现老公有外遇应该怎么办 【小老鼠过生日的故事】小老鼠过生日故事_ 故事 今天360抢票王怎么用不了 怎么把笔记本的有线网络共享给 无线网络使用,两台笔记本电脑有... 怎样进行心里健康教育 现场急救时护理工作的主要任务不包括 云顶之弈游戏里的陌生人怎么才能拉到黑名单里 云顶之弈把其他人地图关闭 烟囱冒火星怎么处理啊,高手请教一下谢谢。我家的锅炉有引风机! q8400跟g850cpu哪个好? q85 6-qw-60(500)和q850 6-qw-65可以通用吗? q850错误值 固态硬盘。。东芝q,mx200和三星850evo.怎么选? 我国华南该图未完全完成,Q处湖泊的海拔为什么大于850?最有可能形成瀑布... 美的天然气热水器e5故障怎么排除 四年级下册时代学习报语文周刊43期答案 四年级下册语文时代报41期答案? 绑定了银行卡怎么取消 ...了5万元小额贷款,审核通过了,公司打电话过来说必须在银行卡上... ...他们要我先存20%的资金到我自己的银行卡,然后再放款给我,这是诈骗... 小额贷款先存钱到自己的银行卡里面看看有没有还款能力是真的吗? 个人货款叫先存钱在自己的银行卡是不是骗人的 ...需要在自己的卡里先存钱吗?对方会把我卡里的钱取走吗? 在手机上签了贷款合同,然后叫存钱在银行卡验证,是不是骗子?