如何在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. as3. import java.sql.*;4. public class JavaDemo15. {6. public static void main(String[] argv)7. {8. System.out.println("hello, java demo1");9. }10. }11. /12.13.Java 已14.15.缔造。
16.17.SQL> show errors java source "javademo1"18.没有19.20.舛误。
21.22.SQL> create or replace procedure javademo123. 2 as24.3 language java name JavaDemo1.main(/doc/58c87bea102de2bd970 58806.html ng.String[]);25. 4 /26.27.过程已28.30.31.SQL> set serveroutput on32.SQL> call javademo1();33.34.调用35.实现。
36.37.SQL> call dbms_java.set_output(5000);38.39.调用40.实现。
Java调用Oracle存储过程详解

Java调⽤Oracle存储过程详解Java调⽤Oracle存储过程详解步骤:1、编写Oracle存储过程2、编写数据库获取连接⼯具类3、编写简单应⽤调⽤存储过程实现:1、Oracle存储过程:/*测试表*/create table test(id varchar2(32),name varchar2(32));/*存储过程插⼊数据*/CREATE OR REPLACE PROCEDURE insert_procedure(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO test (id, name) VALUES (PARA1, PARA2);END insert_procedure;/*存储过程返回结果集*/CREATE OR REPLACE PROCEDURE select_procedure(para_id IN VARCHAR2,name OUT sys_refcursor /* 这个sys_refcursor类型在SYS.STANDARD包中 */) ASBEGINOPEN name FORSELECT * FROM test WHERE id = para_id;END;2、JDBC⼯具类import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DBUtil {public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";public static final String URL = "jdbc:oracle:thin:@localhost:1521/orcl";public static final String USERNAME = "pfm";public static final String PASSWORD = "pfm";/*** 通过静态代码块注册数据库驱动*/static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 获得Connection** @returnConnection conn = null;try {conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) {e.printStackTrace();}return conn;}/*** 获得Statement** @return*/public static Statement getStatement() {Statement st = null;try {st = getConnection().createStatement();} catch (SQLException e) {e.printStackTrace();}return st;}/*** 关闭ResultSet** @param rs*/public static void closeResultSet(ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭Statement** @param st*/public static void closeStatement(Statement st) {if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭Connection** @param conn*/public static void closeConnection(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭全部** @param rs* @param sta* @param connpublic static void closeAll(ResultSet rs, Statement sta, Connection conn) {closeResultSet(rs);closeStatement(sta);closeConnection(conn);}}3、调⽤存储过程:import java.sql.CallableStatement;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import oracle.jdbc.driver.OracleTypes;/*** 测试调⽤存储过程**/public class StoredTest {public static void main(String[] args) {insert_call();//select_call();}/*** 执⾏存储过程插⼊数据*/public static void insert_call() {Connection conn = DBUtil.getConnection();PreparedStatement pst = null;CallableStatement proc = null; // 创建执⾏存储过程的对象try {proc = conn.prepareCall("{ call insert_procedure(?,?) }");proc.setString(1, "1"); // 设置第⼀个输⼊参数proc.setString(2, "hello call"); // 设置第⼀个输⼊参数proc.execute();// 执⾏} catch (SQLException e) {e.printStackTrace();} finally {try {// 关闭IO流proc.close();DBUtil.closeAll(null, pst, conn);} catch (Exception e) {e.printStackTrace();}}}/*** 执⾏存储过程查询数据*/public static void select_call() {Connection conn = DBUtil.getConnection();CallableStatement stmt;try {stmt = conn.prepareCall("{ call select_procedure(?, ?) }"); // ⽤此调⽤⽅法不能实现多⾏语法 stmt.setString(1, "1");stmt.registerOutParameter(2, OracleTypes.CURSOR);stmt.execute();ResultSet rs = (ResultSet) stmt.getObject(2);while (rs.next()) {System.out.println(rs.getString("name"));}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.closeConnection(conn);}}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。
JAVA调用ORACLE存储过程小结

JAVA调用ORACLE存储过程小结在Java中调用Oracle存储过程可以使用JDBC(Java Database Connectivity)技术。
JDBC是一种用于执行SQL语句和数据库操作的API。
在本文中,我们将讨论如何在Java中调用Oracle存储过程。
在调用Oracle存储过程之前,我们需要创建一个连接到数据库的JDBC连接。
这可以通过以下步骤完成:2. 创建数据库连接:使用JDBC驱动程序创建一个Connection对象来与数据库建立连接。
需要提供数据库的URL,用户名和密码。
例如:```String username = "your_username";String password = "your_password";Connection connection = DriverManager.getConnection(url, username, password);```这里的URL是连接到Oracle数据库的URL。
localhost表示连接的是本地主机,1521是Oracle数据库的默认端口,xe是Oracle Express Edition的默认数据库实例。
3. 调用存储过程:通过创建一个CallableStatement对象来调用存储过程。
首先,我们需要构造一个SQL语句,其中包含对存储过程的调用。
假设我们要调用一个名为`get_employee`的存储过程,它接受一个员工ID作为参数,并返回该员工的姓名和薪水。
在Java代码中,可以这样调用存储过程:```String sql = "{call get_employee(?,?,?)}";CallableStatement statement = connection.prepareCall(sql);```这里的`?`是占位符,表示存储过程的参数。
通过调用`connection.prepareCall(`方法,可以创建一个CallableStatement对象,并将SQL语句作为参数传递给它。
跟我学Oracle数据库系统管理和实现——应用Java JDBC 调用Oracle数据库存储过程的应用实例

(3)在PLSQL Developer中创建出 相关的存储过程及代 码代码
(4)在MyEclipse开发工具中创建类名称为 JdbcOracleProcedureWithOutResult,程序包名称为 com.px1987.javaoracle.dao.imple的Java程序类
(5)相关的Java程序的核心代码示例
7、Java JDBC调用Oracle存储过程相关函数的代码示例
使用JDBC调用函数的过程与JDBC调用存储过程非常类似, 但由于函数是由返回值的,因此要注册返回参数类型和获得返回 值。如下为调用的代码示例:
注意:使用JDBC调用函数或者过程获取多行查询结果,则需要使 用游标定义返回的数据集。
8、应用JDBC调用带输入参数值的Oracle存储过程的应用示 例
(1)创建数据库表someOneTable
Create table someOneTable (someOneField number(3,0), someTwoField varchar2 (20));
(2)在PLSQL Developer中创建出相关的存储过程及代码代码 1)在PLSQL Developer中应用过程模板创建过程,只需要选 择“文件”菜单中的“新建”——“程序窗口”——“过程”子 菜单 2)将出现存储过程的创建 模板窗口的对话框,在该对话 框的名称栏中输入存储过程的 名称,而在参数栏中输入存储 过程所需要的参数(本示例不 需要参数)。
3)点击对话框中的“确定”按钮,在存储过程的面板中输入 存储过程的代码,最终结果如下图所示。
4)编译该存储过程(产生出存储过程的机器码)
(3)在MyEclipse开发工具中创建类名称为 JdbcOracleProcedureWithOutResult,程序包名称为 com.px1987.javaoracle.dao.imple的Java程序类
用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客

用java调用oracle存储过程总结3-返回列表-偶爱老婆-搜狐博客三:返回列表由于oracle存储过程没有返回值,它的所有返回值都是通过out 参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。
如下:CREATE OR REPLACE PACKAGE TESTPACKAGE ASTYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;2,建立存储过程,存储过程为:CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.T est_CURSOR) ISBEGINOPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
在java里调用时就用下面的代码:package com.hyq.src;import java.sql.*;import java.io.OutputStream;import java.io.Writer;import java.sql.PreparedStatement;import java.sql.ResultSet;import oracle.jdbc.driver.*;public class TestProcedureTHREE {public TestProcedureTHREE() {}public static void main(String[] args ){String driver = "oracle.jdbc.driver.OracleDriver";String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";Statement stmt = null;ResultSet rs = null;Connection conn = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, "hyq", "hyq");CallableStatement proc = null;proc = conn.prepareCall("{ call hyq.testc(?) }");proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURS OR);proc.execute();rs = (ResultSet)proc.getObject(1);while(rs.next()){System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");}}catch (SQLException ex2) {ex2.printStackTrace();}catch (Exception ex2) {ex2.printStackTrace();}finally{try {if(rs != null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch (SQLException ex1) { }}}}。
Java,PLSQL调用 ORACLE存储函数以及存储过程

黑马程序员:Java,PL/SQL 调用 ORACLE 存储函数以及存储过程准备工作创建表 --- 创建测试用表 schoolCREATE TABLE school( ID number, --学校 id ---学校名NAME VARCHAR2(30) ); --- 添加数据INSERT into school values(1,'北京大学'); INSERT into school values(2,'南京大学'); INSERT into school values(1,'东京大学'); COMMIT;编写 java 代码连接数据库,获取 Connection 连接对象 public class OracleUtil { // 加载 Oracle 驱动 static { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) {黑马程序员郑州中心 编著e.printStackTrace(); } } // 获取数据库连接public static Connection getConnection() throws SQLException { Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@iP:1521:orcl", "system", "密码"); return connection; } } ——-存储函数——1.什么是存储函数存储函数又称为自定义函数。
可以接收一个或多个参数,返回一个结果。
在函数 中我们可以使用 PL/SQL 进行逻辑的处理。
Oracle8i中使用Java语言来开发存储过程

Oracle8i中使用Java语言来开发存储过程在Oracle8i之前,开发人员只能使用PL/SQL来开发存储过程。
而在Oracle8i之中,不仅可以使用原有的PL/SQL开发存储过程,而且也可以使用Java语言来开发存储过程。
本篇文章将简单介绍关于这方面的知识,包括以下内容:∙存储过程简介;∙Java存储过程∙Java存储过程的开发步骤∙使用Java开发过程;∙使用Java开发函数;∙使用Java开发包;∙使用Java开发触发器;∙使用Java开发对象方法;∙使用JDeveloper开发JSP。
存储过程简介存储过程是存储在数据库中的一段存储程序。
当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。
设计存储过程的方针∙在定义存储过程时,要使用其完成单一、相对集中的任务。
∙在定义存储过程时,不要定义已经由其它特征所提供功能的过程。
例如,不要定义强制数据完整性的过程(使用完整性约束)。
2. 存储过程的优点1) 安全性当创建了存储过程之后,可以将执行该过程的权限授予其它用户,从而使得他可以执行特定的数据库操作,而不能访问其它模式对象(例如表)。
例如,你可以将执行过程(更新表)的权限授予其它用户,但不授予它们直接访问该表的权限。
2) 性能∙存储过程只被发送到数据库一次,相对于SQL语句或PL/SQL块而言,其网络通信量更小。
∙当调用存储过程时,数据库会直接运行该存储过程,无需进行编译。
相对于SQL语句或PL/SQL块而言,其执行速度更快。
3) 内存分配存储过程充分利用了Oracle共享内存的能力。
在将存储过程装载到内存中后,多个用户可以同时调用该存储过程,从而降低了应用对Oracle的实际内存需求。
4) 生产力存储过程提高了开发生产力。
通过将公共集合编写为存储过程,避免了冗余代码,从而提高了开发生产力。
例如,我们可以编写用于插入、更新、删除AUTHS表的过程,此后应用可以直接调用这些过程,而无需重写SQL语句。
Oracle中基于Java的存储过程

第四章用PL/SQL和Java开发Oraclegi应用程序Java存储过程同PL/SQL存储过程一样,运行在Oracle服务器端。
PL/SQL存储过程和Java存储过程可以相互调用,但是Java存储过程可以利用Java语言的功能来完成一些PL/SQL存储过程完成不了的工作。
1.首先请打开PL/SQLdeveloper,输入用户名/密码和数据库的服务名,如下图4--1所示:图4一l登陆界砸进入系统后,您可以看见左边的各类导航栏,如图4—2所示:图4—2导航条界面2.在下图的JavaSource文件夹上右击,系统会弹出一个浮动菜单,单击菜单条上的。
New…”菜单,系统要求用户输入Java存储过程的名称和类名,如图4—3所示;Oracle中基于Java的存储过程图4—3输入Java存储过程的名称和类名界面我们输入FirstJava作为类名并按oK按钮,然后我们就进入了PL/SQLDeveloper的ProgramWindow,如图4—4所示:图4—4程序窗口上面程序窗口的第一行是createorreplaceandcompilejavasourcenamedFirstJavaas这一行要求Oracle创建一个名为“FirstJava”的Java存储过程并编译它,不用修改这一行。
第二到第七行是我们非常熟悉的普通Java类的源代码,一旦看到它,便可以随心所欲地修改这些Java代码了。
第四章用eL/SOL和Java开发Oracle9i应用程序在FirstJava类中添加两个静态方法。
在第一个方法(hello)中没有数据库交互,第二个方法(get_current_time)查询数据库并返回了数据库服务器的当前日期。
图4—5程序窗口请注意get_current_time方法中注册Oracle驱动类和获得数据库连接的写法。
因为上面的Java类已经在Oracle环境中运行,所以普通JDBc连接中的连接串(jdbc:oracle:thin:user/pwd@hostname:1521:instance_name)在该方法中没有出现,java.1ang.Class.forName(“oracle.jdbc.driver.OracleDriver”)在该方法中也没有出现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何在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. as3. import java.sql.*;4. public class JavaDemo15. {6. public static void main(String[] argv)7. {8. System.out.println("hello, java demo1");9. }10. }11. /12.13.Java 已14.15.缔造。
16.17.SQL> show errors java source "javademo1"18.没有19.20.舛误。
21.22.SQL> create or replace procedure javademo123. 2 as24.3 language java name JavaDemo1.main(ng.String[]);25. 4 /26.27.过程已28.30.31.SQL> set serveroutput on32.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 demo144.45.调用46.实现。
47.48.SQL> call javademo1();49.hello, java demo150.调用51.实现。
2. 使用外部class文件来装载缔造e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。
1.public class OracleJavaProc2.{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.oracledb17.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, OracleJavaProc.CLASS)24. 2 /25.26.Java 已27.28.缔造。
29.30.SQL> create or replace procedure testjavaproc as language javaname OracleJavaProc.main(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 500049.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 hisal) {8.9. System.out.println("Creating new salgrade for EMPLOYEE...");10.11. try {12. Connection conn =13. DriverManager.getConnection("jdbc:default:connection:");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.oracledb -v -resolve Or2.acleJavaProc.java3.arguments: -u scott/tiger@iihero.oracledb -v -resolve OracleJavaProc.java4.creating : source OracleJavaProc5.loading : source OracleJavaProc6.resolving: source OracleJavaProc查问一下状态:1.衔接到:2.Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production3.With the Partitioning, OLAP and Oracle Data Mining options4.JServer Release 9.2.0.1.0 - Production5.SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE JAVA%;6.7.OBJECT_NAME8.--------------------------------------------------------------------------------9.10.OBJECT_TYPE STATUS11.--------------------------------------------------12.OracleJavaProc13.JAVA CLASS VALID14.15.OracleJavaProc16.JAVA SOURCE VALID测试一下存储过程:1.SQL> create or replace procedure add_salgrade(id number, losalnumber, hisal num2.ber) as language java name OracleJavaProc.addSalGrade(int, int,int);3. 2 /4.5.过程已6.7.缔造。
8.9.SQL> set serveroutput on size 200010.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 HISAL25.---------- ---------- ----------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 hisal) {8.9. System.out.println("Creating new salgrade for EMPLOYEE...");10.11. try {12. Connection conn =13. DriverManager.getConnection("jdbc:default:connection:");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);pstmt.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 OracleJavaProc2.3.D:/tiger@iihero.oracledbeclipse3.1workspacedbtest>loadjava -u scott -v -resolve Or4.acleJavaProc/tiger@iihero.oracledb.java5.arguments: -u scott/tiger@iihero.oracledb -v -resolve OracleJavaProc.java6.creating : source OracleJavaProc7.loading : source OracleJavaProc8.resolving: source OracleJavaProc后边的利用示例:1.SQL> create or replace function query_hisal(grade number) return number as langu2.age java name OracleJavaProc.getHiSal(int) return int;3. 2 /4.5.函数已6.7.缔造。