使用Java语言开发存储过程

使用Java语言开发存储过程
使用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语句。当管理数据的方法发生变化时,只需要修改过程,而不需要对应用进行任何修改。

Java存储过程

在以前的Oracle版本中,开发存储过程是通过PL/SQL来完成的。而在Oracle8i 版本中,我们不仅可以使用PL/SQL开发存储过程,而且还可以使用Java语言来开发存储过程。

1.PL/SQL与Java存储过程比较

与PL/SQL相比,使用Java语言开发存储过程有以下优点:

●Java语言具有更强大的运算能力,提供了更多的运算方法。当要完成

进行复杂运算的存储过程时,使用JSP将是你最好的选择。

●PL/SQL只能用于Oracle数据库,而Java语言可以应用于更多的数据

库系统(如Sybase、DB2、Informix等等),所以Java存储过程将具有

更好的兼容性、可移植性。

2.JSP分类

Java存储过程包括过程、函数、触发器以及对象方法四种类型。

3.调用JSP的四种方法

●CALL语法;

●DML语句;

●PL/SQL块、子程序、包;

●由触发器隐含调用。

Java存储过程的开发步骤

1.编写Java源代码

当开发Java存储过程时,首先应该编写Java源代码。如下图所示:

注意事项:

●当以public方式声明类时,类名必须与其文件名完全一致。

●只有public static方法可以作为Java存储过程。

2.装载Java代码及类到Oracle8i数据库中

在编写了Java源代码之后,接下来应该将Java代码及相应的Java类装载到Oracle8i数据库中。如下图所示:

装载Java代码及类到RDBMS有以下两种方法:

●使用loadjava工具,通过该工具可以快速装载Java源代码(.java)、

Java二进制代码(.class)以及Java打包文件(.jar)。

●使用CREATE Java、ALTER Java装载Java代码。

其中,前一种方法相对简单,并且我们推荐你使用这种方法。

3.生成调用说明

在装载了Java类之后,接下来应该生成对public static方法的调用说明,最终完成Java存储过程的开发工作。如下图所示:

完成上述步骤之后,就完成了Java存储过程的开发工作,然后就可以调用并执行该Java存储过程了。

使用Java开发过程

过程用于执行某种操作。需要注意的是,过程所对应的Java方法返回值必须为空(void)。本节以创建用于插入、修改和删除AUTHS表的JSP为例,说明使用Java开发过程的方法。如下图所示:

下面讲述完成上述任务的方法及过程:

1.编写Java源代码

程序清单如下(manipulate_auths.java):

/* 导入Java类 */

import java.sql.*;

import java.io.*;

import oracle.jdbc.driver.*;

/* 主类 */

public class manipulate_auths {

public static void insert_auths

(String code,String name,int sex,String birthdate,String entry_date_time)

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection();

/* 构造动态SQL语句 */

String sql = "INSERT INTO auths

(author_code,name,sex,birthdate,entry_date_time) "

+

"VALUES (?,?,?,?,?)";

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql);

/* 设置动态SQL参数值 */

pstmt.setString(1, code);

pstmt.setString(2, name);

pstmt.setInt(3, sex);

pstmt.setString(4, birthdate);

pstmt.setString(5, entry_date_time);

/* 执行动态SQL语句 */

pstmt.executeUpdate();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) { }

}

public static void delete_auths (String code)

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection(); /* 构造动态SQL语句 */

String sql = "DELETE FROM auths WHERE author_code = ?"; /* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql); /* 设置动态SQL参数值 */

pstmt.setString(1, code);

/* 执行动态SQL语句 */

pstmt.executeUpdate();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) { }

}

public static void modify_salary (String code,float salary) throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection();

/* 构造动态SQL语句 */

String sql = "UPDATE auths SET salary = ? WHERE author_code = ?";

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql);

/* 设置动态SQL参数值 */

pstmt.setFloat(1, salary);

pstmt.setString(2, code);

/* 执行动态SQL语句 */

pstmt.executeUpdate();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) { }

}

}

2.装载Java代码及类到Oracle8i数据库中

在编写了Java源代码之后,就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法:

3.发行Java,生成调用说明

在装载了Java类后,就可以发行该Java类,并生成调用其方法的过程说明了。下面是完成该项任务的方法:

4.调用JSP

在生成了调用Java方法的过程说明之后,我们就可以调用JSP了。例如:

使用Java开发函数

函数用于返回特定数据。本节将通过创建用于返回作者的文章标题,以及某种类型的文章个数为例,说明使用Java开发函数的方法。如下图所示:

下面讲述完成上述任务的方法和过程。

1.编写Java源代码

程序清单如下(query_article.java):

/* 导入Java类 */

import java.sql.*;

import java.io.*;

import oracle.jdbc.driver.*;

/* 主类 */

public class query_article {

public static String auths_article(String code)

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection();

/* 构造动态SQL语句 */

String sql1 = "SELECT name FROM auths WHERE author_code=?";

String sql2 = "SELECT title FROM article WHERE author_code=?";

/* 声明并初始化auths_article变量 */

String auths_article = new String();

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql1);

/* 设置动态SQL参数值 */

pstmt.setString(1, code);

/* 执行查询,并将结果保存到结果集中 */

ResultSet rset = pstmt.executeQuery();

/* 循环获取并处理结果集数据 */

while(rset.next())

auths_article =auths_article + rset.getString(1);

/* 关闭结果集 */

rset.close();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) {}

auths_article = auths_article + "所编写文章的标题如下:\n";

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql2);

/* 设置动态SQL参数值 */

pstmt.setString(1, code);

/* 执行查询,并将结果保存到结果集中 */

ResultSet rset = pstmt.executeQuery();

/* 循环获取并处理结果集数据 */

while(rset.next()) {

auths_article =auths_article + " " + rset.getString(1) + "\n";

}

/* 关闭结果集 */

rset.close();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) {}

return auths_article;

}

public static String query_type_article_number(String code)

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection();

/* 构造动态SQL语句 */

String sql = "SELECT count(*) FROM article WHERE article_code IN "

+ "(SELECT article_code FROM article_type WHERE

type_code=?)";

String article_number = new String("类型为" + code + "的文章共有 ");

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql);

/* 设置动态SQL参数值 */

pstmt.setString(1, code);

/* 执行查询,并将结果保存到结果集中 */

ResultSet rset = pstmt.executeQuery();

/* 循环获取并处理结果集数据 */

while(rset.next())

article_number = article_number + rset.getString(1) + "篇";

/* 关闭结果集 */

rset.close();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) {}

return article_number;

}

}

2.装载Java代码及类到Oracle8i数据库中

在编写了Java源代码之后,就可以将Java对象装载到Oracle8i数据库中了。下面是完成这项任务的方法:

3.发行Java,生成调用说明

在装载了Java类后,就可以发行该Java类,并生成调用其方法的函数说明了。下面是完成该项任务的方法:

4.调用JSP

在生成了调用Java方法的函数说明之后,就可以调用这些函数了。例如:

使用Java开发包

Java类用于封装Java方法,与此类似,包用于封装过程和函数等。本节将通过创建用于管理表subject的包为例,说明使用Java开发包的方法。如下图所示:

下面讲述完成上述任务的方法和过程。

1.编写Java源代码

程序清单如下(manage_subject.java):

/* 导入Java类 */

import java.sql.*;

import java.io.*;

import oracle.jdbc.driver.*;

/* 主类 */

public class manage_subject {

public static String query_subject()

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection();

/* 构造SQL语句 */

String sql = "SELECT * FROM subject";

/* 声明并初始化subject变量 */

String subject = new String();

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 创建Statement对象 */

Statement stmt = conn.createStatement();

/* 执行SQL语句,并将查询结果赋给结果集 */

ResultSet rset = stmt.executeQuery(sql);

/* 循环获取并处理结果集变量 */

while(rset.next())

subject = subject + rset.getString(1) + "\n";

/* 关闭结果集 */

rset.close();

} catch (SQLException e) {}

return subject;

}

public static void insert_subject(String subject)

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection(); /* 构造动态SQL语句 */

String sql = "INSERT INTO subject VALUES(?)";

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql); /* 设置动态SQL参数值 */

pstmt.setString(1, subject);

/* 执行动态SQL语句 */

pstmt.executeUpdate();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) {}

}

public static void delete_subject(String subject)

throws SQLException {

/* 建立到数据库的缺省连接 */

Connection conn = new OracleDriver().defaultConnection(); /* 构造动态SQL语句 */

String sql = "DELETE FROM subject WHERE subject=?";

/* 使用try ... catch语句抓取并抛出例外 */

try {

/* 准备动态SQL语句 */

PreparedStatement pstmt = conn.prepareStatement(sql); /* 设置动态SQL参数值 */

pstmt.setString(1, subject);

/* 执行动态SQL语句 */

pstmt.executeUpdate();

/* 关闭动态SQL语句 */

pstmt.close();

} catch (SQLException e) {}

}

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;

04747java语言程序设计(一)20120年01月试卷

全国2012年1月高等教育自学考试 Java语言程序设计(一)试题 课程代码:04747 一、单项选择题(本大题共10小题,每小题1分,共l0分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.下面供选字符序列中,不属于 ...Java语言关键字的是( ) A.inner B.throw C.false D.throws 2.表达式“-1>>>1”的十进制值是( ) A.-2 B.231-1 C.-(231-1) D.232-1 3.Java语言中,在类定义时用final关键字修饰,是指这个类( ) A.子类必须实现父类未实现的方法 B.没有具体实现代码 C.必须要有实例 D.不能被继承 4.表达式"java程序设计".1ength()的值是( ) A. 0 B.12 C. 8 D.13 5.以下关于BorderLayout布局的叙述中,不正确 ...的是( ) A.把容器内的空间划分成5个区域 B.加入组件应该指明要放入的区域 C.是框架窗口的默认布局 D.一个位置可直接放多个组件 6.利用文件对话框打开或保存文件,在打开文件对话框之前,可用FileFilter类设置筛选条件,其所用的两个方法是( ) A.accept()和getSelectedFile() B.accept()和getDescription() C.accept()和setDescription() D.setDescription()和getDescription() 7.设已经有Graphics2D对象g2d,RoundRectangle2D对象rRect,绘制对象rRect的代码是( ) A.g2d.draw(rRect) B.g2d.drawRoundRect(rRect) C.rRect.draw() D.rRect.drawRoundRect() 8.以下关于线程互斥和同步的叙述中,正确的是( ) A.临界段是线程互斥使用资源的程序段 B.临界段能使线程使用其它线程的资源 浙04747# Java语言程序设计(一)试卷第1页(共12页)

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

Java语言程序设计课后习题答案

Java语言程序设计(郑莉) 第二章习题答案 1.什么是对象、类,它们之间的联系 答:1)对象是包含现实世界物体特征的抽象实体,它反映系统为之保存信息和与它交互的能力。对象是一些属性及服务的封装体,在程序设计领域,可以用“对象=数据+作用于这些数据上的操作”来表示。现实生活中对象是指客观世界的实体;在程序中对象是指一组变量和相关方法的集合。 2)类是既有相同操作功能和相同的数据格式的对象的集合与抽象!3)两者的关系:对象是类的具体实例.。 2.什么是面向对象的程序设计方法它有那些基本特征 答:面向对象程序设计从所处理的数据入手,以数据为中心而不是以服务为中心来描述系统。它把编程问题视为一个数据集合,数据相对于功能而言,具有更强的稳定性。 它的特征:抽象,封装,继承,多态。 3(无用) 4.请解释类属性、实例属性及其区别。 答:实例属性,由一个个的实例用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同。 5.请解释类方法、实例属性及其区别。 答:实例方法表示特定对象的行为,在声明时前面不加static修饰符,在使用时需要发送给一个类实例。 类方法也称为静态方法,在方法声明时前面需加static修饰符,类方法表示具体实例中类对象的共有行为。 区别:实例方法可以直接访问实例变量,调用实例方法,实例方法可以直接访问类变量,调用类方法;类方法可以直接调用类变量和类方法,类方法不能直接调用实例变量和实例方法; 6.类的访问控制符有哪几种具体含义及其区别。 答:类的访问控制符只有public(公共类)及无修饰符(默认类)两种。 区别:当使用public修饰符时表示所有其他的类都可以使用此类;当没有修饰符时,则只有与此类处于同一包中的其他类可以使用类。 7类成员的访问控制符有哪几种他们对类成员分别有哪些访问限制的作用 答:类成员的访问控制符有 public,private,protecte及无修饰符. public(公有的):用public修饰的成分表示公有的,也就是它可以被其他任何对象访问(前提是对累成员所在的类访问有访问权限). Private(保护的):类中限定为private的成员只能被这个类本身 访问,在类外不可见。 proteced(保护的)用该关键字修饰的成分是受保护的,只可以被同一类及其子类的实例对象访问。 无修饰符(默认的):public,private,protected这个三个限定符不是必须写的。如果不写,则表明是“friendly”,相应的成分可以被所在保重的各类访问。 8简述构造方法的特点答:构造方法主要有以下特点: (1)构造方法的方法名与类名相同; (2)构造方法没有返回类型(修饰符void也不能有);(3)构造方法通常被声明为公有的(public); (4)构造方法可以有任意多个参数; (5)构造方法的主要作用是完成对象的初始化工作; (6)构造方法不能在程序中显式的调用; (7)在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化。 9如果在类声明中声明了构造方法,系统是否还提供默认的构造方法 答: 用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不会再赋默认的构造方法。 10:声明Patient类表示在门诊室中的病人。此类对象应包括name(astring)\sex(achar)、age(an integer)、weight(a float0、allergies(a boolean). 声明存取及修改方法。在一个单独的累中,声明测试方法,并生成两个patient的例子: Atient april=new Patient(); (“zhangli”) (‘f’);; (330; ; (true); 那么:”+()); ”+()); ”+()); (“weught: ”+());\ ”+()); 声明并测试toString()方法显示一个病人的aga、sex、name及allergies属性。 答: public class Patient { private String name; private char sex; private int age; private float weight; private boolean allergies; public void setname(String a) { name=a; } public void setsex(char b) { sex=b; }

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

C#调用存储过程简单完整例子https://www.360docs.net/doc/1b16247304.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语言程序设计基础教程》习题解答

《Java语言程序设计基础教程》练习思考题参考答案

第1章Java程序设计概述 1.9 练习思考题 1、Java运行平台包括三个版本,请选择正确的三项:() A. J2EE B. J2ME C. J2SE D. J2E 解答:A,B,C 2、Java JDK中反编译工具是:() A. javac B. java C. jdb D. javap 解答:D 3、public static void main方法的参数描述是:() A. String args[] B. String[] args C. Strings args[] D. String args 解答:A,B 4、在Java中,关于CLASSPATH环境变量的说法不正确的是:() A. CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B. 编译器用它来搜索各自的类文件。 C. CLASSPATH是一个目录列表。 D. 解释器用它来搜索各自的类文件。 解答:A 5、编译Java Application源文件将产生相应的字节码文件,扩展名为() A. .java B. .class C. .html D. .exe 解答:B 6、开发与运行Java程序需要经过的三个主要步骤为____________、____________和____________。 7、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是______类的子类并且存储该源程序文件的文件名为______。 8、如果一个Java Applet程序文件中定义有3个类,则使用Sun公司的JDK编译器编译该源程序文件将产生______个文件名与类名相同而扩展名为______的字节码文件。 9、开发与运行Java程序需要经过哪些主要步骤和过程? 10、Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎么样的? 11、编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。

SQL存储过程实例

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。 2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 建表语句

使用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

C#执行存储过程代码实例

C#执行存储过程代码实例,演示如何用C#调用并执行SQLSERVER的存储过程,是一个数据库的高级应用,存储过程相对专业些,但效率更高,而且使SQL的功能发挥的更强大,这仅是一个较简单的存储过程调用例子: 01using System; 02using System.Data; 03using System.Data.SqlClient; 04namespace ExecuteStorageProcess 05{ 06 public class ExecuteStorageProcess 07 { 08 public static void Main() 09 { 10 SqlConnection mySqlConnection = 11 new SqlConnection( 12 "server=localhost;database=Northwind;uid=sa;pwd=sa" 13 ); 14 mySqlConnection.Open(); 15 // 设置CommandText属性为EXECUTE语句 16 SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); 17 https://www.360docs.net/doc/1b16247304.html,mandText = 18 "EXECUTE AddProduct @MyProductID OUTPUT, @MyProductName, " + 19 "@MySupplierID, @MyCategoryID, @MyQuantityPerUnit, " + 20 "@MyUnitPrice, @MyUnitsInStock, @MyUnitsOnOrder, " + 21 "@MyReorderLevel, @MyDiscontinued"; 22 // 添加过程调用所要用到的参数 23 mySqlCommand.Parameters.Add("@MyProductID", SqlDbType.Int); 24 mySqlCommand.Parameters["@MyProductID"].Direction = 25 ParameterDirection.Output; 26 mySqlCommand.Parameters.Add( 27 "@MyProductName", SqlDbType.NVarChar, 40).Value = "Widget"; 28 mySqlCommand.Parameters.Add( 29 "@MySupplierID", SqlDbType.Int).Value = 1; 30 mySqlCommand.Parameters.Add( 31 "@MyCategoryID", SqlDbType.Int).Value = 1; 32 mySqlCommand.Parameters.Add( 33 "@MyQuantityPerUnit", SqlDbType.NVarChar, 20).Value = "1 per box"; 34 mySqlCommand.Parameters.Add( 35 "@MyUnitPrice", SqlDbType.Money).Value = 5.99; 36 mySqlCommand.Parameters.Add( 37 "@MyUnitsInStock", SqlDbType.SmallInt).Value = 10; 38 mySqlCommand.Parameters.Add( 39 "@MyUnitsOnOrder", SqlDbType.SmallInt).Value = 5;

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存储过程,还要经过一些计算后再传回给我们,

java语言程序设计课后习题答案

习题2 3.使用“= =”对相同内容的字符串进行比较,看会产生什么样的结果。 答:首先创建一个字符串变量有两种方式:String str = new String("abc"); String str = "abc"; 使用“= =”会因为创建的形式不同而产生不同的结果: String str1 = "abc"; String str2 = "abc"; =str2); ; public class Exercise51{ public static void main(String[] args) throws IOException{ "请输入一个整数:"); InputStreamReader isStream=new InputStreamReader; BufferedReader bfReader=new BufferedReader(isStream); String input=(); int length=()-1; int n=new Integer(input).intValue(); while(length>=0){ int divisor=(int) (10,length); length=length-1; int output=n/divisor; n=n%divisor; ","); } } } 法二:(建议使用) public class Exercise5{ public static void main(String[] args){ int n=1678; int unit; int decimal; int hundred; int thousand; thousand=n/1000%10; hundred=n/100%10; decimal=n/10%10; unit=n%10; "1678包含的数字分别是: "+thousand+','+hundred+','+decimal+', '+unit); } } ;

用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;

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

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

自考Java语言程序设计一试题及答案解析

2015年10月高等教育自学考试全国统一命题考试 Java语言程序设计(一) 试卷 (课程代码04747) 本试卷共13页,满分100分.考试时间150分钟。 考生答题注意事项: 1.本卷所有试题必须在答题卡上作答。答在试卷上无效,试卷空白处和背面均可作草稿纸. 2.第一部分为选择题。必须对应试卷上的题号使用2B铅笔将“答题卡”的相应代码涂黑. 3.第二部分为非选择题。必须注明大、小题号.使用0.5毫米黑色字迹签字笔作答. 4.合理安排答题空间.超出答题区域无效。 第一部分选择题 一、单项选择题(本大题共10小题.每小题1分.共10分) 在每小题列出的四个备选项中只有一个是符合题目要求的。请将其选出并将“答题卡”的相应代码涂黑。未涂、错涂或多涂均无分. 1.以下字符组合中,不能作为Java整型常量的是 A.037 B.0x3ADG C.7000 D.0x3abcL 2.以下程序代码的输出结果是 3.设有数组定义,则x.length的值为 A.2 B.3 C.4 D.5 4. 设有字符串String s=〝ABCDEFGABC〞;,则表达式s.indexOf(〝A〞,7)的值是 A.7 B.6 C.3 D.0 5.以下关于Swing与AWT之间关系的叙述中,正确的是 A.Swing是AWT的提高和扩展 B.在写GUl程序时,AWT和Swing不能同时使用 C.AWT和Swing在不同的平台上都有相同的表示 D.AWT中有一些类是从Swing中的一些继承的 6.以下供选择的类中,其子类能用来创建框架窗口的是 A.JWindow B.JFrame C.JDialog D.JAudio 7.某程序定义了一个子类,并要让它实现多线程,以下正确的步骤是 A.继承Thread类,在类内定义run( )方法,声明和创建线程对象,并让该对象调用 start( )方法。 B.继承Thread类,在类内定义run( )方法,声明线程对象,并让该对象调用start( ) 方法。 c.声明实现Runnable接口,在类内实现run( )方法,声明线程对象,创建线程,并

相关文档
最新文档