存储过程调用java代码的方法
- 格式:doc
- 大小:13.15 KB
- 文档页数:3
jfinal调用存储过程JFinal是一款非常优秀的Java Web框架,它提供了很多方便快捷的操作方法,包括调用存储过程。
本文将介绍JFinal如何调用存储过程,以及一些注意事项。
一、准备在使用JFinal调用存储过程之前,需要先准备好以下内容:1. 在数据库中创建存储过程;2. 在JFinal的配置文件中添加数据库连接信息;3. 导入相关的jar包,包括mysql-connector.jar、jfinal.jar等。
二、调用存储过程JFinal调用存储过程的方式很简单,只需要使用e()方法即可。
e()方法有两个参数,第一个参数是数据源名称,第二个参数是要执行的SQL语句。
例如,以下代码调用了一个名为“test”的存储过程:String sql = "{call test(?,?)}";e().call(sql, "param1", "param2");在上面的例子中,通过“{}”括号包裹存储过程的名称和参数,使用“?”作为占位符,然后在调用e().call()方法时,将参数值传入即可。
三、注意事项在调用存储过程时,需要注意以下几点:1. 参数类型要与存储过程中的参数类型一致;2. 如果存储过程返回结果集,可以使用e().query()方法获取结果集;3. 如果存储过程中使用了事务,需要在执行前设置e().tx()。
四、总结本文介绍了JFinal调用存储过程的方法及注意事项。
虽然JFinal的调用方法非常简单,但在实际应用过程中,需要注意参数类型,传递参数的方式等问题。
希望本文能够对JFinal开发人员有所帮助。
Java中调用存储过程或存储函数的方法.txt机会就像秃子头上一根毛,你抓住就抓住了,抓不住就没了。
我和你说了10分钟的话,但却没有和你产生任何争论。
那么,我们之间一定有个人变得虚伪无比!过错是短暂的遗憾,错过是永远的遗憾。
相遇是缘,相知是份,相爱是约定,相守才是真爱。
1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{call package_name.procedure_name(?,?,?,?,?)}");clstmt.setString(1, bill.getBillType());clstmt.setString(2, bill.getId());clstmt.setInt(3, bill.getNum());clstmt.registerOutParameter(4, Types.CHAR);clstmt.registerOutParameter(5, Types.VARCHAR);clstmt.execute();out_opresult = clstmt.getString(4).trim();out_operror = clstmt.getString(5).trim();} catch (SQLException e) {System.out.println(e.getMessage());}2.调用存储函数:CallableStatement clstmt = null;try {clstmt = conn.prepareCall("{? = call package_name.function_name(?,?,?,?)}");clstmt.registerOutParameter(1, Types.VARCHAR);clstmt.setString(2, bill.getBillType());clstmt.setString(3, bill.getId());clstmt.registerOutParameter(4, Types.CHAR);clstmt.registerOutParameter(5, Types.VARCHAR);clstmt.execute();out_opresult = clstmt.getString(4).trim();out_operror = clstmt.getString(5).trim();} catch (SQLException e) {System.out.println(e.getMessage());}* 存储过程编写时应注意:1.输出参数不能作为查询条件;eg:假设,out_id已赋值,SELECT nameINTO out_nameFROM tb_testWHERE id = out_id;这样写PL/SQL中会正常通过,而在Java程序调用该存储过程时会报错,需要改成: v_id CHAR(8) := '';先对v_id赋值,SELECT nameINTO out_nameFROM tb_testWHERE id = v_id;这样PL/SQL和Java程序中都可正常通过和调用。
oracle存储过程调用javasource的方法Oracle存储过程调用Java方法介绍在Oracle数据库中,我们可以使用存储过程来执行一系列的数据库操作。
有时候,我们希望在存储过程中调用Java方法,以实现一些比较复杂的逻辑。
本文将详细介绍在Oracle存储过程中调用Java方法的几种方法。
方法一:使用Java Stored ProcedureJava Stored Procedure是Oracle数据库提供的一种特殊的存储过程类型,在该类型的存储过程中可以直接调用Java方法。
步骤:1.创建Java类,并将其编译成字节码文件(.class文件)。
2.将字节码文件导入到数据库中,可以使用loadjava工具或通过SQL语句执行导入。
3.创建Java Stored Procedure,将其指定为刚导入的字节码文件,并编写实际的存储过程逻辑。
4.在需要的地方调用Java Stored Procedure。
优点:•简单易用,只需创建Java类和Java Stored Procedure即可。
•可以直接访问数据库,无需通过其他方式。
缺点:•必须将Java类编译成字节码文件并导入到数据库中,稍显麻烦。
•Java Stored Procedure在数据库中运行,可能会造成数据库性能的损耗。
方法二:使用外部过程调用Java方法Oracle数据库通过提供外部过程功能,允许我们在存储过程中调用外部的Java方法。
步骤:1.将Java方法包装成Java函数或Java过程,并将其编译成动态加载库文件(.so或.dll文件)。
2.使用CREATE LIBRARY语句在数据库中创建对应的外部库。
3.创建存储过程,将其指定为调用外部库中的函数或过程,并编写实际的存储过程逻辑。
4.在需要的地方调用存储过程。
优点:•可以方便地调用已存在的Java方法,无需修改原有代码。
•外部过程在数据库外部运行,不会对数据库性能造成影响。
在Java中调用存储的过程在Java中调用存储的过程导语:存储过程是指保存在数据库并在数据库端执行的程序。
你可以使用特殊的语法在Java类中调用存储过程。
在调用时,存储过程的名称及指定的参数通过JDBC连接发送给DBMS,执行存储过程并通过连接(如果有)返回结果。
下面是在Java中调用存储的过程,一起来学习下吧:使用存储过程简单的老的JDBC通过CallableStatement类支持存储过程的调用。
该类实际上是PreparedStatement的一个子类。
假设我们有一个poets数据库。
数据库中有一个设置诗人逝世年龄的存储过程。
下面是对老酒鬼Dylan Thomas(old soak Dylan Thomas,不指定是否有关典故、文化,请批评指正。
译注)进行调用的详细代码:try{int age = 39;String poetName = "dylan thomas";CallableStatement proc = connection.prepareCall("{ call set_death_age(?, ?) }");proc.setString(1, poetName);proc.setInt(2, age);cs.execute();}catch (SQLException e){ // ....}传给prepareCall方法的字串是存储过程调用的书写规范。
它指定了存储过程的名称,?代表了你需要指定的参数。
和JDBC集成是存储过程的一个很大的便利:为了从应用中调用存储过程,不需要存根(stub)类或者配置文件,除了你的DBMS的JDBC 驱动程序外什么也不需要。
当这段代码执行时,数据库的存储过程就被调用。
我们没有去获取结果,因为该存储过程并不返回结果。
执行成功或失败将通过例外得知。
失败可能意味着调用存储过程时的失败(比如提供的一个参数的类型不正确),或者一个应用程序的失败(比如抛出一个例外指示在poets数据库中并不存在“Dylan Thomas”)结合SQL操作与存储过程映射Java对象到SQL表中的行相当简单,但是通常需要执行几个SQL语句;可能是一个SELECT查找ID,然后一个INSERT插入指定ID 的数据。
mysql存储过程.详细说明,java代码调用过程Mysql存储过程调用说明:由括号包围的参数列必须总是存在。
如果没有参数,也该使用一个空参数列()。
每个参数默认都是一个IN参数。
要指定为其它参数,可在参数名之前使用关键词OUT或INOUT在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。
当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,因为那是MySQL的转义字符。
1、创建过程格式:Mysql> drop procedure if exists user_findById;Mysql> delimiter //Create procedure user_findById(in n int)BeginSelect * from user where id= n;End//调用过程:Mysql> set @n=1; --定义变量Call user_findById(@n);--调用过程// --显示结果====================================== ================例2:Mysql> drop procedure if exists user_count;Mysql> delimiter //Create procedure user_count(out count int)BeginSelect count(*) into count from user;End// --结束注意:MySQL存储过程“in”参数:跟C语言的函数参数的值传递类似,MySQL存储过程内部可能会修改此,参数,但对in类型参数的修改,对调用者(caller)来说是不可见的(not visible)。
“out”参数:从存储过程内部传值给调用者。
在存储过程内部,该参数初始值为null,无论调用者是否给存储过程参数设置值inout参数跟out类似,都可以从存储过程内部传值给调用者。
如何在Java程序中调用存储过程(一)?(1)使用scott/tiger用户在Oracle中创建2个表并插入几条数据。
Create table carl_test(A varchar2(200));create table carl_test1(B varchar2(200));--insert some data into carl_test1 tableinsert into carl_test1 values('carl1');insert into carl_test1 values('carl2');insert into carl_test1 values('carl3');commit;(2)使用scott/tiger用户在Oracle中创建一个测试存储过程,该存储过程有三个参数,第一个参数为输入参数,最后两个参数为输出参数。
为简单起见,没有在该存储过程中加入异常捕获机制。
CREATE OR REPLACE PROCEDURE carl_sp_test( v_monthly IN varchar2,last_inserted_rows_num OUT number,all_effected_rows_num OUT number)ISBEGIN/*删除carl_test表中所有记录*/delete carl_test;/*将删除行数赋值给总影响行数*/all_effected_rows_num := SQL%Rowcount;commit;/*将用户输入参数插入carl_test表中*/insert into carl_test(a) values(v_monthly);all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;/*将表carl_test1中的所有记录插入到carl_test1中*/insert into carl_testselect* from carl_test1;/*获得影响记录数*/last_inserted_rows_num:=SQL%Rowcount;all_effected_rows_num:= all_effected_rows_num + SQL%Rowcount;commit;END carl_sp_test;(3)使用scott/tiger用户在SQL/Plus中测试上述存储过程SQL> variable all_effected_rows_num number;SQL> variable last_inserted_rows_num number;SQL> exec carl_sp_test('first var',:last_inserted_rows_num,:all_effected_rows_num);PL/SQL procedure successfully completedlast_inserted_rows_num---------3all_effected_rows_num---------4SQL> print last_inserted_rows_num;last_inserted_rows_num---------3SQL> print all_effected_rows_num;all_effected_rows_num---------4SQL>上述结果表示测试成功(4)使用下面的Java类TestStoreProcedure.java测试存储过程。
该存储过程有一个输入参数,三个输出参数,其中一个输出参数为游标类型。
在Java代码中调用hibernateDao.executeProcedureOrderByParams()方法调用存储过程。
代码注意:OracleTypes.CURSOR为游标类型,使用时需要在模块中引入package:oracle.jdbc。
输出的结果是{2=34, 3=fsfsfs, 4=[{AGE=34, ID=fsfsfs}, {AGE=35, ID=5675757}, {AGE=36, ID=121221}]}输出参数4是结果集。
返回的Map中的游标结果集为list类型,通过List list = (List)m.get(“4”)将结果集取出。
list为map对象集合。
如返回数组类型参照如下例子Map in=new HashMap();Map out=new HashMap();in.put(1,"fffff");in.put(2,"11");in.put(3,"2013");//out.put(4, OracleTypes.CHAR);//HashMap<String,Map<String,List<String>>>outinfo = new HashMap<String, Map<String,List<String>>>();//Map out = new HashMap();Map type1 = new HashMap();type1.put("type", 2003);type1.put("typeName", "FILENAME_ARRAY");out.put("4", type1);// Map m = hibernateDao.executeProcedure("{call checkRuler(?)}",null,out);//// Map m = hibernateDao.executeProcedureOrderByParams("{call checkRuler(?)}",null,out);//// out.put("2",Types.VARCHAR);Map m =hibernateDao.executeProcedureOrderByParams("{call testsuzhu(?,?,?,?)}",in,out);。
java调用存储过程的三种方式这里为大家谈谈Java存储过程调用,我们可以利用Java存储过程简化数据库操作, 利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。
创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10));一:无返回值的存储过程存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA;然后呢,在 java 里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.sql.ResultSet;public class TestProcedureOne {public TestProcedureOne() {}public static void main(String[] args ){String driver = "oracle.jdbc.driver.OracleDriver";String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";Statement stmt = null;ResultSet rs = null;Connection conn = null;CallableStatement cstmt = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, " hyq ", " hyq "); CallableStatement proc = null;proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");proc.setString(1, "100");proc.setString(2, "T estOne");proc.execute();}catch (SQLException ex2) {ex2.printStackTrace();}catch (Exception ex2) {ex2.printStackTrace();}finally{try {if(rs != null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch (SQLException ex1) {}}}}当然了,这就先要求要建张表TESTTB, 里面两个字段(I_ID ,I_NAME )。
java oracle存储过程写法及调用Java中调用和编写Oracle存储过程是非常常见的操作,可以利用存储过程来执行数据库操作,提高数据库的性能和安全性。
本文将为您详细介绍Java中调用和编写Oracle存储过程的方法和步骤。
一、什么是Oracle存储过程?Oracle存储过程是一段预定义在数据库中的PL/SQL代码,可以像函数一样接收参数和返回值,用于完成特定的数据库操作。
存储过程可以包含SQL语句、逻辑控制语句、流程控制语句等,可以完成复杂的业务逻辑和数据库操作。
二、Java中调用Oracle存储过程的步骤1. 导入相关的JDBC驱动在Java中调用Oracle存储过程之前,首先需要导入相关的JDBC驱动。
可以从Oracle官网下载相应版本的JDBC驱动,将其添加到Java项目的classpath中。
2. 建立数据库连接使用JDBC的Connection对象与数据库建立连接。
可以使用如下代码建立连接:String url = "jdbc:oracle:thin:localhost:1521:orcl";String username = "username";String password = "password";Connection conn = DriverManager.getConnection(url, username, password);需要将url、username和password替换为实际的数据库连接信息。
3. 创建CallableStatement对象使用Connection对象的prepareCall方法创建CallableStatement对象,该对象用于执行存储过程的调用。
String sql = "{call 存储过程名称(?, ?)}";CallableStatement cstmt = conn.prepareCall(sql);需要将存储过程名称替换为实际的存储过程名称。
oracle存储过程调用java程序或外部bat文件by 胡珏1.调用bat文件1.1.创建java sourcecreate or replace and compile java source named exesyscommand as import java.io.*;publicclass ExeSysCommand{publicstatic String ExeCmd(String cmd) {Process proc=null;int exitValue;try {System.out.println(cmd);proc = Runtime.getRuntime().exec(cmd);exitValue = proc.waitFor();if (exitValue == 0) {return"PASS";} else {return"FAIL";}} catch (Exception e) {return e.getMessage();}}publicstaticvoid P_ExeCmd(String cmd) {Process proc = null;int exitValue;try {System.out.println(cmd);proc = Runtime.getRuntime().exec(cmd);exitValue = proc.waitFor();} catch (Exception e) {System.out.println(e.getMessage());}//proc.destroy();//proc=null;}publicstaticvoid main(String[] args)1.2.创建函数或存储引用该java source1.3.授权1.4.定义bat文件1.5.执行2.调用java程序2.1.创建java sourcecreate or replace and compile java source named httprequest asimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .URL;import .URLConnection;import .URLEncoder;import java.util.List;import java.util.Map;publicclass HttpRequest {finalstatic String username = "cluster";finalstatic String password = "cluster";finalstatic String url_encode = "UTF-8";publicstaticvoid main(String[] args) {//发送 GET 请求Strings=HttpRequest.sendGet("http://192.168.117.2:8081/kettle/executeTrans/ ", "trans=D:/KETTLE/sms.ktr&content=22");System.out.println(s);//发送 POST 请求Stringsr=HttpRequest.sendPost("http://192.168.117.2:8081/kettle/executeTran s/", "trans=D:/KETTLE/sms.ktr&content=22");System.out.println(sr);}* 向指定URL发送GET方法的请求** @param url* 发送请求的URL* @param param* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
存储过程的编写和调用存储过程是一组预先编译好的SQL语句集合,可以被多次调用。
存储过程通常用于完成一系列操作,提高数据库的执行效率和重用性。
本文将介绍存储过程的编写和调用,包括存储过程的创建、参数传递和调用方法。
1.存储过程的编写在编写存储过程之前,我们需要了解存储过程的结构。
存储过程由三个主要部分组成:声明部分、执行部分和结束部分。
-声明部分:用于定义存储过程的名称、参数及数据类型等信息。
可以在此部分声明输入参数、输出参数和局部变量。
-执行部分:用于编写实际的SQL语句,完成数据库的操作。
可以使用SQL语句来查询、插入、更新和删除数据。
-结束部分:用于结束存储过程。
下面是一个简单的存储过程的示例,用于查询指定部门的所有员工信息:```CREATE PROCEDURE GetEmployeesByDepartmentIN departmentId INTBEGINSELECT * FROM Employees WHERE department_id = departmentId;END;```在上述例子中,我们创建了一个名为GetEmployeesByDepartment的存储过程,该存储过程接受一个部门ID作为输入参数。
在执行部分,我们使用SELECT语句查询Employees表中department_id等于输入参数的员工信息。
2.存储过程的调用存储过程可以通过多种方式进行调用,包括在SQL查询中、在其他存储过程中和通过应用程序代码调用。
-在SQL查询中调用存储过程:可以使用CALL语句来调用存储过程。
例如,我们可以使用以下语句调用上述示例中的存储过程:```CALL GetEmployeesByDepartment(1);```该语句将调用名为GetEmployeesByDepartment的存储过程,并将1作为部门ID传递给存储过程。
- 在其他存储过程中调用存储过程:存储过程可以相互调用,以实现更复杂的业务逻辑。
oracle 存储过程调用java一收藏一、如何创建java存储过程?通常有三种方法来创建java存储过程。
1. 使用oracle的sql语句来创建:e.g. 使用create or replace and compile java source named "<name>" as后边跟上java源程序。
要求类的方法必须是public static的,才能用于存储过程。
SQL> create or replace and compile java source named "javademo1"2 as3 import java.sql.*;4 public class JavaDemo15 {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 javademo12 as3 language java name ''JavaDemo1.main(ng.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调用完成。
Java代码调⽤存储过程和存储⽅法准备⼀个oracle 的JDBC jar 包:ojdbc14_11g.jar⾸先找到你的 oracle 安装位置,例如:1.创建⼀个JDBC数据库连接⼯具类:[java]1. package com.test.db;2.3. import java.sql.Connection;4. import java.sql.DriverManager;5. import java.sql.ResultSet;6. import java.sql.SQLException;7. import java.sql.Statement;8.9. public class JDBCUtils {10.11. private static String driver = "oracle.jdbc.OracleDriver";12. private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";13. private static String user = "数据库连接名";14. private static String password = "数据库连接密码";15.16. //注册数据库驱动17. static{18. try {19. Class.forName(driver);20. } catch (Exception e) {21. throw new ExceptionInInitializerError(e);22. }23. }24.25. /**26. * 获取数据库连接27. * @return28. */29. public static Connection getConnection(){30. try {31. return DriverManager.getConnection(url,user,password);32. } catch (SQLException e) {33. e.printStackTrace();34. }35. return null;36. }37.38. /**39. * 释放数据库连接资源40. * @param conn41. * @param st42. * @param rs43. */44. public static void release(Connection conn,Statement st,ResultSet rs){45. if (rs!=null) {46. try {47. rs.close();48. } catch (SQLException e) {49. e.printStackTrace();50. }finally{51. rs = null;52. }53. }54.55. if (st!=null) {56. try {57. st.close();58. } catch (SQLException e) {59. e.printStackTrace();60. }finally{61. st = null;62. }63. }64.65. if (conn!=null) {66. try {67. conn.close();68. } catch (SQLException e) {69. e.printStackTrace();70. }finally{71. conn = null;72. }73. }74. }75. }package com.test.db;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBCUtils {private static String driver = "oracle.jdbc.OracleDriver";private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";private static String user = "数据库连接名";private static String password = "数据库连接密码";//注册数据库驱动static{try {Class.forName(driver);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}/*** 获取数据库连接* @return*/public static Connection getConnection(){try {return DriverManager.getConnection(url,user,password);} catch (SQLException e) {e.printStackTrace();}return null;}/*** 释放数据库连接资源* @param conn* @param st* @param rs*/public static void release(Connection conn,Statement st,ResultSet rs){ if (rs!=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if (st!=null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}if (conn!=null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}2.调⽤存储过程:[java]1. package com.test.demo;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5.6. import org.junit.Test;7.8. import oracle.jdbc.internal.OracleTypes;9. import oracle.jdbc.oracore.OracleType;10.11. import com.hwb.db.JDBCUtils;12.13. /**14. * 调⽤存储过程⼀个输⼊参数,多个输出参数15. * @author Administrator16. *17. */18. public class ProcedureTest {19.20. /**21. * create or replace procedure selectUserById(uid in number,22. uName out VARCHAR2,23. uAge out number,24. uSex out char)25. */26.27. @Test28. public void testProcedure(){29.30. String sql = "{call selectUserById(?,?,?,?)}";31.32. Connection conn = null;33. CallableStatement call = null;34. try {35. //得到⼀个数据库连接36. conn = JDBCUtils.getConnection();37. //通过连接创建出statement38. call = conn.prepareCall(sql);39. //对于in参数,赋值40. call.setInt(1, 2); // (第⼏个问号,要赋的值)41. //对out参数,声明42. call.registerOutParameter(2, OracleTypes.VARCHAR); //(第⼏个问号,声明的类型)43. call.registerOutParameter(3, OracleTypes.NUMBER);44. call.registerOutParameter(4, OracleTypes.CHAR);45.46. //执⾏调⽤47. call.execute();48.49. //取出结果50. String userName = call.getString(2);51. int userAge = call.getInt(3);52. String userSex = call.getString(4);53.54. System.out.println("⽤户姓名:"+userName+"\n\t年龄:"+userAge+"\n\t性别:"+userSex);55.56. } catch (Exception e) {57. e.printStackTrace();58. }finally{59. //关闭连接,释放资源60. JDBCUtils.release(conn, call, null);61. }62.63. }64. }package com.test.demo;import java.sql.CallableStatement;import java.sql.Connection;import org.junit.Test;import oracle.jdbc.internal.OracleTypes;import oracle.jdbc.oracore.OracleType;import com.hwb.db.JDBCUtils;/*** 调⽤存储过程⼀个输⼊参数,多个输出参数* @author Administrator**/public class ProcedureTest {/*** create or replace procedure selectUserById(uid in number,uName out VARCHAR2,uAge out number,uSex out char)*/@Testpublic void testProcedure(){String sql = "{call selectUserById(?,?,?,?)}";Connection conn = null;CallableStatement call = null;try {//得到⼀个数据库连接conn = JDBCUtils.getConnection();//通过连接创建出statementcall = conn.prepareCall(sql);//对于in参数,赋值call.setInt(1, 2); // (第⼏个问号,要赋的值)//对out参数,声明call.registerOutParameter(2, OracleTypes.VARCHAR); //(第⼏个问号,声明的类型)call.registerOutParameter(3, OracleTypes.NUMBER);call.registerOutParameter(4, OracleTypes.CHAR);//执⾏调⽤call.execute();//取出结果String userName = call.getString(2);int userAge = call.getInt(3);String userSex = call.getString(4);System.out.println("⽤户姓名:"+userName+"\n\t年龄:"+userAge+"\n\t性别:"+userSex);} catch (Exception e) {e.printStackTrace();}finally{//关闭连接,释放资源JDBCUtils.release(conn, call, null);}}}3.调⽤存储⽅法:[java]1. package com.test.demo;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5.6. import oracle.jdbc.internal.OracleTypes;7.8. import org.junit.Test;9.10. import com.hwb.db.JDBCUtils;11.12. /**13. * 调⽤存储函数,⼀个输⼊参数,⼀个输出参数14. * @author Administrator15. *16. */17. public class FunctionTest {18.19. /**20. * create or replace function selectAge(eno in number)21. return number22. */23. @Test24. public void testFunction(){25. //{?= call <procedure-name>[<arg1>,<arg2>...]}26. String sql = "{call selectAge(?)}";27. Connection conn = null;28. CallableStatement call = null;29. try {30. //得到数据库连接31. conn = JDBCUtils.getConnection();32.33. //通过数据库连接创建statement34. call = conn.prepareCall(sql);35.36. //对于输出参数,声明37. call.registerOutParameter(1, OracleTypes.NUMBER);38.39. //对于输⼊参数,赋值40. call.setInt(2, 3);41.42. //执⾏调⽤43. call.execute();44.45. //获取返回的结果46. int age = call.getInt(1);47.48. System.out.println("该⽤户年龄:"+age);49. } catch (Exception e) {50. e.printStackTrace();51. }finally{52. JDBCUtils.release(conn, call, null);53. }54. }55. }package com.test.demo;import java.sql.CallableStatement;import java.sql.Connection;import oracle.jdbc.internal.OracleTypes;import org.junit.Test;import com.hwb.db.JDBCUtils;/*** 调⽤存储函数,⼀个输⼊参数,⼀个输出参数* @author Administrator**/public class FunctionTest {/*** create or replace function selectAge(eno in number)return number*/@Testpublic void testFunction(){//{?= call <procedure-name>[<arg1>,<arg2>...]}String sql = "{call selectAge(?)}";Connection conn = null;CallableStatement call = null;try {//得到数据库连接conn = JDBCUtils.getConnection();//通过数据库连接创建statementcall = conn.prepareCall(sql);//对于输出参数,声明call.registerOutParameter(1, OracleTypes.NUMBER);//对于输⼊参数,赋值call.setInt(2, 3);//执⾏调⽤call.execute();//获取返回的结果int age = call.getInt(1);System.out.println("该⽤户年龄:"+age);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}}4.调⽤存储过程,⼀个输⼊参数,返回⼀个查询结果集合[java]1. package com.hwb.demo;2.3. import java.sql.CallableStatement;4. import java.sql.Connection;5. import java.sql.ResultSet;6.7.8.9.10. import org.junit.Test;11.12. import oracle.jdbc.internal.OracleCallableStatement;13. import oracle.jdbc.internal.OracleTypes;14.15. import com.hwb.db.JDBCUtils;16. /**17. * 存储过程⼀个输⼊参数,返回⼀个查询结果集合18. * @author Administrator19. *20. */21. public class CursorTest {22.23. /**24. * create or replace package Mypackage as25. procedure queryUserList(uid in number,userList out usercursor);26. end mypackage;27. */28. @Test29. public void testCursor(){30. String sql = "{call Mypackage.queryUserList(?,?) }";31.32. Connection conn = null;33. CallableStatement call = null;34. ResultSet rs = null;35. try {36. //得到数据库连接37. conn = JDBCUtils.getConnection();38. //通过数据库连接创建statement39. call = conn.prepareCall(sql);40.41. //对于输⼊参数,赋值42. call.setInt(1, 1);43. //对于输出参数,声明44. call.registerOutParameter(2, OracleTypes.CURSOR);45. //执⾏调⽤46. call.execute();47. //将CallableStatement 强转成 OracleCallableStatement ⽤来获取光标类型Cursor,并得到结果ResultSet48. rs = ((OracleCallableStatement)call).getCursor(2);49. //遍历 ResultSet50. while (rs.next()) {51. //根据类型和列名取值52. int id = rs.getInt("user_id"); //括号内为列名53. String user_name = rs.getString("user_name");54. int age = rs.getInt("user_age");55. String sex = rs.getString("user_sex");56. System.out.println("查询到的⽤户信息:\n\tid:"+id+"\n\t姓名:"+user_name57. +"\n\t年龄:"+age+"\n\t性别:"+sex);58. }59.60.61.62. } catch (Exception e) {63. e.printStackTrace();64. }finally{65. JDBCUtils.release(conn, call, rs);66. }67. }68. }package com.hwb.demo;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import org.junit.Test;import oracle.jdbc.internal.OracleCallableStatement;import oracle.jdbc.internal.OracleTypes;import com.hwb.db.JDBCUtils;/*** 存储过程⼀个输⼊参数,返回⼀个查询结果集合* @author Administrator**/public class CursorTest {/*** create or replace package Mypackage asprocedure queryUserList(uid in number,userList out usercursor);end mypackage;*/@Testpublic void testCursor(){String sql = "{call Mypackage.queryUserList(?,?) }";Connection conn = null;CallableStatement call = null;ResultSet rs = null;try {//得到数据库连接conn = JDBCUtils.getConnection();//通过数据库连接创建statementcall = conn.prepareCall(sql);//对于输⼊参数,赋值call.setInt(1, 1);//对于输出参数,声明call.registerOutParameter(2, OracleTypes.CURSOR);//执⾏调⽤call.execute();//将CallableStatement 强转成 OracleCallableStatement ⽤来获取光标类型Cursor,并得到结果ResultSet rs = ((OracleCallableStatement)call).getCursor(2);//遍历 ResultSetwhile (rs.next()) {//根据类型和列名取值int id = rs.getInt("user_id"); //括号内为列名String user_name = rs.getString("user_name");int age = rs.getInt("user_age");String sex = rs.getString("user_sex");System.out.println("查询到的⽤户信息:\n\tid:"+id+"\n\t姓名:"+user_name+"\n\t年龄:"+age+"\n\t性别:"+sex);}} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, rs);}}}。
代码调用存储过程java如何在Java中调用存储过程?在Java开发中,有时候需要调用数据库中已经定义好的存储过程来执行特定的操作。
存储过程是一组预定义的SQL语句集合,它们经过编译,存储在数据库中并可以多次重复调用。
本文将详细介绍如何在Java中调用存储过程,并给出逐步的代码示例。
步骤一:建立数据库连接首先,我们需要建立与数据库的连接。
在Java中,可以使用JDBC(Java Database Connectivity)技术来实现与数据库的连接。
JDBC是Java提供的一个标准API,用于与各种关系型数据库进行交互。
在调用存储过程之前,需要先加载数据库驱动和建立数据库连接。
下面的代码展示了如何加载MySQL数据库驱动并建立与数据库的连接:import java.sql.*;public class CallStoredProcedure {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try{Class.forName("com.mysql.jdbc.Driver");conn =DriverManager.getConnection("jdbc:mysql:localhost/testdb", "username", "password");}catch(SQLException se){se.printStackTrace();}catch(Exception e){e.printStackTrace();}}}其中,"com.mysql.jdbc.Driver"是MySQL数据库的驱动类名,"jdbc:mysql:localhost/testdb"是数据库连接的URL,"username"和"password"分别是数据库的用户名和密码。
在Java中如何调用存储过程。
数据库中存储过程一般可以分为以下几类:1:有参数无返回值2:有参数有返回值3:返回结果集account表结构如下:1:开户存储过程:Create proc newAccount@account varchar(30),@balance moneyAsInsert into account values(@account,@balance)Go用Java 调用上述存储过程的代码如下:package newer.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import java.io.*;import newer.db.DBConnection;import newer.pojo.Account;public class TestProcedure {private Connection con = null;public boolean createAccount(Account account){boolean flag = false;try {con = DBConnection.getConnection();CallableStatement cstmt =con.prepareCall("{call newAccount(?,?)}");cstmt.setString(1, account.getAccount());cstmt.setFloat(2, account.getBalance());if(!cstmt.execute()){flag = true;}con.close();} catch (SQLException e) {e.printStackTrace();}return flag;}public static void main(String[] args){BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入新的账号:");Account newAcc = new Account();try{newAcc.setAccount(br.readLine());System.out.print("请输入存款金额:");newAcc.setBalance(Float.parseFloat(br.readLine()));if(new TestProcedure().createAccount(newAcc)){System.out.println("开户成功!");System.out.println(newAcc);}else{System.out.println("服务器忙,请稍后再试!谢谢!");}} catch (Exception e){e.printStackTrace();}}}2:查询余额存储过程:Create proc lookBalance@account varchar(30),@balance money outputAsSelect @balance = balance from account where account = @accountReturn @balanceGo用Java 调用上述存储过程的代码如下:package newer.test;import java.io.BufferedReader;import java.io.InputStreamReader;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import java.sql.Types;import newer.db.DBConnection;import newer.pojo.Account;public class TestProcedureWithOne {private Connection con = null;public Account queryBalance(Account account) {try {con = DBConnection.getConnection();CallableStatement cstmt = con.prepareCall("{call lookBalance(?,?)}");cstmt.setString(1, account.getAccount());cstmt.registerOutParameter(2, Types.DECIMAL);//注册输出类型的变量cstmt.execute();float balance = cstmt.getFloat(2); //获取存储过程的返回值account.setBalance(balance);cstmt.close();con.close();} catch (SQLException e) {e.printStackTrace();}return account;}public static void main(String[] args) {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入要查询余额的账号:");Account qryAcc = new Account();try {qryAcc.setAccount(br.readLine());System.out.println(new TestProcedureWithOne().queryBalance(qryAcc));} catch (Exception e) {e.printStackTrace();}}}3:返回结果集的存储过程:Create proc getAccountsAsSelect * from accountGopackage newer.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import newer.db.DBConnection;import newer.pojo.Account;public class TestProcedureWithRess {private Connection con = null;private ResultSet rs = null;public List queryAccount() {List al = new ArrayList();try {con = DBConnection.getConnection();CallableStatement cstmt = con.prepareCall("{call getAccounts}");cstmt.execute();rs = cstmt.getResultSet();while(rs.next()){Account ac = new Account();ac.setAccount(rs.getString(1));ac.setBalance(rs.getFloat(2));al.add(ac);}cstmt.close();con.close();return al;} catch (SQLException e) {e.printStackTrace();}return null;}public static void main(String[] args){TestProcedureWithRess tw = new TestProcedureWithRess();List list= tw.queryAccount();Iterator itr = list.iterator();while(itr.hasNext()){System.out.println(itr.next());}}}。
sybase数据库存储过程调用外部JAVA2010-01 老鸟现在基本上所有的数据库都支持存储过程嵌入JAVA程序,以便实现在没有系统服务器的情况定时调度任务。
对于不同的数据库,存储过程和调用方法都不相同。
下面主要以Sybase 举例。
对于这部分,教程上的说的及其含糊以及混乱。
我用的版本是12.7.它内置的JDK版本是1.3.所以我们需要的工具是JDK1.3和eclipse2.1版本。
用eclipse的目的不是为了编译,而是测试我们写的JAVA类是否能够正常执行。
因为在数据库环境下,对JAVA的错误没有任何提示,通常的提示是找不到自定义的类。
首先编写一个正常的JAVA类import java.io.File;import java.io.IOException;public class Invoice {public static String lineItem1Description;public static double lineItem1Cost;public static String lineItem2Description;public static double lineItem2Cost;public static double totalSum(){double runningsum;double taxfactor=1+Invoice.rateOfTaxation();runningsum=lineItem1Cost+lineItem2Cost;runningsum=runningsum*taxfactor;return runningsum;}public static double rateOfTaxation(){double rate;rate=.15;return rate;}public static void init(String item1desc,double item1cost,String item2desc,double item2cost){lineItem1Description=item1desc;lineItem1Cost=item1cost;lineItem2Description=item2desc;lineItem2Cost=item2cost;}public static String getLineItem1Description(){return"你好";}public static double getLineItem1Cost(){return lineItem1Cost;}public static String getLineItem2Description(){return"他好";}public static double getLineItem2Cost(){return lineItem2Cost;}}如果需要另外的JAR,必须在Sybase central java editon里把JAR导入。
存储过程调用java代码的方法
存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。
在Java中,我们可以通过以下方法来调用存储过程:
1. 使用JDBC调用存储过程
使用JDBC调用存储过程需要以下步骤:
1)获取数据库连接。
2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。
3)设置输入参数和输出参数。
输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。
4)执行存储过程。
可以使用execute()或executeUpdate()方法执行。
5)获取输出参数。
以下是一个简单的示例:
```
try(Connection conn = DriverManager.getConnection(url, user, password)) {
CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');
cs.setInt(1, 1); // 设置输入参数
cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参
数
cs.execute(); // 执行存储过程
String result = cs.getString(2); // 获取输出参数
System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
}
```
2. 使用ORM框架调用存储过程
使用ORM框架调用存储过程需要根据不同的框架进行配置。
以下是使用MyBatis调用存储过程的示例:
1)在Mapper XML文件中定义存储过程调用语句。
```
<select id='callProcedure' statementType='CALLABLE'>
{call procedure_name(#{param1, mode=IN,
jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}
</select>
```
2)在Java代码中调用Mapper方法。
```
try(SqlSession session = sqlSessionFactory.openSession()) {
ProcedureMapper mapper =
session.getMapper(ProcedureMapper.class);
Map<String, Object> params = new HashMap<>();
params.put('param1', 1);
params.put('param2', null);
mapper.callProcedure(params);
String result = (String) params.get('param2');
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
```
在以上示例中,我们使用了MyBatis的Mapper XML文件定义了存储过程调用语句,并在Java代码中通过Mapper方法进行调用。
需要注意的是,参数的设置和获取需要根据不同的ORM框架进行调整。
总结
存储过程可以通过JDBC和ORM框架进行调用,具体的配置和操作方式需要根据不同的框架进行调整。
在使用存储过程时,需要注意输入参数和输出参数的设置和获取,以及存储过程的执行结果。