设为首页 收藏本站
查看: 2415|回复: 0

[经验分享] PL/SQL与Java程序互相调用

[复制链接]

尚未签到

发表于 2016-11-12 07:14:09 | 显示全部楼层 |阅读模式
  在PL/SQL中,仍然可以调用Java程序定义的方法。需要注意的是,Java程序中定义的方法必须为static,并且需要通过PL/SQL过程或函数进行方法调用。
  对于简单的Java类,可以直接在PL/SQL中定义并通过oracle进行编译:

create or replace and compile java source named "JavaCase"
as
package com.test;
public class JavaCase {
public static String getName(String name){
return "This method returns:"+ name;
}
}
  而稍微复杂的类则需要通过JDK自己编译,使用oracle提供的loadjava utility命令把已经编译完成的clas
  s文件上传到数据库服务器上。对于已经上传的jar或者class文件,可以使用dropjava命令进行删除:

loadjava -user username/pass@ORACLE_SERVER {dir}\HelloWorld.class   
  编译完成之后,使用以下命令查看是否有错误:

SQL> show errors java source JavaCase;
没有错误。
  随后,创建可以调用Java方法的函数:

create or replace function JavaCase(v_name in varchar2)
return varchar2
as
language java name 'com.test.JavaCase.getName(java.lang.String) return java.lang.String';
  创建完毕之后,即可调用该函数来执行对应的Java程序方法:

SQL> select JavaCase('yanh') from dual;
JAVACASE('YANH')
------------------------------------------------------------------------
This method returns:yanh
  同样,使用Java程序也可以调用已经的PL/SQL程序片段;首先在PL/SQL中创建一个函数:

create or replace function searchEmp(no in number) return varchar2 is
emp_record emp%rowtype;
empInfo varchar2(600);
begin
select * into emp_record from emp where empno=no;
empInfo:='name:'||to_char(emp_record.ename)||', empno:'
||to_char(emp_record.empno)||', job:'||to_char(emp_record.job);
return(empInfo);
end searchEmp;
  该函数接收一个数值类型的参数,返回通过查询语句执行的员工信息字符串。将在Java程序中调用该函数:

package com.any.res;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
/**
* @ClassName: ExecutePlSql
* @author Helen
* @date 2015年8月3日 上午11:34:49  
*/
public class ExecutePlSql {
private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
private static String user="scott";
private static String password="tiger";
public static void main(String[] args) {
Connection conn = null;
CallableStatement csmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, user, password);
csmt = conn.prepareCall("{? = call searchemp(?)}");
csmt.registerOutParameter(1, Types.VARCHAR);
csmt.setInt(2, 7788);
csmt.execute();
String retValue = csmt.getString(1);
System.out.println(retValue);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(csmt!=null){
try {
csmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

  以上方法执行后可得到如下输出:name:SCOTT, empno:7788, job:ANALYST.在调用过程时,具有同样的操作流程,关键API是CallableStatement,这个类允许向数据库发送call命令,执行对应的PL/SQL程序段。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-299053-1-1.html 上篇帖子: 在SQL Server2008R2中附加数据库失败 下篇帖子: c#连接MDB,SQL数据库代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表