createorreplaceandcompile" />
文档库 最新最全的文档下载
当前位置:文档库 › 如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程(详解)
如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程

(详解)

一、如何缔造java存储过程?

通常有三种步骤来缔造java存储过程。

1. 使用oracle的sql语句来缔造:

e.g. 使用create or replace and compile java source named "" as

后边跟上java源程序。要求类的步骤必须是public static的,威力用于存储过程。

1.SQL> create or replace and compile java source named "javademo1

"

2. as

3. import java.sql.*;

4. public class JavaDemo1

5. {

6. public static void main(String[] argv)

7. {

8. System.out.println("hello, java demo1");

9. }

10. }

11. /

12.

13.Java 已

14.

15.缔造。

16.

17.SQL> show errors java source "javademo1"

18.没有

19.

20.舛误。

21.

22.SQL> create or replace procedure javademo1

23. 2 as

24.3 language java name JavaDemo1.main(https://www.wendangku.net/doc/5110578006.html,ng.String[]);

25. 4 /

26.

27.过程已

28.

30.

31.SQL> set serveroutput on

32.SQL> call javademo1();

33.

34.调用

35.实现。

36.

37.SQL> call dbms_java.set_output(5000);

38.

39.调用

40.实现。

41.

42.SQL> call javademo1();

43.hello, java demo1

44.

45.调用

46.实现。

47.

48.SQL> call javademo1();

49.hello, java demo1

50.调用

51.实现。

2. 使用外部class文件来装载缔造

e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。

1.public class OracleJavaProc

2.{

3. public static void main(String[] argv)

4. {

5. System.out.println("Its a Java Oracle procedure.");

6. }

7.}

8.

9.

10.SQL> grant create any directory to scott;

11.

12.授权

13.顺利。

14.

15.SQL> conn scott/tiger@iihero.oracledb

17.SQL> create or replace directory test_dir as d:/oracle

;

18.

19.目录已

20.

21.缔造。

22.

23.SQL> create or replace java class using bfile(test_dir, OracleJ

avaProc.CLASS)

24. 2 /

25.

26.Java 已

27.

28.缔造。

29.

30.SQL> create or replace procedure testjavaproc as language java

name OracleJavaProc.main(https://www.wendangku.net/doc/5110578006.html,ng.String[]);

31. 2 /

32.

33.过程已

34.

35.缔造。

36.

37.SQL> call testjavaproc();

38.

39.调用

40.实现。

41.

42.SQL> execute testjavaproc;

43.

44.PL/SQL 过程已

45.顺利

46.实现。

47.

48.SQL> set serveroutput on size 5000

49.SQL> call dbms_java.set_output(5000);

50.

51.调用

52.实现。

53.

54.SQL> execute testjavaproc;

55.Its a Java Oracle procedure.

3. 我推举的一种步骤,直接使用loadjava命令远程装载并缔造。

先缔造一个类, e.g.

1.import java.sql.*;

2.import oracle.jdbc.*;

3.

4.public class OracleJavaProc {

5.

6. //Add a salgrade to the database.

7. public static void addSalGrade(int grade, int losal, int his

al) {

8.

9. System.out.println("Creating new salgrade for EMPLOYEE...

");

10.

11. try {

12. Connection conn =

13. DriverManager.getConnection("jdbc:default:connectio

n:");

14.

15. String sql =

16. "INSERT INTO salgrade " +

17. "(GRADE,LOSAL,HISAL) " +

18. "VALUES(?,?,?)";

19. PreparedStatement pstmt = conn.prepareStatement(sql);

20. pstmt.setInt(1,grade);

21. pstmt.setInt(2,losal);

22. pstmt.setInt(3,hisal);

23. pstmt.executeUpdate();

24. pstmt.close();

25. }

26. catch(SQLException e) {

27. System.err.println("ERROR! Adding Salgrade: "

28. + e.getMessage());

29. }

30. }

31.}

使用loadjava命令将其装载到服务器端并编译:

1.D:eclipse3.1workspacedbtest>loadjava -u scott/tiger@iihero.orac

ledb -v -resolve Or

2.acleJavaProc.java

3.arguments: -u scott/tiger@iihero.oracledb -v -resolve OracleJav

aProc.java

4.creating : source OracleJavaProc

5.loading : source OracleJavaProc

6.resolving: source OracleJavaProc

查问一下状态:

1.衔接到:

2.Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

3.With the Partitioning, OLAP and Oracle Data Mining options

4.JServer Release 9.2.0.1.0 - Production

5.

SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE JAVA%;

6.

7.OBJECT_NAME

8.---------------------------------------------------------------

-----------------

9.

10.OBJECT_TYPE STATUS

11.--------------------------------------------------

12.OracleJavaProc

13.JAVA CLASS VALID

14.

15.OracleJavaProc

16.JAVA SOURCE VALID

测试一下存储过程:

1.SQL> create or replace procedure add_salgrade(id number, losal

number, hisal num

2.ber) as language java name OracleJavaProc.addSalGrade(int, int,

int);

3. 2 /

4.

5.过程已

6.

7.缔造。

8.

9.SQL> set serveroutput on size 2000

10.SQL> call dbms_java.set_output(2000);

11.

12.调用

13.实现。

14.

15.SQL> execute add_salgrade(6, 10000, 15000);

16.Creating new salgrade for EMPLOYEE...

17.

18.PL/SQL 过程已

19.顺利

20.实现。

21.

22.SQL> select * from salgrade where grade=6;

23.

24. GRADE LOSAL HISAL

25.---------- ---------- ----------

26. 6 10000 15000

二、如何更新你已经编写的java存储过程?

如果要往类OracleJavaProc里增加一个存储过程步骤,如何开辟?

准确的步骤应该是先dropjava, 改程序,再loadjava 。

e.g. 批改OracleJavaProc类内容如下:

1.import java.sql.*;

2.import oracle.jdbc.*;

3.

4.public class OracleJavaProc {

5.

6. // Add a salgrade to the database.

7. public static void addSalGrade(int grade, int losal, int his

al) {

8.

9. System.out.println("Creating new salgrade for EMPLOYEE...

");

10.

11. try {

12. Connection conn =

13. DriverManager.getConnection("jdbc:default:connectio

n:");

14.

15. String sql =

16. "INSERT INTO salgrade " +

17. "(GRADE,LOSAL,HISAL) " +

18. "VALUES(?,?,?)";

19. PreparedStatement pstmt = conn.prepareStatement(sql);

20. pstmt.setInt(1,grade);

21. pstmt.setInt(2,losal);

22. pstmt.setInt(3,hisal);

23. pstmt.executeUpdate();

24. pstmt.close();

25. }

26. catch(SQLException e) {

27. System.err.println("ERROR! Adding Salgrade: "

28. + e.getMessage());

29. }

30. }

31.

32. public static int getHiSal(int grade)

33. {

34. try {

35. Connection conn =

36. DriverManager.getConnection("jdbc:default:connection:

");

37. String sql = "SELECT hisal FROM salgrade WHERE grade =

?";

38. PreparedStatement pstmt = conn.prepareStatement(sql);ps

tmt.setInt(1, grade);

39. ResultSet rset = pstmt.executeQuery();

40. int res = 0;

41. if (rset.next())

42. {

43. res = rset.getInt(1);

44. }

45. rset.close();

46. return res;

47. }

48. catch (SQLException e)

49. {

50. System.err.println("ERROR! Querying Salgrade: "

51. + e.getMessage());

52. return -1;

53. }

54. }

55.

56.}

如何更新呢?

1.D:eclipse3.1workspacedbtest>dropjava -u scott -v OracleJavaProc

2.

3.D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u s

cott -v -resolve Or

4.acleJavaProc/tiger@iihero.oracledb.java

5.arguments: -u scott/tiger@iihero.oracledb -v -resolve OracleJav

aProc.java

6.creating : source OracleJavaProc

7.loading : source OracleJavaProc

8.resolving: source OracleJavaProc

后边的利用示例:

1.SQL> create or replace function query_hisal(grade number) retur

n number as langu

2.age java name OracleJavaProc.getHiSal(int) return int;

3. 2 /

4.

5.函数已

6.

7.缔造。

8.

9.SQL> set serveroutput on size 2000

10.SQL> call dbms_java.set_output(2000);

11.

12.调用

13.实现。

14.SQL> select query_hisal(5) from dual;

15.

16.QUERY_HISAL(5)

17.--------------

18. 9999

全文完!

用法个人见解:不要手动drop java source, 不要手动drop procedure 。

Java 连接SQLserve2005数据库

首先得下载驱动程序到微软网站下载Microsoft SQL Server 2005 JDBC Driver 1.2

解压Microsoft SQL Server 2005 jdbc driver1.2.exe,把sqljdbc_1.1复制到%ProgramFiles%(如果系统在C盘则为C:\Program Files)。

设置 Classpath

JDBC 驱动程序并未包含在 Java SDK 中。因此,如果要使用该驱动程序,必须将 classpath 设置为包含 sqljdbc.jar 文件。如果 classpath 缺少sqljdbc.jar 项,应用程序将引发“找不到类”的常见异常。

sqljdbc.jar 文件的安装位置如下:

<安装目录>\sqljdbc_<版本>\<语言>\sqljdbc.jar

下面是用于 Windows 应用程序的 CLASSPATH 语句实例:

CLASSPATH =.;%ProgramFiles%\sqljdbc_1.2\chs\sqljdbc.jar

设置SQL Server服务器

我使用的是SQL Server 2005标准版SP2,这些都默认即可,一般不用配置。如果需要配置端口请看下面。

1、“开始”→“程序”→“Microsoft SQL Server 2005”→“配置工具”→“SQL Server 配置管理器”→“SQL Server 2005 网络配置”→“MSSQLSERVER 的协议”

2、如果“TCP/IP”没有启用,右键单击选择“启动”。

3、双击“TCP/IP”进入属性设置,在“IP 地址”里,可以配置“IPAll”中的“TCP 端口”,默认为1433。

4、重新启动SQL Server或者重启计算机。

建议重启电脑。

在Eclipse中测试

1、打开Eclipse,“文件”→“新建”→“项目”→“Java 项目”,项目名为Test

2、在Eclipse中,选择“窗口”→“首选项...”→“Java”→“已安装的JRE”,选择已安装的 JRE,点击“编辑”→“添加外部”,选

择%ProgramFiles%\sqljdbc_1.1\chs\sqljdbc.jar

3、在Test项目的“JRE 系统库”中可以看见sqljdbc.jar,如果没有可以右键单击项目Test→“构建路径”→“配置构建路径...”→“Java 构建路径”→“库”→“添加外部JAR...”,选

择%ProgramFiles%\sqljdbc_1.1\chs\sqljdbc.jar

4、编写Java代码,如下:

import java.sql.*;

public class Test {

public static void main(String[] srg) {

String driverName =

"com.microsoft.sqlserver.jdbc.SQLServerDriver"; //加载JDBC驱动String dbURL = "jdbc:sqlserver://localhost:1433;

DatabaseName=test"; //连接服务器和数据库test

String userName = "sa"; //默认用户名

String userPwd = "123456"; //安装sql server 2005时的密码

Connection dbConn;

try {

Class.forName(driverName);

dbConn = DriverManager.getConnection(dbURL, userName, userPwd);

System.out.println("Connection Successful!"); //如果连接成功控制台输出Connection Successful!

} catch (Exception e) {

e.printStackTrace();

}

}

}

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;

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;

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

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

oracle实验--存储过程

实验八存储过程的使用 一、实验目的 1、熟练掌握存储过程的定义及使用 二、实验要求 1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成 实验内容的预习准备工作; 2、能认真独立完成实验内容; 3、实验后做好实验总结,根据实验情况完成实验报告。 三、实验内容 创建图书管理库的图书、读者和借阅三个基本表的表结构: 图书表: BOOK ( BOOK_ID NUMBER(10), SORT V ARCHAR2(10), BOOK_NAME V ARCHAR2(50), WRITER V ARCHAR2(10), OUTPUT V ARCHAR2(50), PRICE NUMBER(3)); 读者表 READER ( READER_ID NUMBER(3), COMPANY V ARCHAR2(10), NAME V ARCHAR2(10), SEX V ARCHAR2(2), GRADE V ARCHAR2(10), ADDR V ARCHAR2(50)); 借阅表 BORROW ( READER_ID NUMBER(3),

BOOK_ID NUMBER(10), BORROW_DA TE DA TE); 插入数据: BOOK表: insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表: insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316'); insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224'); insert into reader values(116,'信息系','李明','男','副教授','1号楼318'); insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214'); insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216'); insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318'); insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506'); insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510'); insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512'); insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212'); BORROW表:

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

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

用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存储过程例子

oracle存储过程学习过程 一直没有使用过存储过程 今天特意学习一下oracle的存储过程 一步一步学习,今天学习如下: 建立一个最简单的存储过程 create or replace procedure test_xg_p1 is begin dbms_output.put_line('hello world! this is the first procedure'); end; 建立一个带输入输出参数的存储过程:把输入的数据传给输出参数 create or replace procedure test_xg_p2(a in number,x out number) is begin x:=a; end test_xg_p2; 建立一个逻辑判断的存储过程,并包含输入输出参数:近似分数的登记判断create or replace procedure test_xg_p3(a in number,x out varchar2) is begin if a>=90 then begin x := 'A'; end; end if; if a<90 then begin x:='B'; end; end if; if a<80 then begin x:='C'; end; end if; if a<70 then begin x:='D'; end; end if; if a<60 then begin x:='E'; end; end if; end test_xg_p3; 建立一个带循环逻辑的存储过程:近似累加函数

create or replace procedure test_xg_p4(a in number,x out varchar2) is tempresult number(16); begin tempresult :=0; for tempa in 0..a loop begin tempresult := tempresult + tempa; end; end loop; x:=tempresult; end test_xg_p4; 建立一个能从数据库中特定表中返回数据的存储过程: create or replace procedure test_xg_p5(x out varchar2) is tempresult varchar2(1024); begin tempresult := 'start->'; select hotelid||hotelname into tempresult from hotel where hotelid =10041764; x:=tempresult; end test_xg_p5; 建立一个能使用游标的带循环的存储过程: create or replace procedure test_xg_p6(x out varchar2) is tempresult varchar2(10240); cursor cursor1 is select * from hotel where hotelname like '浙江%'; begin tempresult := 'start->'; for cursor_result in cursor1 loop begin tempresult :=tempresult||cursor_result.hotelid||cursor_result.hotelname; end; end loop; x:=tempresult; end test_xg_p6;

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调用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代码:

Oracle存储过程基本语法

Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracl e数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4:

NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL /SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束 存储过程创建语法: create or replace procedure 存储过程名(param1 in t ype,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1; If (判断条件) then Select 列名into 变量2 from 表A where 列名=param1; Dbms_output。Put_line(‘打印信息’);

Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback; End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号

oracle存储过程函数汇总().docx

oracle存储过程函数汇总() Character function return character value These functions all received is the character parameter type group (except CHR) and returns the character value? In addition to the special instructions, the function returns VARCHAR2 most numerical types? The restrictions on the return type of the character function are the same as those for the basic database type? The maximum value of character variable storage: The VARCHAR2 value is limited to 2000 characters (ORACLE 8 to 4000 characters) The CHAR value is limited to 255 characters (0RACLE8 2000) The long type is 2GB The Clob type is 4GB 1,CHR Syntax: Chr (x) Function: return in the database character set with numerical equivalence with the character of X. CHR and ASCII are a pair of inverse functions? After CHR conversion character after ASCII conversion and obtained the original word

Oracle存储过程基本结构

1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN

SELECT col1,col2 into 变量1,变量2 FROM typestruct wher e xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN

XXXX END; END LOOP; 5.变量赋值 V_TEST := 123; 6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP;

END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHE RE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如:

在java中存储过程的使用

1 使用不带参数的存储过程 public static void executeStoredProcedure(Connection con) { try { CallableStatement cstmt = con.prepareCall("{call dbo.GetContactFormalNames}"); ResultSet rs = cstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("FormalName")); } } rs.close(); cstmt.close(); catch (Exception e) { e.printStackTrace(); } } 2 使用带有输入参数的存储过程 public static void executeStoredProcedure(Connection con) { try { CallableStatement cstmt = con.prepareCall("{call https://www.wendangku.net/doc/5110578006.html,pGetEmployeeManagers(?)}"); cstmt.setInt(1, 50); ResultSet rs = cstmt.executeQuery(); while (rs.next()) { System.out.println("EMPLOYEE:"); System.out.println(rs.getString("LastName") + ", " +

rs.getString("FirstName")); System.out.println("MANAGER:"); System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName")); System.out.println(); } } rs.close(); cstmt.close(); catch (Exception e) { e.printStackTrace(); } } 3 使用带有输出参数的存储过程 public static void executeStoredProcedure(Connection con) { try { CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}"); cstmt.setInt(1, 5); cstmt.registerOutParameter(2, java.sql.Types.INTEGER); cstmt.execute(); System.out.println("MANAGER ID: " + cstmt.getInt(2)); } catch (Exception e) { e.printStackTrace(); } } 4 使用带有返回状态的存储过程

Oracle+PlSql存储过程

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 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) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) 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)的区别。

相关文档
相关文档 最新文档