java如何写存储过程
如何用Java编写一个简单的数据库应用程序

如何用Java编写一个简单的数据库应用程序Java是一个非常强大的编程语言,它提供了多种处理数据库的方案。
下面我们将介绍如何用Java编写一个简单的数据库应用程序。
1.安装Java开发环境(JDK):首先,你需要安装Java开发环境(Java Development Kit,JDK)。
你可以从Oracle官方网站上下载最新版本的JDK,并按照它们提供的说明进行安装。
2.设置环境变量:一旦JDK安装完毕,你需要设置相应的环境变量。
在Windows系统中,你可以在“系统属性”中找到“高级”选项卡,点击“环境变量”,并添加JAVA_HOME变量指向JDK的安装路径。
3.下载并安装数据库:Java支持多种数据库,例如MySQL、Oracle和PostgreSQL。
你可以选择其中一个作为你的数据库。
在这个教程中,我们将使用MySQL作为示范。
从MySQL官方网站下载并安装最新版本的MySQL。
4.连接数据库:一旦数据库安装完毕,你需要编写Java代码来连接数据库。
首先,你需要下载MySQL JDBC驱动程序。
你可以从MySQL官方网站上找到最新版本的驱动程序,并将其添加到你的项目中。
接下来,你需要使用编程语言的`import`语句将这个驱动程序导入到你的Java代码中。
5.建立数据库连接:在你的Java代码中,你需要使用JDBC驱动程序提供的API来建立数据库连接。
这包括创建一个Connection对象,并传入数据库的URL、用户名和密码。
```javaimport java.sql.*;public class Main {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String user = "root";String password = "mypassword";try {Connection conn = DriverManager.getConnection(url, user, password);System.out.println("Connected to the database");} catch (SQLException e) {System.out.println("An error occurred");e.printStackTrace();}}}```在上面的代码中,`url`变量指定了数据库的URL,`user`和`password`变量指定了连接数据库所需的用户名和密码。
java jdbc的callablestatement接口常用方法-概述说明以及解释

java jdbc的callablestatement接口常用方法-概述说明以及解释1.引言1.1 概述在Java开发中,JDBC(Java Database Connectivity)是一种用于与关系型数据库进行交互的标准API。
JDBC提供了一组接口和类,用于连接数据库、执行SQL语句、获取查询结果等操作。
在JDBC中,CallableStatement接口是PreparedStatement接口的子接口,用于调用存储过程和函数。
相比于PreparedStatement,CallableStatement提供了更多关于存储过程和函数的操作方法,使得开发者能够更加方便地与数据库中的存储过程和函数进行交互。
本文将介绍Java JDBC的CallableStatement接口的常用方法,帮助读者了解和掌握在Java程序中使用CallableStatement接口进行存储过程和函数的调用。
在接下来的章节中,我们将首先对CallableStatement接口进行简单的介绍,包括其作用和用途。
然后,我们将详细介绍CallableStatement 接口常用的方法,包括参数设置、执行存储过程和函数、获取返回结果等。
最后,我们将对本文进行总结,并展望一些与CallableStatement相关的未来发展方向。
通过学习本文,读者将能够了解并掌握Java JDBC的CallableStatement接口的常用方法,从而能够在实际开发中灵活地进行存储过程和函数的调用,提高数据库操作的效率和准确性。
接下来,让我们开始深入探索CallableStatement接口的奥秘吧!1.2 文章结构本文主要介绍Java JDBC的CallableStatement接口的常用方法。
文章分为引言、正文和结论三部分。
引言部分概述了文章的主题和目的。
主要介绍了Java JDBC技术是一种用于与数据库进行交互的重要技术,而CallableStatement接口是Java JDBC中用于调用数据库存储过程和函数的核心接口。
oracle存储过程调用javasource的方法

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方法,无需修改原有代码。
•外部过程在数据库外部运行,不会对数据库性能造成影响。
callablestatement oracle存储过程out参数调用

在Oracle中,存储过程可以有IN、OUT或IN OUT参数。
OUT 参数用于向存储过程提供输出值,这些值可以在存储过程执行后被检索。
以下是如何使用CallableStatement在Java中调用Oracle存储过程并处理OUT参数的示例:假设我们有一个Oracle存储过程,如下所示:```sqlCREATE OR REPLACE PROCEDURE get_employee_count(p_emp_count OUT NUMBER) ASBEGINSELECT COUNT(*) INTO p_emp_count FROM employees;END get_employee_count;/```现在,我们将使用Java的CallableStatement来调用此存储过程并检索输出参数的值。
```javaimport java.sql.*;public class OracleCallableStatementExample {public static void main(String[] args) {String url = "jdbc:oracle:thin:@localhost:1521:xe";String user = "username";String password = "password";try {Connection conn = DriverManager.getConnection(url, user, password);CallableStatement cstmt = conn.prepareCall("{call get_employee_count(?)}");cstmt.registerOutParameter(1,Types.INTEGER); // 注册OUT参数cstmt.execute(); // 执行存储过程int empCount = cstmt.getInt(1); // 获取OUT 参数的值System.out.println("Employee count: " + empCount);cstmt.close();conn.close();} catch (SQLException ex) {ex.printStackTrace();}}}```请注意,我们使用`registerOutParameter`方法来注册OUT参数,并使用`getInt`方法来检索OUT参数的值。
如何在Java程序中调用存储过程

如何在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通过MyBatis调用MySql存储过程和函数

JAV A通过MyBatis调用MySql存储过程和函数1.引言无论是采用SPRING MVC框架开发WEB画面,还是开发需按一定时间间隔执行的批处理,都可能要调用数据库的存储过程或函数。
其间调用参数设置不正会浪费大量调试时间初学者甚至放弃使用存储过程。
本文记录了通过MyBatis调用MySql存储过程和函数的具体参数设置内容,供参考。
2.MySql存储过程例/*全公司员工下一年度带薪休假一发赋予处理*/CREATE DEFINER=`DBuser`@`%` PROCEDURE `paid_vacation_compute `( OUT p_返回值 INT(11) ,INOUT p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))PROC_START:BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENSET p_返回值 = 9;LEAVE PROC_START;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENSET p_返回值 = 6;LEAVE PROC_START;END IF;END LOOP;COMMIT;END3.MySql函数例CREATE DEFINER=`DBuser`@`%` FUNCTION ` paid_vacation_compute `( p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))) RETURNS int(11)BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENRETURN 9;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENRETURN 6;END IF;END LOOP;COMMIT;END4.MySql存储过程调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { call paid_vacation_compute (#{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT},#{StaffNumber,javaType=String, jdbcType=CHAR, mode=INOUT},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN})}</select></mapper>5.MySql函数调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { #{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT} =call paid_vacation_compute (#{StaffNumber,javaType=String, jdbcType=CHAR, mode=IN},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN} )} </select></mapper>6.JAVA调用例1(MySql存储过程和函数相同)package com.XXX.impl;import java.util.ArrayList;import java.util.List;import com.XXX.web.bean.VacationCreateBean;import com.XXX.web.dao.BaseInfoEditDAO;import com.XXX.web.util.BasicSqlSupport;public class BaseInfoEditDAOImpl extends BasicSqlSupport implements BaseInfoEditDAO { public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception {boolean blnFlag=false;//成功FLAG;//全公司员工下一年度带薪休假一发赋予处理VacationCreateBean objVacationCreateBean = new VacationCreateBean();objVacationCreateBean.setStaffNumber(objUserInfo.getSTAFF_NUMBER());objVacationCreateBean.setHireDate(objUserInfo.getDATE_HIRE().toString());objVacationCreateBean.setOperateID(objUserInfo.getCREATE_USER_ID());objVacationCreateBean.setDhcWorkYearsShinKi(objUserInfo.getDHC_WORK_YEARS());String returnValue = (String)this.session.selectOne("com.XXX.web.mapper.base_info_edit.VacationProcedure", objVacationCreateBean);//System.out.println("staffNumber=" + objVacationCreateBean.getStaffNumber());//System.out.println("result=" + objVacationCreateBean.getReturnValue());//System.out.println("returnValue=" + returnValue);//追加結果の判断blnFlag=true;return blnFlag;}}7.処理DAO接口package com.XXX.web.dao;import java.util.List;import com.XXX.web.bean.BaseInfoEditBean;/*** 员工基本信息画面の処理DAO*/public interface BaseInfoEditDAO {public List<BaseInfoEditBean> selectAuthoriyList() throws Exception;public String selectStaffId() throws Exception;public int selectOpetateTimeNum(String strStaffNumber) throws Exception;public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public boolean updateBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public BaseInfoEditBean searchBaseInfo(String strStaffNumber) throws Exception; }8.共同処理package com.XXX.web.util;import org.apache.ibatis.session.SqlSession;public class BasicSqlSupport{protected SqlSession session;public SqlSession getSession() {return session;}public void setSession(SqlSession session) {this.session = session;} }9. DAO与MAP间的交互BEANpackage com.XXX.web.bean;import java.io.Serializable;public class VacationCreateBean implements Serializable{private int ReturnValue;private String StaffNumber;private String HireDate;private String OperateID;private int WorkYearsShinKi;public int getReturnValue() {return ReturnValue;}public void setReturnValue(int returnValue) {ReturnValue = returnValue;}public String getStaffNumber() {return StaffNumber;}public void setStaffNumber(String staffNumber) {StaffNumber = staffNumber;}public String getHireDate() {return HireDate;}public void setHireDate(String hireDate) {HireDate = hireDate;}public String getOperateID() {return OperateID;}public void setOperateID(String operateID) {OperateID = operateID;}public int getDhcWorkYearsShinKi() {return dhcWorkYearsShinKi;}public void setDhcWorkYearsShinKi(int dhcWorkYearsShinKi) {this.dhcWorkYearsShinKi = dhcWorkYearsShinKi;}}10.通过MAIN函数进行调用package com.ohc.pms.batch;import java.io.FileInputStream;import java.io.IOException;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class VacationCreate {/**JDBC驱动名 */static String jdbcDriver = "com.mysql.jdbc.Driver";/**DB URL */static String dbURL = "jdbc:mysql://172.999.999.35:3306/empdb";/** DB用户名 */static String user = "empuser";/**DB密码 */static String pass = "empuser123";/**日志输出 */static protected Logger log = Logger.getLogger(VacationCreate.class );public static void main(String[] args) {Connection conn = null;CallableStatement stmt = null;try{PropertyConfigurator.configure(System.getProperty("user.dir") + "\\" + "log4j.properties");("実行路径:" + System.getProperty("user.dir"));String fileName = "jdbc.properties"; // 属性文件名Properties conf = new Properties();try {conf.load(new FileInputStream(System.getProperty("user.dir") + "\\" + "jdbc.properties"));} catch (IOException e) {System.err.println("Cannot open " + fileName + ".");e.printStackTrace();System.exit(-1); // 程序終了}// 读入jdbcDriver = conf.getProperty("driver");dbURL = conf.getProperty("url");user = conf.getProperty("user");pass = conf.getProperty("password");//JDBC driver登録Class.forName("com.mysql.jdbc.Driver");("DB连接。
Java存储过程在异构数据库访问中的应用

收稿 1期 :0 9—1 5 20 t 0—2 . 1
作者简介 : 孙
璐 (9 8 , , 16 一) 男 江苏镇 江人 , 华南理工大学 自动化科学与工程学院讲师
基金项 目: 广东省科技计划基金 资助项 目(0 4 13 1 1 . 20 A 0 0 ) 1 0
14 9
武汉 理工大学 学报 ・ 信息与管理工程版
务数据 的共 享 , 要 用 到异 构数 据 服 务技 术 就
,
即使是同一种数据库平 台, 一旦分布在不同的服务 器上或具有不同的安全边界 , 也需要精心设计数据 共享 的实现手 段 _ 。绝 大 多数 的异 构数 据服 务 技 3 J 术都是以数据提供者信任数据使用者为前提设计 的。以国内主流 的数据 库平台 Oal rc e为例 , 的 常用
() 2 建立异构数据库 的数据库快照 。利用数 据库复制技术在 目标数 据库 中建立 源数 据的快 照, 然后透明地使用源数据, 但该方法需要在源、 目的数据库问进行复杂的配置 , 且实时性不强。 ( ) 用 Oal 构 服 务 连 接 。Oal 构 3利 rc e异 rc e异
服务是 集 成在 Oal 据库 软 件 中 的功 能 ( r— rce数 Oa
Ap . 01 r2 0
文 章 编 号 :0 7—14 2 1 ) 2— 13— 4 10 4 X(0 0 0 0 9 0
文献 标 志码 : A
Jv a a存 储 过 程 在 异 构 数 据 库 访 问 中 的 应 用
孙 璐
( 南理工大学 自动化科学与工程学院 , 华 广东 广州 5 ቤተ መጻሕፍቲ ባይዱ 4 ) 16 1
第3卷 第2 2 期 21 00年4 月
武 汉 理 工 大 学 学 报 ・信 息 与 管 理 工 程 版 J U N LO T IF R A IN&M N G M N N IE RN ) O R A FWU (N O M TO A A E E TE GN E IG
类型长度大于最大值(Java调用存储过程)

System.out.println("报错!");
log
.error("retCode:" + retCode + " ; " + "retMsg:"
+ retMsg);
java.sql.SQLException: 类型长度大于最大值
当时仔细检查每个参数变量的类型、长度,都没有问题,况且在测试工程中都测试通过了。
当时的java代码调用存储过程如下:
Connection conn = null;
ResultSet rst = null;
CallableStatement stmt = null;
+ ";-- endOrderCount:" + endOrderCount + "; --newOrderCount" + newOrderCount + "; ");
}
}
DbUtil.closeConnection(conn);
如下异常:
java.sql.SQLException: 类型长度大于最大值
} else {
rst = ((OracleCallableStatement) stmt).getCursor(3);
// 对结果进行输出 while来自(rst.next()) {
orderCount = rst.getLong(1);// 订购次数
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2978)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java中对存储过程的调用一:Java如何实现对存储过程的调用:A:不带输出参数的---------------不带输出参数的----------------------------------create procedure getsum@n int =0<--此处为参数-->asdeclare @sum int<--定义变量-->declare @i intset @sum=0set @i=0while @i<=@n beginset @sum=@sum+@iset @i=@i+1endprint 'the sum is '+ltrim(rtrim(str(@sum)))--------------在SQL中执行:--------------------exec getsum 100------------在JAVA中调用:---------------------JAVA可以调用但是在JAVA程序却不能去显示该存储过程的结果因为上面的存储过程的参数类型int 传递方式是in(按值)方式import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");//创建存储过程的对象CallableStatement c=conn.prepareCall("{call getsum(?)}");//给存储过程的参数设置值c.setInt(1,100); //将第一个参数的值设置成100//执行存储过程c.execute();conn.close();}}B:带输出参数的1:返回int-------------------------带输出参数的----------------alter procedure getsum@n int =0,@result int outputasdeclare @sum intdeclare @i intset @sum=0set @i=0while @i<=@n beginset @sum=@sum+@iset @i=@i+1endset @result=@sum-------------------在查询分析器中执行------------declare @myResult intexec getsum 100,@myResult outputprint @myResult------------在JAVA中调用---------------------import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");//创建存储过程的对象CallableStatement c=conn.prepareCall("{call getsum(?,?)}");//给存储过程的第一个参数设置值c.setInt(1,100);//注册存储过程的第二个参数c.registerOutParameter(2,java.sql.Types.INTEGER);//执行存储过程c.execute();//得到存储过程的输出参数值System.out.println (c.getInt(2));conn.close();}}2:返回varchar----------------存储过程带游标-------------------在存储过程中带游标使用游标不停的遍历orderid create procedure CursorIntoProcedure@pname varchar(8000) outputas--定义游标declare cur cursor for select orderid from orders--定义一个变量来接收游标的值declare @v varchar(5)--打开游标open curset @pname=''--给@pname初值--提取游标的值fetch next from cur into @vwhile @@fetch_status=0beginset @pname=@pname+';'+@vfetch next from cur into @vendprint @pname--关闭游标close cur--销毁游标deallocate cur------------执行存储过程--------------exec CursorIntoProcedure ''--------------JAVA调用------------------import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa",""); CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");c.registerOutParameter(1,java.sql.Types.VARCHAR);c.execute();System.out.println (c.getString(1));conn.close();}}C:删除数据的存储过程------------------存储过程--------------------------drop table 学生基本信息表create table 学生基本信息表(StuID int primary key,StuName varchar(10),StuAddress varchar(20))insert into 学生基本信息表values(1,'三毛','wuhan')insert into 学生基本信息表values(2,'三毛','wuhan')create table 学生成绩表(StuID int,Chinese int,PyhSics intforeign key(StuID) references 学生基本信息表(StuID)on delete cascadeon update cascade)insert into 学生成绩表values(1,99,100)insert into 学生成绩表values(2,99,100)--创建存储过程create procedure delePro@StuID intasdelete from 学生基本信息表where StuID=@StuID--创建完毕exec delePro 1 --执行存储过程--创建存储过程create procedure seleProasselect * from 学生基本信息表--创建完毕exec selePro --执行存储过程------------------在JAVA中调用----------------import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");//创建存储过程的对象CallableStatement c=conn.prepareCall("{call delePro(?)}");c.setInt(1,1);c.execute();c=conn.prepareCall("{call selePro}");ResultSet rs=c.executeQuery();while(rs.next()){String Stu=rs.getString("StuID");String name=rs.getString("StuName");String add=rs.getString("StuAddress");System.out.println ("学号:"+" "+"姓名:"+" "+"地址");System.out.println (Stu+" "+name+" "+add);}c.close();}}D:修改数据的存储过程---------------------创建存储过程---------------------@StuID int,@StuName varchar(10)asupdate 学生基本信息表set StuName=@StuName where StuID=@StuID-------------执行存储过程-------------------------exec ModPro 2,'四毛'---------------JAVA调用存储过程--------------------import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");//创建存储过程的对象CallableStatement c=conn.prepareCall("{call ModPro(?,?)}");c.setInt(1,2);c.setString(2,"美女");c.execute();c=conn.prepareCall("{call selePro}");ResultSet rs=c.executeQuery();while(rs.next()){String Stu=rs.getString("StuID");String name=rs.getString("StuName");String add=rs.getString("StuAddress");System.out.println ("学号:"+" "+"姓名:"+" "+"地址");System.out.println (Stu+" "+name+" "+add);}c.close();}}E:查询数据的存储过程(模糊查询)-----------------存储过程---------------------@cust varchar(10)asselect customerid from orders where customeridlike '%'+@cust+'%'---------------执行---------------------------execute FindCusts 'alfki'-------------在JAVA中调用--------------------------import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");//创建存储过程的对象CallableStatement c=conn.prepareCall("{call FindCusts(?)}");c.setString(1,"Tom");ResultSet rs=c.executeQuery();while(rs.next()){String cust=rs.getString("customerid");System.out.println (cust);}c.close();}}F:增加数据的存储过程------------存储过程--------------------create procedure InsertPro@StuID int,@StuName varchar(10),@StuAddress varchar(20)asinsert into 学生基本信息表values(@StuID,@StuName,@StuAddress)-----------调用存储过程---------------exec InsertPro 5,'555','555'-----------在JAVA中执行-------------import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");//创建存储过程的对象CallableStatement c=conn.prepareCall("{call InsertPro(?,?,?)}");c.setInt(1,6);c.setString(2,"Liu");c.setString(3,"wuhan");c.execute();c=conn.prepareCall("{call selePro}");ResultSet rs=c.executeQuery();while(rs.next()){String stuid=rs.getString("StuID");String name=rs.getString("StuName");String address=rs.getString("StuAddress");System.out.println (stuid+" "+name+" "+address);}c.close();}}G:在JAVA中创建存储过程并且在JAVA中直接调用import java.sql.*;public class ProcedureTest{public static void main(String args[]) throws Exception{//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());//获得连接Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");Statement stmt=conn.createStatement();//在JAVA中创建存储过程stmt.executeUpdate("create procedure OOP as select * from 学生成绩表"); CallableStatement c=conn.prepareCall("{call OOP}");ResultSet rs=c.executeQuery();while(rs.next()){String chinese=rs.getString("Chinese");System.out.println (chinese);}conn.close();}}。