java的存储过程有什么,如何在Oracle中使用Java存储过程(详解)
大家好,关于java的存储过程有什么很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于如何在Oracle中使用Java存储过程(详解)的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
java servlet调用带有多个返回结果集的存储过程
一、mysql存储过程
这里我先说下我这个功能实现的逻辑及途中遇到的一些问题。这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可)。实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集。我这里当然是为了实现这个效果,所以把它的实现复杂化了。继续说下我今天在mysql上遇到的一个问题,究竟是什么原因,其实我现在也没弄清楚,写这个存储过程前,我给要查询的表中增加了两个字段,然后修改了一个字段的名称,增加的字段到没有任何影响,但是修改过名称的字段就出问题了,在java中调用这个存储过程时,就提示这个字段不存在。之后我将这个修改过的字段再修改回去就好了,下面贴存储过程代码。
1、参数
in sheetOneAccount varchar(50),in sheetTwoAccount varchar(50)
2、代码
1 BEGIN 2/*存储过程*/ 3 declare shareNameIsOrNoExistsVerify varchar(50); 4/*验证第一个参数在第一张表中是否存在*/ 5 SELECT name into shareNameIsOrNoExistsVerify from infosheet 6 where sheetOneAccount=name; 7 if(shareNameIsOrNoExistsVerify is not null) THEN 8/*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的 9值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/10/*这里nameExists AS 0表示用户存在与表中,而且表示第一张表*/11 select*, 0 AS nameExists from infosheet where name=sheetOneAccount;12 ELSE 13/*下面查询人员不存在,返回的自定义字段值就为1, 1 AS nameExists,表示查询用户不存在,14而且表示第一张表*/15 16/*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists这个字段17判断查询的人员是否存在*/18 select name,1 AS nameExists from infosheet limit 0,1;19 end if;20/*验证第二个参数在第二张表中是否存在*/21 set shareNameIsOrNoExistsVerify=null;22 SELECT name into shareNameIsOrNoExistsVerify from studentsheet23 where name=sheetTwoAccount;24 if(shareNameIsOrNoExistsVerify is not null) THEN25/*这里给返回的查询结果表中增加了一个字段,以便客户端接受到之后,首先取这个字段的26值来判断,查询这个用户是否存在,如果存在才去取对应字段的值,减少了客户端的工作量*/27/*这里nameExists AS 2表示用户存在于表中,而且表示第二张表*/28 select*, 2 AS nameExists from studentsheet where name=sheetTwoAccount;29 ELSE 30/*不存在返回的自定义字段值就为3, 3 AS nameExists,表示查询用户不存在,31而且表示第二张表*/32 33/*下面表示没查询到该人员,虽然没查询到但是还是返回了一条数据,所以在取值时,需要先取nameExists这个字段34判断查询的人员是否存在*/35 select name,3 AS nameExists from studentsheet limit 0,1;36 end if;37 END
一、java Servlet
1、调用存储过程方法
1//调用带有多个返回结果集的存储过程 2//这里虽然是查询的结果集,但是我在数据库中写的判断是,只查询出一条数据,所以也不需要在方法中使用re.next遍历 3 public static JSONArray callProcReturnMultipleSet(String sql, String[] parameters){ 4 JSONArray masterJSONArray= new JSONArray(); 5 JSONObject shareJSONObject=new JSONObject(); 6 try{ 7 conn= getConnection(); 8 cs= conn.prepareCall(sql);
9 for(int i=0;i<parameters.length;i++)10{11 cs.setObject(i+1, parameters[i]);
12}13 cs.execute();14 rs= cs.getResultSet();15//如果是返回的多条数据这里,需要用JSONArray来接收。16 shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);17 masterJSONArray.put(shareJSONObject);18 19//下面这个方法就是继续循环出rs中的数据集表,java这个功能做都没.NET好,.NET返回一个dataSet直接用下标取对应的数据集20//如果你还在查询中增加了更多的表没那么继续用下面这个方法循环出数据集21 if(cs.getMoreResults()== true){22 rs= cs.getResultSet();23 shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);24 masterJSONArray.put(shareJSONObject);25//下面如果有第三方那个表,以此类推,同样的方法,或则这里自己可以写一个递归的方法封装下少些代码26//if(cs.getMoreResults()== true){27 28//}29 30}
31 32 33}34 catch(Exception e){35 e.printStackTrace();36 throw new RuntimeException(e.getMessage());37}finally{38 39}40 return masterJSONArray;41}
2、调用
1//调用返回多个结果集的存储过程2 String[] getResultSetParameter=new String[]{"hang","haha"};3 String executProduceStr="call getMultipleResultSetProcudure(?,?)";4 JSONArray rest=(JSONArray) MySqlHepler.callProcReturnMultipleSet(executProduceStr, getResultSetParameter);5 out.println(rest.toString());
3、实现截图
由于本人也是才开始学java,如有不合理之处,请及时指出。
如何在Oracle中使用Java存储过程(详解)
其实,这篇短文,我早就应该写了。因为,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 procedure 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 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 5000SQL>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 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- ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.1.0- ProductionSQL>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 procedure 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 dual;QUERY_HISAL(5)-------------- 9999
全文完!用法个人见解:不要手动drop java source,不要手动drop procedure。
java中如何调用数据库的存储过程(数据库怎么调用存储过程)
Java调用存储过程的方法是通过调用Connection的实例方法prepareCall,prepareCall方法返回对象用于填充存储过程的参数。prepareCall方法形参是调用存储过程的sql语句,此参数的语法格式如下:
1{call(parameter-list)}其中,是存储过程名称,parameter-list是存储过程参数列表。
例如,存储过程名为usp_test,有两个输入参数a,b。则调用代码看起来如下所示:
1好了,关于java的存储过程有什么和如何在Oracle中使用Java存储过程(详解)的问题到这里结束啦,希望可以解决您的问题哈!