当前位置:文档之家› JAVA通过MyBatis调用MySql存储过程和函数讲解

JAVA通过MyBatis调用MySql存储过程和函数讲解

JAVA通过MyBatis调用MySql存储过程和函数讲解
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 FOR

SELECT a.EMP_NO, #员工号

a.DATE_HIRE, #入职日期

a.WORK_YEARS, #工作年限

b.REMAIN_DAYS # 上年带薪休假应休但未休残日数

FROM T_EMPLOYEE AS a,

T_PAID_VACATION AS b

WHERE 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 SQLEXCEPTION

BEGIN

SET done = 3;

ROLLBACK; #SQL异常回滚

END;

/* 1.输入参数妥当性检查 */

IF (p_操作者 IS NULL OR p_操作者 = '') THEN

SET p_返回值 = 9;

LEAVE PROC_START;

END IF;

SET done = 0;

START TRANSACTION;

loop_label:

LOOP

# 读入一条记录, 代入到各个变量中

FETCH staffPaidVacationDaysCur

INTO empNo, #员工号

dateHire, #就职日

workYears, #集团内工作年数

lastYearRemainDays #昨年残日数

;

IF done = 1 THEN

LEAVE loop_label;

END IF;

/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)

+ workYears;

IF elapseYear = 0 THEN

SET nowYearLeaveDays = 10;

ELSEIF elapseYear = 1 THEN

SET nowYearLeaveDays = 11;

ELSEIF elapseYear = 2 THEN

SET nowYearLeaveDays = 12;

ELSEIF elapseYear = 3 THEN

SET nowYearLeaveDays = 14;

ELSEIF elapseYear = 4 THEN

SET nowYearLeaveDays = 16;

ELSEIF elapseYear = 5 THEN

SET nowYearLeaveDays = 18;

ELSEIF elapseYear >= 6 THEN

SET nowYearLeaveDays = 20;

END IF;

SET done = 0;

SET p_员工号= empNo;

UPDATE T_PAID_VACATION

SET

LAST_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 THEN

SET p_返回值 = 6;

LEAVE PROC_START;

END IF;

END LOOP;

COMMIT;

END

3.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 FOR

SELECT a.EMP_NO, #员工号

a.DATE_HIRE, #入职日期

a.WORK_YEARS, #工作年限

b.REMAIN_DAYS # 上年带薪休假应休但未休残日数

FROM T_EMPLOYEE AS a,

T_PAID_VACATION AS b

WHERE 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 SQLEXCEPTION

BEGIN

SET done = 3;

ROLLBACK; #SQL异常回滚

END;

/* 1.输入参数妥当性检查 */

IF (p_操作者 IS NULL OR p_操作者 = '') THEN

RETURN 9;

END IF;

SET done = 0;

START TRANSACTION;

loop_label:

LOOP

# 读入一条记录, 代入到各个变量中

FETCH staffPaidVacationDaysCur

INTO empNo, #员工号

dateHire, #就职日

workYears, #集团内工作年数

lastYearRemainDays #昨年残日数

;

IF done = 1 THEN

LEAVE loop_label;

END IF;

/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)

+ workYears;

IF elapseYear = 0 THEN

SET nowYearLeaveDays = 10;

ELSEIF elapseYear = 1 THEN

SET nowYearLeaveDays = 11;

ELSEIF elapseYear = 2 THEN

SET nowYearLeaveDays = 12;

ELSEIF elapseYear = 3 THEN

SET nowYearLeaveDays = 14;

ELSEIF elapseYear = 4 THEN

SET nowYearLeaveDays = 16;

ELSEIF elapseYear = 5 THEN

SET nowYearLeaveDays = 18;

ELSEIF elapseYear >= 6 THEN

SET nowYearLeaveDays = 20;

END IF;

SET done = 0;

SET p_员工号= empNo;

UPDATE T_PAID_VACATION

SET

LAST_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 THEN

RETURN 6;

END IF;

END LOOP;

COMMIT;

END

4.MySql存储过程调用时的iBatis用Mapper例

BaseInfoEditMapper.xml

PUBLIC"-//https://www.doczj.com/doc/db2011918.html,//DTD Mapper 3.0//EN"

"https://www.doczj.com/doc/db2011918.html,/dtd/ibatis-3-mapper.dtd">

5.MySql函数调用时的iBatis用Mapper例

BaseInfoEditMapper.xml

PUBLIC"-//https://www.doczj.com/doc/db2011918.html,//DTD Mapper 3.0//EN"

"https://www.doczj.com/doc/db2011918.html,/dtd/ibatis-3-mapper.dtd">

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 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间的交互BEAN

package 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");

https://www.doczj.com/doc/db2011918.html,("実行路径:" + 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");

https://www.doczj.com/doc/db2011918.html,("DB连接。");

conn = DriverManager.getConnection(dbURL,user,pass);

https://www.doczj.com/doc/db2011918.html,("调用開始。");

String sql = "{call paid_vation_base_create(?,?,?,?,?)}";

stmt = conn.prepareCall(sql);

stmt.registerOutParameter(1,java.sql.Types.INTEGER);

stmt.registerOutParameter(2,java.sql.Types.CHAR);

stmt.registerOutParameter(3,java.sql.Types.CHAR);

stmt.registerOutParameter(4,java.sql.Types.CHAR);

for (int i = 0; i < args.length; i++) {https://www.doczj.com/doc/db2011918.html,("执行参数:" + args[i]);}

if (args.length == 1){

stmt.setString(4, "");

stmt.setString(5, "");

stmt.setString(6, "");

stmt.setInt(7, 0);

}else if(args.length == 5){

stmt.setString(4, args[0]);

stmt.setString(5, args[1]);

stmt.setString(6, args[2]);

stmt.setInt(7, Integer.parseInt(args[3]));

}else{

log.error("执行参数个数不正");

}

if (args.length == 1 || args.length == 5){

https://www.doczj.com/doc/db2011918.html,("执行中。");

stmt.execute();

int outputValue = stmt.getInt(1);

String staffNumber = stmt.getString(4);

if (outputValue == 0){

https://www.doczj.com/doc/db2011918.html,("执行結果:0(正常終了)");

}else if(outputValue == 6){

https://www.doczj.com/doc/db2011918.html,("执行結果:6(休暇日数更新失敗、失敗记录の员工号:" + staffNumber + ")");

}else if(outputValue == 9){

https://www.doczj.com/doc/db2011918.html,("执行結果:9(参数不正)");

}else{

https://www.doczj.com/doc/db2011918.html,("执行結果:" + outputValue + "想定外");

}

}

stmt.close();

conn.close();

}catch(SQLException se){

//Handle errors for JDBC

se.printStackTrace();

}catch(Exception e){

//Handle errors for Class.forName

e.printStackTrace();

}finally{

try{

if(stmt!=null)

stmt.close();

}catch(SQLException se2){

}

try{

if(conn!=null)

conn.close();

}catch(SQLException se){

se.printStackTrace();

}

}

https://www.doczj.com/doc/db2011918.html,("終了!");

}

}

11.jdbc.properties

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://172.999.999.35:3306/empdb user=empuser

password=empuser123

initialSize=5

maxActive=50

maxIdle=30

minIdle=15

maxWait=60000

12.log4j.properties

#CONSOLE,fileoutの双方式

log4j.rootLogger=DEBUG,CONSOLE,FILEOUT

https://www.doczj.com/doc/db2011918.html,.apache=true

# CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.Threshold=DEBUG

log4j.appender.CONSOLE.Target=System.out

https://www.doczj.com/doc/db2011918.html,yout=org.apache.log4j.PatternLayout

#https://www.doczj.com/doc/db2011918.html,yout.ConversionPattern=[framework] %d ? %c -%-4r [%t] %-5p %c %x ? %m%n https://www.doczj.com/doc/db2011918.html,yout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss} \:%m%n

#

# FILEOUT

log4j.appender.FILEOUT=org.apache.log4j.RollingFileAppender

log4j.appender.FILEOUT.File=${user.dir}\\filelog.log

log4j.appender.fileout.MaxFileSize=100000KB

# default is true,append to the file; if false, the replace the log file whenever restart system log4j.appender.FILEOUT.Append=true

log4j.appender.FILEOUT.MaxBackupIndex=1000

#RollingFileAppender没有DatePattern?个属性

https://www.doczj.com/doc/db2011918.html,yout=org.apache.log4j.PatternLayout

#https://www.doczj.com/doc/db2011918.html,yout.ConversionPattern=[framework] %d ? %c -%-4r [%t] %-5p %c %x ? %m%n https://www.doczj.com/doc/db2011918.html,yout.ConversionPattern=[%-5p]_%d{yyyy-MM-dd HH:mm:ss} :%m%n

MySql 数据库用java程序创建表以及存储过程

MySql 数据库用java程序创建表以及存储过程 1.同一般的数据库操作基本一样。 2.Statement.executeUpdate(String sql); 这个方法可以用来执行DDL语句,以及执行更新操作。 3.需要注意 CallableStatement 接口的用法。 用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,则必须将其注册为 OUT 型参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个参数的编号是 1。 {?= call [,, ...]} {call [,, ...]} IN 参数值是使用从 PreparedStatement 中继承的 set 方法设置的。在执行存储过程之前,必须注册所有 OUT 参数的类型;它们的值是在执行后通过此类提供的 get 方法检索的。 4.需要注意存储过程调用的方法。 5.registerOutParameter 的使用方法。 void registerOutParameter(int parameterIndex, int sqlType) throws SQLException 按顺序位置 parameterIndex 将 OUT 参数注册为 JDBC 类型 sqlType。所有 OUT 参数都必须在执行存储过程前注册。由 sqlType 指定的 OUT 参数的JDBC 类型确定必须用于 get 方法来读取该参数值的 Java 类型。如果预期返回给此输出参数的 JDBC 类型是取决于此特定数据库的,则 sqlType 应该是java.sql.Types.OTHER。 方法 getObject(int) 检索该值。 参数: parameterIndex - 第一个参数是 1,第二个参数是 2,依此类推。 sqlType - java.sql.Types 定义的 JDBC 类型代码。如果参数是 JDBC 类型NUMERIC 或 DECIMAL,则应使用接受标度值的那种。 下面是一个具体的程序实例: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package gui.database;

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.doczj.com/doc/db2011918.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

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 FOR SELECT a.EMP_NO, #员工号 a.DATE_HIRE, #入职日期 a.WORK_YEARS, #工作年限 b.REMAIN_DAYS # 上年带薪休假应休但未休残日数 FROM T_EMPLOYEE AS a, T_PAID_VACATION AS b WHERE a. EMP_NO = b. EMP_NO /* 程序退出规定声明 */ DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;

使用JAVA存储过程导入EXCEL文件操作指南

利用JAV A存储过程进行EXCEL导入 导入思路 顾问提供的PO导入FORM已经给了我们一个导入数据到系统的一个模板,基本能够满足我们的要求,该FORM主要完成以下动作: 1.显示文件上传页面给用户选择文件 2.将文本文件以字符流的形式存入到fnd_lobs表的BLOB字段 3.从BLOB字段读取数据,通过逗号分割(,)的方式从BLOB字段获取每个字段的值 4.存入系统临时表进行后续的导入处理 该方法的主要缺点在于需要用户手工将EXCEL文件存为.csv文件(即普通.txt文件),以及通过逗号分割进行解析字符流的方式进行文本文件的处理,如果用户提供的EXCEL单元格的数据中有逗号(,),则解析会出错。 该方法可以利用JAV A存储过程进行改进为: 1.在上传页面用户直接上传EXCEL文件 2.将文本文件以字符流的形式存入到fnd_lobs表的BLOB字段 3.以BLOB字段作为文件输入流,调用JAV A存储过程获取EXCEL文件内容 4.存入系统临时表进行后续的导入处理 在新方法的第3步中,调用JAV A类型的存储过程,引用处理EXCEL的JAV A API进行文件内容的读取。由于是直接解析EXCEL文件,可以减少出错的概率,另外也可以通过对API 进行替换的方式来处理其他类型的文件,如WORD或XML文件等。 导入实现 具体细节部分请参照附件的XXEXCELIMPORT.fmb文件,以下部分只说明主要步骤。 创建FORM 1.创建临时表块以及上传功能按钮 2.添加上传文件功能, 以上FORM部分具体参照顾问提供的PO导入FORM以及其中的文件上传程序段UPLOAD_FILE

使用Java语言开发存储过程

Oracle8i中使用Java语言来开发存储过程 本篇文章来源与时代朝阳数据库(原晓通数据库)培训部Oracle 资料库。 在Oracle8i之前,开发人员只能使用PL/SQL来开发存储过程。而在Oracle8i 之中,不仅可以使用原有的PL/SQL开发存储过程,而且也可以使用Java语言来开发存储过程。本篇文章将简单介绍关于这方面的知识,包括以下内容: ●存储过程简介; ●Java存储过程 ●Java存储过程的开发步骤 ●使用Java开发过程; ●使用Java开发函数; ●使用Java开发包; ●使用Java开发触发器; ●使用Java开发对象方法; ●使用JDeveloper开发JSP。 存储过程简介 存储过程是存储在数据库中的一段存储程序。当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。 1.设计存储过程的方针 ●在定义存储过程时,要使用其完成单一、相对集中的任务。

●在定义存储过程时,不要定义已经由其它特征所提供功能的过程。例如, 不要定义强制数据完整性的过程(使用完整性约束)。 2.存储过程的优点 1)安全性 当创建了存储过程之后,可以将执行该过程的权限授予其它用户,从而使得他可以执行特定的数据库操作,而不能访问其它模式对象(例如表)。例如,你可以将执行过程(更新表)的权限授予其它用户,但不授予它们直接访问该表的权限。 2)性能 ●存储过程只被发送到数据库一次,相对于SQL语句或PL/SQL块而言, 其网络通信量更小。 ●当调用存储过程时,数据库会直接运行该存储过程,无需进行编译。相 对于SQL语句或PL/SQL块而言,其执行速度更快。 3)内存分配 存储过程充分利用了Oracle共享内存的能力。在将存储过程装载到内存中后,多个用户可以同时调用该存储过程,从而降低了应用对Oracle的实际内存需求。 4)生产力 存储过程提高了开发生产力。通过将公共集合编写为存储过程,避免了冗余代码,从而提高了开发生产力。例如,我们可以编写用于插入、更新、删除AUTHS

SQL存储过程使用方法.

SQL存储过程使用方法所有的大型数据库都支持存储过程,比如Oracle、MS SQL等,(但MS Access不支持,不过,在Access里可以使用参数化的查询)。存储过程是利用SQL Server所提供的Tranact-SQL语言所编写的程序。Tranact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix-4GL语言一样。这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序: 1、变量说明 2、ANSI兼容的SQL命令(如Select,Update…. 3、一般流程控制命令(if…else…、while…. 4、内部函数存储过程的书写格 CREATE PROCEDURE [拥有者.]存储过程名[;程序编号] [(参数#1,…参数#1024] [WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION} ] [FOR REPLICATION] AS 程序行其中存储过程名不能超过128 个字。每个存储过程中最多设定1024个参数(SQL Server 7.0以上版本,参数的使用方法如下: @参数名数据类型 [VARYING] [=内定值] [OUTPUT] 每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE 外,其他SQL Server所支持的数据类型都可使用。 [=内定值]相当于我们在建立数据库时设定一个字段的默认值,这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的,也就是在调用了这个存储过程时,如果所指定的参数值是我们需要输入的参数,同时也需要在结果中输出的,则该项必须为OUTPUT,而如果只是做输出参数用,可以用CURSOR,同时在使用该参数时,必须指定VARYING和OUTPUT这两个语句。 CREATE PROCEDURE order_tot_amt @o_id int,@p_tot int output AS SELECT @p_tot = sum(Unitprice*Quantity FROM orderdetails WHERE ordered=@o_id 该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id,由定单明细表(orderdetails中计算该定单销售总额[单价(Unitprice*数量(Quantity],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序使用存储过程有许多好处,它可以封装复杂的数据逻辑,充分发挥大型数据库本身的优势。我们知道,ASP并不适合做复杂的数据运算,而通过OLD DB访问数据库,由于数据需要在ASP和数据库之间传递,相当消耗系统资源。事实上,如果数据库仅仅起着

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) Begin Select * 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) Begin Select count(*) into count from user; End // --结束 注意: MySQL存储过程 “in”参数: 跟 C语言的函数参数的值传递类似, MySQL存储过程内部可能会修改此,参数,但对 in类型参数的修改,对调用者(caller)来说是不可见的(not visible)。 “out”参数: 从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值inout参数跟 out类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout参数传递值给存储过程。 总结:如果仅仅想把数据传给MySQL存储过程,那就使用“in”类型 参数;如果仅仅从MySQL存储过程返回值,那就使用“out”类型参数;如果需要把数据传给MySQL存储过程,还要经过一些计算后再传回给我们,

MySQL存储过程实例教程

MySQL存储过程实例教程 MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。 实例261:存储过程的创建 这是一个创建存储过程的实例 录像位置:光盘mingrisoft9?lt;/p> 实例说明 为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。 技术要点 一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable);end; MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。 存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。 MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如: mysql>delimiter // 存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。 drop procedure proc_name 实现过程

用JDBC操作Oracle的存储过程返回值.

用JDBC操作Oracle的存储过程返回值 Oracle的存储过程可以返回任何类型,包括一个ResultSet,JDBC自带的CallableStatement可以提供操作这些返回值得借口,其中我们可以通过registerOutParameter来注册需要返回的类型。CallableStatement是PrepareStatement的一个子类,但提供了返回和注册Out类型参数的功能。我们看一下例子,在Oracle里面我们定义了一个包如下: create or replace package GP_TESTP is type my_dCursor is ref cursor; procedure GP_Test(m_cursor2 OUT my_dCursor; end GP_TESTP; create or replace package body GP_TESTP is procedure GP_Test(m_cursor2 OUT my_dCursor is begin open m_cursor2 for select bom.material_no,bom.product_no from gp2_bom bom where bom.year=2006 ; end GP_Test; end GP_TESTP; 在JDBC里面我们可以通过如下的接口来得到返回的动态游标的内容 Global.start(; //初始化连接池 ConnectionWrapper wrapper=ConnectionPoolFactory.getPoolInstance(.borrowConnection(;//从连接池里面返回连接 Connection conn=wrapper.getConnection(; try { String callSql="{call GP_TESTP.GP_Test(?}"; CallableStatement cs = null; ResultSet rs=null; cs = conn.prepareCall(callSql; cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR; cs.execute(; rs = (ResultSetcs.getObject(2; while(rs.next({ //String s=rs.get(""; String component=rs.getString(2; String productNo=rs.getString(4; System.out.println("component="+component+"-------productNo="+productNo; } } catch (SQLException e { // TODO Auto-generated catch block e.printStackTrace(; } 注意兰颜色的代码是注册动态游标和返回结果集的关键代码。 ======================================= 2008年07月06日星期日 07:41 P.M.一:无返回值的存储过程存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2 AS BEGIN INSERT 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;

MySQL存储过程简单入门

MySQL存储过程语法 1、概念 存储过程就是能完成一定操作的一组SQL语句。 2、作用 大大提高效率(存储过程本身执行速度非常快,而且,调用存储过程大大减少数据库交互次数);提高重用性。 3、使用方法 1、创建: create procedure sp_name() begin …… end 注意:可能有参数。 2、调用: call sp_name() 注意:括号不能省略。 3、删除: drop procedure sp_name 注意:没有括号,不能在一个存储过程中删除另一个存储过程,只能调用。 4、语句: 条件语句, if 条件then statement else statement end if while循环语句, [label:] while expression do statement end while [label]; loop循环语句, [label:] loop statement end loop [label];

repeat until循环语句, [label] repeat statement until expression end repeat [label]; 5、常用命令: show procedure status:显示数据库所有存储过程基本信息。 show create procedure sp_name:显示一个存储过程详细信息。 关于运算符和基本函数与Java有些区别,用时注意就行。 4、实例 1、创建: create procedure proc_name (in parameter integer) begin declare variable varchar(20); if parameter=1 then set variable='MySQL'; else set variable='PHP'; end if; insert into tb (name) values (variable); end; 注意:代码不区分大小写;存储过程之间以及存储过程与内建函数不能同名; 存储过程参数(in传入,out传出,inout可传入,修改后传出,缺省是in); 由于存储过程内部要以分号结束,需要delimiter进行更改。 2、实现: ⑴、mysql –u用户名–p用户密码 ⑵、delimiter //(将结束符号“;”改成“//”,避免与存储过程冲突) ⑶、use 数据库名 ⑷、……(创建存储过程) ⑸、call proc_name(5)//(调用存储过程) -------------------------------------------- call proc_name(@para)//(对应存储过程定义中out的输出) select @para// ⑹、show procedure status//与show create procedure proc_name// 3、程序代码调用:(out型的部分代码) try{ //调取out型的存储过程P(计算记录总数) stmt = conn.prepareCall("{call p(?)}"); //读取所有OUT型的存储过程的返回参数数据 stmt.registerOutParameter(1, Types.INTEGER); stmt.execute(); int i= stmt.getInt(1);

实验六 MySql存储过程

实验六MySql存储过程 一、实验目的 1、熟悉MySql的存储过程 二、实验内容 1、建立一张学生表,属性有学号、姓名、年龄三个字段。 2、建立一个存储过程,实现学生的全查询 3、分别用IN 和OUT实现姓名的调用 4、声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。 5、建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生. 6、建立一个存储过程,做一个循环语句,循环插入5个学生。(至少用三种循环的存储过程方法) 三、试验结果截图 1.建立一张学生表,属性有学号、姓名、年龄三个字段。 2.建立一个存储过程,实现学生的全查询

3.分别用IN 和OUT实现姓名的调用 4.声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。

5.建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生.

6建立一个存储过程,做一个循环语句,循环插入5个学生。(至少用三种循环的存储过程方法) 所有代码: 1. create table stu( stuno int, stuna varchar(20), stuage int ); insert into stu values(001,'zhangsan',22);

insert into stu values(002,'lisi',23); insert into stu values(003,'wangwu',23); insert into stu values(004,'maliu',24); insert into stu values(005,'zhaoqi',25); insert into stu values(006,'gaoba',23); insert into stu values(007,'ddddd',22); insert into stu values(008,'ttttt',21); 2. create procedure select_all() select * from stu; 3. delimiter // create procedure searchno( in no int, out na varchar(20), out age int ) begin select stuna from stu where stuno=no into na; select stuage from stu where stuno=no into age; end // delimiter ; call searchno(n,@na,@age); select @na,@age; 4. delimiter // create procedure noupdate( in n int) begin update stu set stuno=stuno+n; end // delimiter ; 5. delimiter // create procedure addstu( in sno int ) begin case sno when 0 then insert into stu values(17,'no17',20); when 1 then insert into stu values(18,'no18',20); else insert into stu values(19,'no19',20); end case; end //

C++调用SQL存储过程实例

c/c++调用mysql存储过程 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出。6.0不仅支持大型数据库如oracle等的绝大部分功能,如存储过程、视图、触发器、job等等,而且修正了这些功能所存在的bug,其中6.0.1还支持64位windows,以及表空间。 在c/c++中访问mysql,常见的只是一些简单的业务,使用c中嵌入简单的查询、插入、更新等操作即可。随着业务的复杂化,完成一个业务功能需要非常多的sql操作环节,把这些语句都嵌入c代码中会导致c代码越来越繁琐、不清晰,这时候,自然就想到了存储过程来封装所有的数据库逻辑,通过c简单调用mysql存储过程接口即可达到目的,极大地减轻了c程序员的工作量,也便于前端业务处理逻辑与数据库处理逻辑的分离。下面就介绍c 语言调用存储过程的简单的方法。 1、首先创建一张表 用于存放用户信息 Create table student( id int auto_increment, name varchar(20), age tinyint, remark varchar(50), primary key(id) ); 2、插入几条信息 Insert into student values(1,"zhouys",90, ""); commit; 3、查看用户信息 mysql> select * from student;

+------+-----------+------+----------+ | id | name | age | remark | +------+-----------+------+----------+ | 1 | zhouys | 90 | | +------+-----------+------+-----------+ 1 row in set (0.00 sec) mysql> 4、创建存储过程 如下: delimiter // create procedure querystudent( in in_id int , #0-字符id 1-数字id # out out_ret int, #返回结果 out out_name varchar(20), #名字 out out_age int #年龄) label_a:begin declare v_name varchar(20) ; declare v_age tinyint ; #参数判断 if (in_id<=0) then set out_ret=-1; #id error

java调用存储过程返回结果集,返回字符串

package com.utour.util; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; /** * java调用存储过程 * * @author Administrator * */ public class JavaCallPro { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String s = testOutParams(); System.out.println(s); // // List list = test(); // // for(int i=0;i

MySQL存储过程练习

存储过程实验 一、实验要求: 1.理解存储过程的概念 2.掌握存储过程的语法格式、使用方法 3.掌握存储过程的创建、执行 二、实验内容: (注意:做一下实验需要首先建立数据及其相应的表,并输入一些记录) 1.实验1:创建一个存储过程,实现查询表student中的记录信息,并执行存储过 程 (1)创建存储过程: begin select * from student end (2)执行存储过程:运行 sp_liststudent (3)执行结果如下:

2.实验2.创建一个存储过程,根据给定的学生学号返回该学生的姓名(1)创建存储过程:

CREATE PROCEDURE test5( IN id int) BEGIN SELECT * from student s WHERE s.id=id; END (2)执行存储过程:CALL test5(2) 执行结果如下: 3.实验3. 创建一个存储过程,根据班级的编号,统计该班人数,并将人数以输出 变量返回给用户。 (1)创建存储过程: CREATE PROCEDURE test00( IN roomidint) BEGIN SELECT COUNT(*) from student s WHERE s.roomid=9; END (2)执行存储过程:CALL test00(2) (3)执行结果如下:

4.实验4:创建一个存储过程查询学号为“020101”的学生的平均分是否超过了85 分,若超过则输出“ X X考出了高分”,否则输出“XX 考的一般”。 (1)创建存储过程: CREATE PROCEDURE test05() BEGIN IF (SELECT score from student WHERE id=1)>85 THEN SELECT '考得好'; ELSE SELECT '考得不好'; END IF; END

SQL存储过程入门教程

1.sql存储过程概述 在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。 1.1存储过程的概念 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 在SQL Server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL Server 提供支持。通过系统存储过程,MS SQL Server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。 1.2存储过程的优点 当利用MS SQL Server 创建一个应用程序时,Transaction-SQL 是一种主要的编程语言。若运用Transaction-SQL 来进行编程,有两种方法。其一是,在本地存储Transaction- SQL 程序,并创建应用程序向SQL Server 发送命令来对结果进行处理。其二是,可以把部分用Transaction-SQL 编写的程序作为存储过程存储在SQL Server 中,并创建应用程序来调用存储过程,对数据结果进行处理存储过程能够通过接收参数向调用者返回结果集,结果集的格式由调用者确定;返回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句,并且可以在一个存储过程中调用另一存储过程。 我们通常更偏爱于使用第二种方法,即在SQL Server 中使用存储过程而不是在客户计算机上调用Transaction-SQL 编写的一段程序,原因在于存储过程具有以下优点: (1)存储过程允许标准组件式编程 存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的SQL 语句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为应用程序源代码只包含存储过程的调用语句),从而极大地提高了程序的可移植性。 (2)存储过程能够实现较快的执行速度

Java调用SQL Server存储过程

Java调用SQL Server存储过程 Java调用SQL Server的存储过程详解,主要内容: ●使用不带参数的存储过程 ●使用带有输入参数的存储过程 ●使用带有输出参数的存储过程 ●使用带有返回状态的存储过程 ●使用带有更新计数的存储过程 1.使用不带参数的存储过程 使用JDBC 驱动程序调用不带参数的存储过程时,必须使用call SQL 转义序列。不带参数的call 转义序列的语法如下所示: 实例:在SQL Server 2005 AdventureWorks示例数据库中创建以下存储过程: 此存储过程返回单个结果集,其中包含一列数据(由Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。 在下面的实例中,将向函数传递AdventureWorks示例数据库的打开连接,然后使用executeQuery方法调用GetContactFormalNames存储过程。

2.使用带有输入参数的存储过程 使用JDBC 驱动程序调用带参数的存储过程时,必须结合SQLServerConnection 类的prepareCall方法使用call SQL转义序列。带有IN参数的call转义序列的语法如下所示: 构造call转义序列时,请使用?(问号)字符来指定IN参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用SQLServerPreparedStatement类的setter方法之一为参数指定值。可使用的setter方法由IN参数的数据类型决定。 向setter方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个IN参数,则其序数值为1。如果存储过程包含两个参数,则第一个序数值为1,第二个序数值为2。 作为调用包含IN参数的存储过程的实例,使用SQL Server 2005 AdventureWorks示例数据库中的uspGetEmployeeManagers存储过程。此存储过程接受名为EmployeeID的单个输入参数(它是一个整数值),然后基于指定的EmployeeID返回雇员及其经理的递归列表。下面是调用此存储过程的Java代码:

相关主题
文本预览
相关文档 最新文档