用java调用oracle存储过程总结
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存储过程总结转自:/TrampEagle/archive/2005/12/13/23605.aspx一:无返回值的存储过程存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGININSERT 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;ResultSet rs = null;Connection conn = null;CallableStatement cstmt = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");CallableStatement proc = null;proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");proc.setString(1, "100");proc.setString(2, "TestOne");proc.execute();}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) {}}}}当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
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语句作为参数传递给它。
Java调用Oracle存储过程返回结果集
Java调⽤Oracle存储过程返回结果集CREATE OR REPLACE PACKAGE typesASTYPE ref_cursor IS REF CURSOR;END;/CREATE TABLE STOCK_PRICES(RIC VARCHAR(6) PRIMARY KEY,PRICE NUMBER(7,2),UPDATED DATE );/CREATE OR REPLACE FUNCTION sp_get_stocks(v_price IN NUMBER)RETURN types.ref_cursorASstock_cursor types.ref_cursor;BEGINOPEN stock_cursor FORSELECT ric,price,updated FROM stock_prices WHERE price < v_price;RETURN stock_cursor;END;2. ⽤ sqlplus 测试过程SQL> var results refcursorSQL> exec :results := sp_get_stocks(20.0)SQL> print results3. 从 Java 调⽤import java.sql.*;import java.io.*;import oracle.jdbc.driver.*;public class JDBCDemo {/*** Compile-time flag for deciding which query to use*/private boolean useOracleQuery = true;/*** Class name of Oracle JDBC driver*/private String driver = "oracle.jdbc.driver.OracleDriver";/*** Initial url fragment*/private String url = "jdbc:oracle:thin:@";/*** Standard Oracle listener port*/private String port = "1521";/*** Oracle style of calling a stored procedure*/private String oracleQuery = "begin ? := sp_get_stocks(?); end;";/*** JDBC style of calling a stored procedure*/private String genericQuery = "{ call ? := sp_get_stocks(?) }";/*** Connection to database*/private Connection conn = null;/*** Constructor. Loads the JDBC driver and establishes a connection** @param host the host the db is on* @param db the database name* @param user user's name* @param password user's password*/public JDBCDemo(String host, String db, String user, String password) throws ClassNotFoundException, SQLException {// construct the urlurl = url + host + ":" + port + ":" + db;// load the Oracle driver and establish a connectiontry {Class.forName(driver);conn = DriverManager.getConnection(url, user, password);}catch (ClassNotFoundException ex) {System.out.println("Failed to find driver class: " + driver);throw ex;}catch (SQLException ex) {System.out.println("Failed to establish a connection to: " + url);throw ex;}}/*** Execute the stored procedure** @param price price parameter for stored procedure*/private void execute(float price)throws SQLException {String query = useOracleQuery ? oracleQuery : genericQuery;System.out.println("Query: " + query + "n");CallableStatement stmt = conn.prepareCall(query);// register the type of the out param - an Oracle specific typestmt.registerOutParameter(1, OracleTypes.CURSOR);// set the in paramstmt.setFloat(2, price);// execute and retrieve the result setstmt.execute();ResultSet rs = (ResultSet)stmt.getObject(1);// print the resultswhile (rs.next()) {System.out.println(rs.getString(1) + "t" +rs.getFloat(2) + "t" +rs.getDate(3).toString());}rs.close();stmt.close();}/*** Cleanup the connection*/private void cleanup() throws SQLException {if (conn != null)conn.close();}/*** Prints usage statement on stdout*/static private void usage() {System.out.println("java com.enterprisedt.demo.oracle.JDBCDemo " + " host db user password price");}/*** Runs the class*/public static void main(String[] args) throws Exception {if (args.length != 5) {age();System.exit(1);}else {try {// assign the args to sensible variables for clarityString host = args[0];String db = args[1];String user = args[2];String password = args[3];float price = Float.valueOf(args[4]).floatValue();// and execute the stored procJDBCDemo jdbc = new JDBCDemo(host, db, user, password); jdbc.execute(price);jdbc.cleanup();}catch (ClassNotFoundException ex) {System.out.println("Demo failed");}catch (SQLException ex) {System.out.println("Demo failed: " + ex.getMessage());}}}}。
Java操作Oracle的基本方式总结
1、连接数据库Package dusuzhong.Java.Oracle.Test;import java.sql.*;Public class ConnOraDB{/*** @ Class name: ConnOraDB* @ Class role: Connect to a oracle database* @ Author: Du suzhong* @ Date: 2010-5-4*/private final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;//驱动程序private final String DBURL = "jdbc:oracle:thin:@192.168.102.16:1521:Test" ;//数据库地址private final String DBUSER = "dsz779" ; //数据库登录用户名private final String DBPASSWORD = "123456" ; //数据库登录密码private Connection conn = null;public ConnOraDB(){/*** @ initial role: 完成对数据库的连接*/try{//加载数据库驱动程序Class.forName(DBDRIVER);}catch(Exception e){System.out.println("Can't load dbdriver!-->" + e.getMessage());}try{//连接到指定的数据库conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD) ;}catch(Exception e){System.out.println("Can't connect to the database!-->" + e.getMessage()) ;}}public Connection getConnection(){/*** 用来使其它类调用取得数据库连接* @return 数据库连接对象*/return this.conn;}}2、单句执行函数Package dusuzhong.Java.Oracle.Test; import java.sql.*;public class ExecutSingle{/*** @ Class name: ExecutSinle* @ Class role: Execute single SQL* @ Author: Du suzhong* @ Date: 2010-5-4*/Private Connection conn = null;Private Statement stmt = null;Private ResultSet rs = null;Private ResultSetMetaData rsmd = null;public ExecutSingle (){}Public void ExecuteQuery(String sql) {/*** 执行单句查询,并显示结果*/Integer numCols;String tempValue;try{//取得数据库的连接conn = new ConnOraDB().getConnection() ;stmt = conn.createStatement();rs = stmt.executeQuery(sql);rtmt= rs.getMetaData();numCols=rtmt.getColumnCount();while(rs.next()){//System.out.print("编号:" + rs.getInt("customer_id")) ;//System.out.print("/姓名:" + rs.getString("customer_name")) ;//System.out.print("/性别:" + rs.getString("customer_sex")) ;//System.out.println("/电话:" + rs.getString("customer_phone")) ;for (int i = 1; i <= numCols; i++){tempValue = rs.getString(i);if(tempValue == null) tempValue = "";list.add(tempValue);}}catch(Exception e){e.printStackTrace();}finally{try {if (rs != null) {rs.close();}if (stmt != null) {stmt.close();}if (conn != null) {conn.close();}}catch (SQLException e) {e.printStackTrace();}}}public void ExecuteSQL(String sql){/*** 执行单句操作*/try{conn = new ConnOraDB().getConnection() ;stmt = conn.createStatement();//rs = stmt.executeQuery(sql);rs = stmt.executeUpdate(sql);}catch (Exception e){e.printStackTrace();}finally{try{if (rs != null){rs.close();}if (stmt != null) {stmt.close();}if (conn != null) {conn.close();}}catch (SQLException e){e.printStackTrace();}}}}3、存储过程执行3.1 无返回值的存储过程执行1、建立存储过程CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN V ARCHAR2,PARA2 IN V ARCHAR2)IsBEGININSERT INTO T_TEST (I_ID,I_NAME) V ALUES (PARA1, PARA2);END TESTA;2、相应的JA V A程序Package dusuzhong.Java.Oracle.Test;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 TestProcedureOne{public TestProcedureOne(){}public static void main(String[] args ){Connection conn = null;//Statement stmt = null;//ResultSet rs = null;//CallableStatement cstmt = null;try{conn = new ConnOraDB.getConneciton();CallableStatement proc = null;//proc = conn.prepareCall("{ call Test.TESTA(?,?) }");proc = conn.prepareCall("{ call TESTA(?,?) }");proc.setString(1, "100"); //参数1设置为“100”proc.setString(2, "TestOne"); // 参数2设置为“TestOne”proc.execute();}catch (SQLException e){e.printStackTrace();}finally{try{if(rs != null){rs.close();}if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}catch(Eexeption e){Exit(0);}}}}注:调用存储过程时,切勿在call语句的前后使用空格。
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 进行逻辑的处理。
oracle存储过程调用javasource的方法
oracle存储过程调用javasource的方法Oracle存储过程调用Java方法介绍在Oracle数据库中,我们可以使用存储过程来执行一系列的数据库操作。
有时候,我们希望在存储过程中调用Java方法,以实现一些比较复杂的逻辑。
本文将详细介绍在Oracle存储过程中调用Java方法的几种方法。
方法一:使用Java Stored ProcedureJava Stored Procedure是Oracle数据库提供的一种特殊的存储过程类型,在该类型的存储过程中可以直接调用Java方法。
步骤:1.创建Java类,并将其编译成字节码文件(.class文件)。
2.将字节码文件导入到数据库中,可以使用loadjava工具或通过SQL语句执行导入。
3.创建Java Stored Procedure,将其指定为刚导入的字节码文件,并编写实际的存储过程逻辑。
4.在需要的地方调用Java Stored Procedure。
优点:•简单易用,只需创建Java类和Java Stored Procedure即可。
•可以直接访问数据库,无需通过其他方式。
缺点:•必须将Java类编译成字节码文件并导入到数据库中,稍显麻烦。
•Java Stored Procedure在数据库中运行,可能会造成数据库性能的损耗。
方法二:使用外部过程调用Java方法Oracle数据库通过提供外部过程功能,允许我们在存储过程中调用外部的Java方法。
步骤:1.将Java方法包装成Java函数或Java过程,并将其编译成动态加载库文件(.so或.dll文件)。
2.使用CREATE LIBRARY语句在数据库中创建对应的外部库。
3.创建存储过程,将其指定为调用外部库中的函数或过程,并编写实际的存储过程逻辑。
4.在需要的地方调用存储过程。
优点:•可以方便地调用已存在的Java方法,无需修改原有代码。
•外部过程在数据库外部运行,不会对数据库性能造成影响。
Oracle存储过程和java调用
1 存储过程介绍存储过程是指用于特定操作的pl/sql块,是由流控制和sql语句书写的过程。
存储过程经编译和sql优化后存储在数据库服务器中,使用时候只需要调用即可。
2 存储过程的优点1 使用存储过程,可以实现存储过程设计和编码工作分开进行,只要将存储过程名,参数,以及返回信息告诉编码人员即可。
2 使用存储过程可以减少sql注入式攻击,提供系统的安全性。
3 执行存储过程的用户要具有一定的权限才能使用存储过程。
没有数据操作权限的用户只能在系统控制下间接的存取数据。
4 存储过程的代码直接放在了数据库中,一般由客户端直接通过存储过程的名称来进行调用,简化客户端的操作逻辑。
3 存储过程的语法存储过程包含三部分声明,执行部分,异常。
可以有无参数的或带参数的存储过程。
存储过程的定义:Create [or replace] procedure procedure_name[(parameter1[mode] datatype1,parameter2 [model] datatype2…)]IS[As]BeginPl/sql block;End [procedure_name]其中: procedure_name是存储过程的名字,parameter用于指定参数,model用于指定参数模式,datatype用于指定参数类型, IS [AS]用于开始PL/SQL代码块。
注:1,当定义存储过程的参数时,只能指定数据类型,不能指定数据长度。
2,建立存储过程时,既可以指定存储过程的参数,也可以不提供任何参数。
3,存储过程的参数主要有三种类型:输入参数(IN)、输出参数(OUT)、输入输出参数(IN OUT),其中IN用于接收调用环境的输入参数,OUT用于将输出数据传递到调用环境,IN OUT不仅要接收数据,而且要输出数据到调用环境。
4 一个简单的存储过程+调试写一个存储过程--修改其中的数据select count(*) from table1 where name='weiguo' 的查询结果是 count(*)=0如果涉及到两个或以上的输入参数,如下图:5 存储过程和java程序的接口操作5.1 无返回值的存储过程查询数据库-显示5.2 有返回值的存储过程(非列表-单个出参)注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
java调用oracle存储过程
Java 调用存储过程为了同学们方便请使用system用户登录操作(一)创建表T_DEMO1CREATE TABLE system.T_DEMO1( "ID" number,"NAME" varchar)(二)注意,如果scott没有创建存储过程的权限,可以用sys用户登录创建权限创建存储过程create or replace procedure p_demo1(para1 in number,para2 in varchar2) isbeginINSERT INTO scott.t_demo1(id,name) VALUES (PARA1, PARA2);commit ;end p_demo1;(3)创建存储过程和创建表一样都可以在navicate或pl/sql或sql/plus 里执行。
看存储过程是否可用可以在sql/plus 活在pl/sql或navicat工具里面执行call p_demo1(1,'rrr') ;看看存储过程是否成功(4)java调用无返回值的存储过程请查看CallProdures1代码以下是调用有返回值的存储过程(1)创建存储过程CREATE OR REPLACE PROCEDURE p_demo2(PARA1 in number,PARA2 OUT VARCHAR2) ASBEGINSELECT name INTO PARA2 FROM scott.t_demo1 WHERE id= PARA1;END p_demo2;(2)请查看CallDemo2例子以下是调用返回是列表的存储过程(1)由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package了.所以要分两部分(2)创建包(package)CREATE OR REPLACE PACKAGE p_package ASTYPE Test_CURSOR IS REF CURSOR;end p_package;(3)创建存储过程CREATE OR REPLACE PROCEDURE p_demo3(p_CURSOR out p_package.Test_CURSOR) ISBEGINOPEN p_CURSOR FOR SELECT * FROM scott.t_demo1;END p_demo3;(4)具体代码参考CallDemo3。
java oracle存储过程写法及调用
java oracle存储过程写法及调用Java中调用和编写Oracle存储过程是非常常见的操作,可以利用存储过程来执行数据库操作,提高数据库的性能和安全性。
本文将为您详细介绍Java中调用和编写Oracle存储过程的方法和步骤。
一、什么是Oracle存储过程?Oracle存储过程是一段预定义在数据库中的PL/SQL代码,可以像函数一样接收参数和返回值,用于完成特定的数据库操作。
存储过程可以包含SQL语句、逻辑控制语句、流程控制语句等,可以完成复杂的业务逻辑和数据库操作。
二、Java中调用Oracle存储过程的步骤1. 导入相关的JDBC驱动在Java中调用Oracle存储过程之前,首先需要导入相关的JDBC驱动。
可以从Oracle官网下载相应版本的JDBC驱动,将其添加到Java项目的classpath中。
2. 建立数据库连接使用JDBC的Connection对象与数据库建立连接。
可以使用如下代码建立连接:String url = "jdbc:oracle:thin:localhost:1521:orcl";String username = "username";String password = "password";Connection conn = DriverManager.getConnection(url, username, password);需要将url、username和password替换为实际的数据库连接信息。
3. 创建CallableStatement对象使用Connection对象的prepareCall方法创建CallableStatement对象,该对象用于执行存储过程的调用。
String sql = "{call 存储过程名称(?, ?)}";CallableStatement cstmt = conn.prepareCall(sql);需要将存储过程名称替换为实际的存储过程名称。
java调用存储过程
Java 调用存储过程PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程。
下面我们介绍下使用java调用Oracle的存储过程。
1.配置调用类package com.mscncn.plsql.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBUtil {static{try {Class.forName("oracle.jdbc.OracleDriver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConntection(){Connection ct=null;try {ct = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.25:1521:oracle","scott","scott");} catch (SQLException e) {e.printStackTrace();}return ct;}}2.编写存储过程create or replace package pro_pk istype pager_cursor is ref cursor;procedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2);procedure delete_dept(dept_no in number,num out number);end pro_pk;create or replace package body pro_pk isprocedure add_dept(dept_no in number,dept_name in varchar2,location in varchar2)isexp_remaining exception;pragma exception_init(exp_remaining,-1);/*非预定义错误,-1是违反唯一约束*/ begininsert into dept values(dept_no,dept_name,location);if sql%found then /*隐式游标,sql*/return 1;elsereturn 0;end if;exceptionwhen exp_remaining thendbms_output.put_line('违反唯一约束.');end add_dept;procedure delete_dept(dept_no in number,num out number)isbegindelete from dept where deptno=dept_no;if sql%found thennum:=1;elsenum:=1;end if;end delete_dept;end pro_pk;create or replace package pageUtil istype page_cursor is ref cursor;--定义一个游标类型procedure pager(tName in varchar2, --表名pageNum in number, --页数pageSize in number,--每页记录数totalRecord out number,--总记录数totalPage out number,--总页数p_cursor out page_cursor);end pageUtil;create or replace package body pageUtil isprocedure pager(tName in varchar2, --表名pageNum in number, --页数pageSize in number,--每页记录数totalRecord out number,--总记录数totalPage out number,--总页数p_cursor out page_cursor) is--定义sql语句字符串v_sql varchar2(1000);--分页开始位置,与结束位置v_begin number:=(pageNum-1)*pageSize+1;v_end number:=pageNum*pageSize;beginv_sql:='select * from ( select t.*,rownum rn from '||tName||' t where rownum<='||v_end||') where rn>='||v_begin;--把游标和sql关联dbms_output.put_line(v_sql);open p_cursor for v_sql;--计算totalRecord与totalPagev_sql:='select count(*) from '||tName;--execute immediate v_sql into totalRecord;if mod(totalRecord,pageSize)=0 thentotalPage:=totalRecord/pageSize;elsetotalPage:=totalRecord/pageSize+1;end if;--关闭游标,这儿需要注意,如果我们在java程序中使用cursor,那么就一定不能关闭cursor--否则关闭cursor后,java程序中返回的结果集就是null--close p_cursor;end pager;end pageUtil;3.调用存储过程1)调用没有返回值的存储过程/*** java调用没有返回值的存储过程*/@Testpublic void proNoReulstTest(){Connection ct=DBUtil.getConntection();try {CallableStatement cs=ct.prepareCall("{call pro_pk.add_dept(?,?,?)}");cs.setInt(1, 13);cs.setString(2, "java开发部");cs.setString(3, "中国信阳");cs.execute();} catch (SQLException e) {e.printStackTrace();}finally{try {ct.close();} catch (SQLException e) {e.printStackTrace();}}}2)调用有返回值的存储过程/*** java调用有返回值的存储过程(返回值类型为number)*/@Testpublic void proHasReulstTest(){Connection ct=DBUtil.getConntection();try {CallableStatement cs=ct.prepareCall("{call pro_pk.delete_dept(?,?)}");cs.setInt(1, 13);//注册第二个参数为存储过程的返回值cs.registerOutParameter(2, OracleType.STYLE_INT);cs.execute();//通过参数的索引,来获取存储过程的返回值,索引从1开始int num=cs.getInt(2);System.out.println(num==1?"删除成功":"删除失败");} catch (SQLException e) {e.printStackTrace();}finally{try {ct.close();} catch (SQLException e) {e.printStackTrace();}}}3)java程序调用存储过程返回值为游标/*** 存储过程返回一个游标*/@Testpublic void proReturnCursorTest(){Connection ct=DBUtil.getConntection();try {CallableStatement cs=ct.prepareCall("{call pageUtil.pager(?,?,?,?,?,?)}");cs.setString(1, "emp");cs.setInt(2, 2);cs.setInt(3, 5);cs.registerOutParameter(4, OracleTypes.NUMBER);cs.registerOutParameter(5, OracleTypes.NUMBER);cs.registerOutParameter(6, OracleTypes.CURSOR);cs.execute();//通过参数的索引,来获取存储过程的返回值,索引从1开始int totalRecord=cs.getInt(4);int totalPage=cs.getInt(5);ResultSet rs=(ResultSet)cs.getObject(6);System.out.println("总记录数为:"+totalRecord+",总页数为:"+totalPage);while(rs.next()){System.out.println("雇员编号:"+rs.getInt("empno")+",雇员姓名:"+rs.getString("ename"));}} catch (SQLException e) {e.printStackTrace();}finally{try {ct.close();} catch (SQLException e) {e.printStackTrace();}} }。
如何实现Java对0racle存储过程的调用
s mts t tig 1 v id p n ) t .e S r ( , n e t o ; n
smt x c t U d t ( t . e u e p ae) e :
/ 的结果集 : / 取
R s l e =( a l atb S a e n) mtg t us ) e u S t s ( ce l l t t me t t ) e C ro : t r Or C a e s .
P /Q 中 创 建 Jv O R E 对 象 . 然 后 再 把 Jv O R E LS L aaS U C aa S U C 对 象 转 换 成 P /Q LS L存 储 过 程 。 因 为 Jv aa访 问 操 作 系 统 资 源
的 接 口 相 当 丰 富 .基 本 都 能 满 足 各 种 业 务 场 景 的 需 求 , 比 如 访 问 文 件 、调 用 动 态 链 接 库 等 ,现 在 实 现 一 个 具 体 应 用 , 就 是 访 问操 作 系 统 的 目录 树 及 其 下 的 文 件 , 主 要 起 个 抛 砖 引 玉 ‘ r cet i @1 4.04 9 1 2 :rl c t"tg r) , "
或 用 动 态 的 S L语 句 来 对 数 据 库 对 象 的 控 制 操 作 ,如 创 建 或 Q
删 除 数 据 库 表 、数 据 库 视 图 等 数 据 库 对 象 。 但 是 在 有 些 业 务 场 景 中 , 需 要 在 P /Q 中 直 接 访 问 或 控 制 操 作 系 统 的 一 些 LS L 资 源 ,操 作 系 统 的 资 源 有 很 多 , 比 如 文 件 、设 备 、操 作 系 统 的 A I 等 , 以 实 现 一 些 特 定 的 功 能 需 求 ,实 现 这 种 功 能 的 P等
Java调用Oracle的增删改查存储过程(供初学者学习)
------创建表 create table t_user ( id number(4 primary key, uname varchar2(20, age number(3 ; ((注意下面的语句结束后须加/才能执行 -----添加的存储过程 create or replace procedure tu_save ( id in number, uname in varchar, age in number as begin insert into t_user(id,uname,age values(id,uname,age; end tu_save; -----删除的存储过程create or replace procedure tu_del ( b_id in number as begin delete from t_user where id = b_id; end tu_del; -----修改的存储过程 create or replace procedure tu_update ( b_id in number, b_uname varchar, b_age number as begin update t_user set uname =b_uname,age = b_age where id = b_id; end tu_update; -----查询一条数据的存储过程create or replace procedure tu_query ( b_id in number, b_uname out varchar, b_age out number as begin select uname,age into b_uname,b_age from t_user where id = b_id; end tu_query; -----查询所有的存储过程(查询多个数据,步骤1,3,查询一条数据,步骤1,2 1.先创建程序包 create or replace package tu_queryAll as type aa_all is ref cursor; end tu_queryAll; 2.创建查询一条数据的查询 create or replace procedure tu_query1 ( b_id in number, b_all out tu_queryAll.aa_all as begin open b_all for select * fromt_user where id = b_id; end tu_query1; 3.利用程序包创建多查询 create or replace procedure tu_queryAlls ( b_all out tu_queryAll.aa_all as begin open b_all for select * from t_user; end tu_queryAlls; Java调用Oracle存储过程 ---1.创建连接数据库类import java.sql.*; public class UserDao { /** * 创建连接 */ public static Connection getConn( { Connection conn = null; try{ Class.forName("oracle.jdbc.driver.OracleDriver"; conn =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:aptech","scott","tiger"; } catch (Exception e { // TODO Auto-generated catch block e.printStackTrace(; } return conn; } /** * 测试连接是否成功 */ public static void main(String[] args { Connection con = new UserDao(.getConn(; System.out.println(con; } } ---2.操作存储过程 import erDao; import java.sql.*; public class UserDaoImpl extends UserDao { private Connection conn = null; ResultSet res = null; CallableStatement cstm = null; /** * 增加一条数据 * @param id * @param uname * @param age */ public void save(int id,String uname,int age { try { conn = this.getConn(; cstm =conn.prepareCall("{call tu_save(?,?,?}"; cstm.setInt(1, id; cstm.setString(2, uname; cstm.setInt(3, age; cstm.execute(; } catch (Exception e { // TODO: handle exceptione.printStackTrace(; }finally{ try { cstm.close(; conn.close(;} catch (Exception e { // TODO: handle exception e.printStackTrace(; } } } /** * 删除一条数据 * @param id */ public void del(int id { try { conn = this.getConn(; cstm = conn.prepareCall("{call tu_del_pro(?}"; cstm.setInt(1, id; cstm.execute(; } catch (Exception e { // TODO: handle exception e.printStackTrace(; }finally{ try { cstm.close(; conn.close(; } catch (Exception e { // TODO: handle exception e.printStackTrace(; } } } /** * 修改一条数据 * @param id * @param uname * @param age */ public void update(int id,String uname,int age { try { conn = this.getConn(; cstm =conn.prepareCall("{call tu_update(?,?,?}"; cstm.setInt(1, id; cstm.setString(2, uname; cstm.setInt(3, age; cstm.execute(; } catch (Exception e { // TODO: handle exceptione.printStackTrace(; }finally{ try { cstm.close(; conn.close(; } catch (Exception e { // TODO: handle exception e.printStackTrace(; } } } /** * 根据Id查询语句 * @param id */ public void query(int id { try { conn = this.getConn(; cstm = conn.prepareCall("{call tu_query(?,?,?}"; cstm.setInt(1, id; cstm.registerOutParameter(2, Types.VARCHAR; cstm.registerOutParameter(3, Types.INTEGER; cstm.execute(; String name =cstm.getString(2; int age = cstm.getInt(3; System.out.println(name+","+age; } catch (Exception e { // TODO: handle exception e.printStackTrace(; }finally{ try { cstm.close(; conn.close(; } catch (Exception e { // TODO: handle exception e.printStackTrace(; } } } /** * 根据游标查询一条数据 */ public void query1(int id { try { conn = this.getConn(; cstm = conn.prepareCall("{call tu_query1(?,?}"; cstm.setInt(1, id;cstm.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR; cstm.execute(; res = (ResultSetcstm.getObject(2;if(res.next( { System.out.println("id="+res.getInt(1+",uname="+res.getString(2+",age="+ res.getInt(3; } } catch (Exception e { // TODO: handle exceptione.printStackTrace(; }finally{ try { res.close(; cstm.close(; conn.close(; } catch (Exception e { // TODO: handle exception e.printStackTrace(; } } } /** * 查询所有数据 */ publicvoid queryAlls( { try { conn = this.getConn(; cstm = conn.prepareCall("{calltu_queryAlls(?}"; cstm.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR; cstm.execute(; res = (ResultSetcstm.getObject(1;while(res.next( { System.out.println("id="+res.getInt(1+",uname="+res.getString(2+",age ="+res.getInt(3; } } catch (Exception e { // TODO: handle exception e.printStackTrace(; }finally{ try { res.close(; cstm.close(; conn.close(; } catch (Exception e { // TODO: handle exception e.printStackTrace(; } } } /** * 调用方法进行增删改查 */ public static void main(String[] args { UserDaoImpl udao = new UserDaoImpl(; //udao.save(3,"wangwu", 23; // udao.del(3; // udao.update(1, "handan", 55; // udao.query(1; // udao.query1(3; // udao.queryAlls(; } }。
JAVA调用ORACLE存储过程小结
JAVA调用ORACLE存储过程小结在Java中调用Oracle存储过程是一个常见的需求,本文将给出一个关于如何在Java中调用Oracle存储过程的小结。
主要包括以下方面内容:1. 连接到Oracle数据库:首先需要使用Java的JDBC API来连接到Oracle数据库。
可以使用Oracle提供的JDBC驱动程序,通过加载驱动程序的方式来建立与数据库的连接。
在连接数据库时,需要提供数据库的URL、用户名和密码。
2. 构造存储过程的调用语句:在Java中调用Oracle存储过程时,需要构造一个适当的SQL语句来调用存储过程。
调用语句的格式为“{call 存储过程名(参数1, 参数2, ...)}”。
3. 设置存储过程的输入参数:在构造存储过程的调用语句后,需要通过PreparedStatement对象设置存储过程的输入参数。
这可以通过调用PreparedStatement对象的setXXX(方法来实现,其中XXX是参数的数据类型。
例如,如果输入参数是整数类型,则可以调用setInt(方法设置参数的值。
4. 执行存储过程:设置好存储过程的输入参数后,可以通过调用PreparedStatement对象的executeUpdate(或execute(方法来执行存储过程。
executeUpdate(方法适用于执行插入、更新或删除操作的存储过程,而execute(方法适用于执行查询操作的存储过程。
5. 获取存储过程的输出参数:执行存储过程后,可以通过PreparedStatement对象的getXXX(方法来获取存储过程的输出参数的值。
需要注意的是,存储过程的输出参数必须在执行存储过程之前通过调用registerOutParameter(方法来注册。
6. 关闭连接和释放资源:执行完存储过程后,需要关闭与数据库的连接,并释放相关的资源。
可以通过调用Connection对象的close(方法来关闭连接。
下面是一个示例代码,展示了如何在Java中调用Oracle存储过程:```javaimport java.sql.*;public class CallOracleProcedurepublic static void main(String[] args)Connection conn = null;CallableStatement stmt = null;try// 连接到Oracle数据库Class.forName("oracle.jdbc.driver.OracleDriver");//构造存储过程的调用语句String sql = "{call PROCEDURE_NAME(?, ?, ?)}";stmt = conn.prepareCall(sql);//设置存储过程的输入参数stmt.setString(1, "input1");stmt.setInt(2, 10);//注册存储过程的输出参数stmt.registerOutParameter(3, Types.VARCHAR);//执行存储过程stmt.executeUpdate(;//获取存储过程的输出参数String output = stmt.getString(3);System.out.println("Output: " + output);} catch (SQLException , ClassNotFoundException e) e.printStackTrace(;} finally//关闭连接和释放资源tryif (stmt != null) stmt.close(;if (conn != null) conn.close(;} catch (SQLException e)e.printStackTrace(;}}}```上述示例代码展示了如何通过Java程序调用Oracle存储过程。
oracle存储过程调用javasource的方法(一)
oracle存储过程调用javasource的方法(一)Oracle存储过程调用JavaSource的方法引言在Oracle数据库中,我们可以使用存储过程来进行复杂的数据处理和业务逻辑实现。
有时候,我们需要在存储过程中调用Java代码,以实现更复杂的功能。
本文将介绍一些在Oracle存储过程中调用JavaSource的方法。
方法一:使用CREATE JAVA语句创建Java类首先,我们可以使用CREATE JAVA语句在Oracle数据库中创建一个Java类,然后在存储过程中调用这个Java类的方法。
具体步骤如下: 1. 使用CREATE JAVA语句在Oracle数据库中创建一个Java类。
例如:CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "He lloWorld" ASpublic class HelloWorld {public static String sayHello(String name) {return "Hello, " + name + "!";}};2.创建一个存储过程,其中调用了刚刚创建的Java类的方法。
例如:CREATE OR REPLACE PROCEDURE callJavaMethod ISlanguage Java name '() return ';resultStr ;BEGINresultStr := ('World');DBMS__line(resultStr);END;3.执行存储过程,测试Java类的调用是否成功。
例如:BEGINcallJavaMethod;END;方法二:使用CREATE LIBRARY语句创建Java库另一种方式是使用CREATE LIBRARY语句在Oracle数据库中创建一个Java库,然后在存储过程中调用这个Java库。
java下实现调用oracle的存储过程和函数
java下实现调用oracle的存储过程和函数在oracle下创建一个test的账户,然后1.创建表:STOCK_PRICES[cpp]view plaincopyprint?1.--创建表格2.CREATE TABLE STOCK_PRICES(3.RIC VARCHAR(6) PRIMARY KEY,4.PRICE NUMBER(7,2),5.UPDATED DATE );2.插入测试数据:[sql]view plaincopyprint?1.--插入数据2.INSERT INTO stock_prices values('1111',1.0,SYSDATE);3.INSERT INTO stock_prices values('1112',2.0,SYSDATE);4.INSERT INTO stock_prices values('1113',3.0,SYSDATE);5.INSERT INTO stock_prices values('1114',4.0,SYSDATE);3.建立一个返回游标:PKG_PUB_UTILS[cpp]view plaincopyprint?1.--建立一个返回游标2.CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS3.--动态游标4.TYPE REFCURSOR IS REF CURSOR;5.END PKG_PUB_UTILS;4.创建和存储过程:P_GET_PRICE[sql]view plaincopyprint?1.--创建存储过程2.CREATE OR REPLACE PROCEDURE P_GET_PRICE3.(4.AN_O_RET_CODE OUT NUMBER,5.AC_O_RET_MSG OUT VARCHAR2,6.CUR_RET OUT PKG_PUB_UTILS.REFCURSOR,7.AN_I_PRICE IN NUMBER8.)9.IS10.BEGIN11.AN_O_RET_CODE := 0;12.AC_O_RET_MSG := '操作成功';13.14.OPEN CUR_RET FOR15.SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;16.EXCEPTION17.WHEN OTHERS THEN18.AN_O_RET_CODE := -1;19.AC_O_RET_MSG := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;20.END P_GET_PRICE;5.创建函数:[cpp]view plaincopyprint?1.--创建函数:F_GET_PRICE2.CREATE OR REPLACE FUNCTION F_GET_PRICE(v_price IN NUMBER)3.RETURN PKG_PUB_UTILS.REFCURSOR4.AS5.stock_cursor PKG_PUB_UTILS.REFCURSOR;6.BEGIN7.OPEN stock_cursor FOR8.SELECT * FROM stock_prices WHERE price < v_price;9.RETURN stock_cursor;10.END;6.JAVA调用存储过程返回结果集JDBCoracle10G_INVOKEPROCEDURE.java[java]view plaincopyprint?1.import java.sql.*;2.import oracle.jdbc.OracleCallableStatement;3.import oracle.jdbc.OracleTypes;4.5./* 本例是通过调用oracle的存储过程来返回结果集:6.* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip7.*/8.public class JDBCoracle10G_INVOKEPROCEDURE {9.Connection conn = null;10.Statement statement = null;11.ResultSet rs = null;12.CallableStatement stmt = null;13.14.String driver;15.String url;16.String user;17.String pwd;18.String sql;19.String in_price;20.21.public JDBCoracle10G_INVOKEPROCEDURE()22.{23.driver = "oracle.jdbc.driver.OracleDriver";24.url = "jdbc:oracle:thin:@localhost:1521:ORCL";25.// oracle 用户er = "test";27.// oracle 密码28.pwd = "test";29.init();30.// mysid:必须为要连接机器的sid名称,否则会包以下错:31.// java.sql.SQLException: Io 异常: Connection32.//refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERRO R=(CODE=12505)(EMFI=4))))33.// 参考连接方式:34.// Class.forName( "oracle.jdbc.driver.OracleDriver" );35.// cn = DriverManager.getConnection(36.// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );37.38.}39.40.public void init() {41.System.out.println("oracle jdbc test");42.try {43.Class.forName(driver);44.System.out.println("driver is ok");45.conn = DriverManager.getConnection(url, user, pwd);46.System.out.println("conection is ok");47.statement = conn.createStatement();48.// conn.setAutoCommit(false);49.// 输入参数50.in_price = "3.0";51.// 调用函数52.stmt = conn.prepareCall("call P_GET_PRICE(?,?,?,?)");53.stmt.registerOutParameter(1, java.sql.Types.FLOAT);54.stmt.registerOutParameter(2, java.sql.Types.CHAR);55.stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);56.stmt.setString(4, in_price);57.stmt.executeUpdate();58.int retCode = stmt.getInt(1);59.String retMsg = stmt.getString(2);60.if (retCode == -1) { // 如果出错时,返回错误信息61.System.out.println("报错!");62.} else {63.// 取的结果集的方式一:64.rs = ((OracleCallableStatement) stmt).getCursor(3);65.// 取的结果集的方式二:66.// rs = (ResultSet) stmt.getObject(3);67.String ric;68.String price;69.String updated;70.// 对结果进行输出71.while (rs.next()) {72.ric = rs.getString(1);73.price = rs.getString(2);74.updated = rs.getString(3);75.System.out.println("ric:" + ric + ";-- price:" + price76.+ "; --" + updated + "; ");77.}78.}79.80.} catch (Exception e) {81.e.printStackTrace();82.} finally {83.System.out.println("close ");84.}85.}86.87.public static void main(String args[])// 自己替换[]88.{89.new JDBCoracle10G_INVOKEPROCEDURE();90.}91.}7.开发JAVA调用函数返回结果集JDBCoracle10G_INVOKEFUNCTION.java[java]view plaincopyprint?1.import java.sql.*;2.import oracle.jdbc.OracleCallableStatement;3.import oracle.jdbc.OracleTypes;4.5./*6./* 本例是通过调用oracle的函数来返回结果集:7.* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip8.*/9.public class JDBCoracle10G_INVOKEFUNCTION {10.Connection conn = null;11.Statement statement = null;12.ResultSet rs = null;13.CallableStatement stmt = null;14.15.String driver;16.String url;17.String user;18.String pwd;19.String sql;20.String in_price;21.22.public JDBCoracle10G_INVOKEFUNCTION()23.{24.driver = "oracle.jdbc.driver.OracleDriver";25.url = "jdbc:oracle:thin:@localhost:1521:ORCL";26.// oracle 用户er = "test";28.// oracle 密码29.pwd = "test";30.init();31.// mysid:必须为要连接机器的sid名称,否则会包以下错:32.// java.sql.SQLException: Io 异常: Connection33.//refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERRO R=(CODE=12505)(EMFI=4))))34.// 参考连接方式:35.// Class.forName( "oracle.jdbc.driver.OracleDriver" );36.// cn = DriverManager.getConnection(37.// "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );38.}39.40.public void init() {41.System.out.println("oracle jdbc test");42.try {43.Class.forName(driver);44.System.out.println("driver is ok");45.conn = DriverManager.getConnection(url, user, pwd);46.System.out.println("conection is ok");47.statement = conn.createStatement();48.// conn.setAutoCommit(false);49.// 输入参数50.in_price = "5.0";51.// 调用函数52.stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");53.// stmt.registerOutParameter(1, java.sql.Types.FLOAT);54.// stmt.registerOutParameter(2, java.sql.Types.CHAR);55.stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);56.stmt.setString(2, in_price);57.stmt.executeUpdate();58.// 取的结果集的方式一:59.rs = ((OracleCallableStatement) stmt).getCursor(1);60.// 取的结果集的方式二:61.// rs = (ResultSet) stmt.getObject(1);62.String ric;63.String price;64.String updated;65.66.while (rs.next()) {67.ric = rs.getString(1);68.price = rs.getString(2);69.updated = rs.getString(3);70.System.out.println("ric:" + ric + ";-- price:" + price + "; --"71.+ updated + "; ");72.}73.74.} catch (Exception e) {75.e.printStackTrace();76.} finally {77.System.out.println("close ");78.}79.}80.81.public static void main(String args[])// 自己替换[]82.{83.new JDBCoracle10G_INVOKEFUNCTION();84.}85.}。
用java调用oracle存储过程总结
用java调用oracle存储过程总结分类:PL/SQL系列2009-09-24 15:08 253人阅读评论(0) 收藏举报声明:以下的例子不一定正确,只是为了演示大概的流程。
一:无返回值的存储过程存储过程为:CREATE OR REPLAC E PROCED URE TESTA(PARA1IN VARCHA R2,PARA2IN VARCHA R2) ASBEGININSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA;然后呢,在java里调用时就用下面的代码:packag e com.hyq.src;import java.sql.*;import java.sql.Result Set;public classTestPr ocedu reOne {public TestPr ocedu reOne() {}public static void main(String[] args ){String driver = "oracle.jdbc.driver.Oracle Drive r";String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";Statem ent stmt = null;Result Set rs = null;Connec tionconn = null;Callab leSta temen t cstmt= null;try {Class.forNam e(driver);conn = Driver Manag er.getCon necti on(strUrl, " hyq ", " hyq ");Callab leSta temen t proc = null;proc = conn.prepar eCall("{ call HYQ.TESTA(?,?) }");proc.setStr ing(1, "100");proc.setStr ing(2, "TestOn e");proc.execut e();}catch(SQLExc eptio n ex2) {ex2.printS tackT race();}catch(Except ion ex2) {ex2.printS tackT race();}finall y{try {if(rs != null){rs.close();if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}}catch(SQLExc eptio n ex1) {}}}}二:有返回值的存储过程(非列表)当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
java调用Oracle存储过程方式汇总
spring调用Oracle存储过程,并用cursor返回结果集1. 创建表:Java代码1.create table TEST_USERS2.(3. USER_ID VARCHAR2(10) not null,4. NAME VARCHAR2(10) not null,5. PASSWORD VARCHAR2(20) not null6.)2. 创建存储过程:Java代码1.create or replace package display_users_package is2. type search_results is ref cursor;3. procedure display_users_proc(results_out out search_results, userId in test_er_id%type);4.end display_users_package;5.6.create or replace package body display_users_package is7. procedure display_users_proc(results_out out search_results, userId in test_er_id%type)8. is9. begin10. if userId is not null then11. open results_out for select * from test_users where user_id like userId || '%';12. else13. open results_out for select * from test_users;14. end if;15. end display_users_proc;16.end display_users_package;这个results_out是一个游标类型,用来返回查找的结果集。
oracle存储过程调用实践
一直以来,存储过程就是一个心病啊,都不知道到底什么东西。
不过幸好在别人的带领下,战胜了这个恐惧,算是小小的入门了。
(oracle的sql叫做pl-sql,在语法上和m-sql有一些不同的地方。
而且,由于java和Oracle的密切关系,所以oracle较高版本的pl-sql中也出现一些类似于面向对象编程的语法结构。
)现在把我遇到的各种错误列出来,当然我有log,要不然我都记不住了。
1.ORA-00921: unexpected end of SQL command基本sql错误2.bad SQL grammar基本sql错误3.wrong number or types of arguments in call to ***调用存储过程传入的参数不对4.weblogic.jdbc.wrapper.Array_oracle_sql_ARRAY 使用的是weblogic容器提供的ARRAY,不能直接转化成ORACLE的ARRAY,但是可以用java.sql下面的接口。
5. identifier *** must be declared 数据库中没有定义这个名字的存储过程6.ORA-03115: unsupported network datatype or representation 存储过程传入的参数类型不支持在pl-sql中有package,可以用来定义访问变量的自定义类型,但是返回的类型除了游标以外,都不能被外部,如jdbc来访问。
都会提示类型不知道的错误,不管你有没有加上表空间的名字。
而这个时候需要用全局的类型来定义。
全局的类型,主要分为三种:1.create or replacetype obj_1 as object (** number, ** number,** varchar2(36), ** varchar2(150));2.create or replacetype tab_1 as table of obj_1;3.create or replacetype array_1AS VARRAY(21) OF obj_1;这几种类型都可以作为返回值,而且,后两种类型,常常可以以多维数组的形式返回。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用java调用oracle存储过程总结转自:/TrampEagle/archive/2005/12/13/23605.aspx一:无返回值的存储过程存储过程为:CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGININSERT 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;ResultSet rs = null;Connection conn = null;CallableStatement cstmt = null;try {Class.forName(driver);conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");CallableStatement proc = null;proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");proc.setString(1, "100");proc.setString(2, "TestOne");proc.execute();}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) {}}}}当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二:有返回值的存储过程(非列表)存储过程为:CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS BEGINSELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;END TESTB;在java里调用时就用下面的代码:package com.hyq.src;public class TestProcedureTWO {public TestProcedureTWO() {}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.TESTB(?,?) }");proc.setString(1, "100");proc.registerOutParameter(2, Types.VARCHAR);proc.execute();String testPrint = proc.getString(2);System.out.println("=testPrint=is="+testPrint);}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) {}}}}}注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out 是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三:返回列表由于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.Test_CURSOR) IS BEGINOPEN 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.CURSOR);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) {}}}}在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。
PL/sql 调用带游标返回参数的存储过程:DECLARERCT1 GLOBALPKG.RCT1;c CP_Item%ROWTYPE;t_data number;BEGINCP_GetFirstDimResult(0, 1, RCT1);loopexit when RCT1%notfound;FETCH RCT1INTO c.id, c.item_code, c.item_name, c.p_id, c.is_leaf, c.flag, c.lever, t_data; DBMS_OUTPUT.put_line(c.id || ' ' || c.item_code || ' ' || c.item_name || ' ' ||c.p_id || ' ' || c.is_leaf || ' ' || c.flag || ' ' ||c.lever || ' ' || t_data);end loop;CLOSE RCT1;END;最完整的:JAVA调用ORACLE的存储过程、函数的返回结果集例子分类:ORACLE基础知识JAVA技巧2009-05-12 15:19 1479人阅读评论(0) 收藏举报以下开发例子参见两个附件的图片:JAVA调用ORACLE的存储过程、函数的返回结果集的JAVA开发界面.JPGJAVA调用ORACLE的存储过程、函数的返回结果集的PL-SQLDEPVELOPER界面.JPG具体过程如下:--例子开发工具:oralce数据库版本:oralce9i ,10Goralce的JDBC驱动:class12.zip ,主要下载该驱动包后,才可以连接oracleoralce数据库脚本执行工具: PL/SQL Developer Version 7.1.4.1390JAVA的IDE工具: ECLIPSE 3.1以上--开始准备:-- 用SYSTEM或者SYS用户登陆到oralce中-- 建立ZZH_TEST用户,该用户的密码为ZZH_TEST----用ZZH_TEST用户进入到PL/SQL Develope中,以下表、存储过程、函数均建立在ZZH_TEST用户中--(一).建立一张测试表--建立表:CREATE TABLE STOCK_PRICES(RIC VARCHAR(6) PRIMARY KEY,PRICE NUMBER(7,2),UPDATED DATE );/--对表插入数据INSERT INTO stock_pricesSELECT '1110',1.0,SYSDATE FROM DUAL;INSERT INTO stock_pricesSELECT '1111',2.0,SYSDATE FROM DUAL;INSERT INTO stock_pricesSELECT '1112',3.0,SYSDATE FROM DUAL;INSERT INTO stock_pricesSELECT '1113',4.0,SYSDATE FROM DUAL;--检查数据是否插入SELECT * FROM stock_prices--(二).建立一个返回游标CREATE OR REPLACE PACKAGE ZZH_TEST.PKG_PUB_UTILS IS --动态游标TYPE REFCURSOR IS REF CURSOR;END PKG_PUB_UTILS;/--(三).创建一个测试用的存储过程CREATE OR REPLACE PROCEDUREZZH_TEST.P_GET_PRICE(AN_O_RET_CODE OUT NUMBER,AC_O_RET_MSG OUT VARCHAR2,CUR_RET OUTPKG_PUB_UTILS.REFCURSOR,AN_I_PRICE IN NUMBER) ISBEGINAN_O_RET_CODE := 0;AC_O_RET_MSG := '操作成功';OPEN CUR_RET FORSELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE; EXCEPTIONWHEN OTHERS THENAN_O_RET_CODE := -1;AC_O_RET_MSG := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;END P_GET_PRICE;--(四).创建一个测试用的函数:CREATE OR REPLACE FUNCTION ZZH_TEST.F_GET_PRICE(v_price IN NUMBER) RETURN PKG_PUB_UTILS.REFCURSORASstock_cursor PKG_PUB_UTILS.REFCURSOR;BEGINOPEN stock_cursor FORSELECT ric,price,updated FROM stock_prices WHERE price < v_price;RETURN stock_cursor;END;--(五).开发JAVA调用存储过程返回结果集的例子:JDBCoracle10G_INVOKEPROCEDURE--(六).开发JAVA调用函数返回结果集的例子:JDBCoracle10G_INVOKEFUNCTION-------------------------------------------------------------------------------------------------------------------------------------================================================================== =====-------------------------------------------------------------------------------------------------------------------------------------2份JAVA源代码:-- (五).开发JAVA调用存储过程返回结果集的例子:JDBCoracle10G_INVOKEPROCEDUREimport java.sql.*;import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;/* 本例是通过调用oracle的存储过程来返回结果集:* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip*/public class JDBCoracle10G_INVOKEPROCEDURE {Connection conn = null;Statement statement = null;ResultSet rs = null;CallableStatement stmt = null;String driver;String url;String user;String pwd;String sql;String in_price ;public JDBCoracle10G_INVOKEPROCEDURE()driver = "oracle.jdbc.driver.OracleDriver";;url = "jdbc:oracle:thin:@10.168.1.193:1521:orcl";//oracle 用户user = "ZZH_TEST";//oracle 密码pwd = "ZZH_TEST";init();//mysid:必须为要连接机器的sid名称,否则会包以下错:// java.sql.SQLException: Io 异常: Connectionrefused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK =(ERROR=(CODE=12505)(EMFI=4))))//参考连接方式:// Class.forName( "oracle.jdbc.driver.OracleDriver" );// cn =DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORC L", sUsr, sPwd );}public void init(){System.out.println("oracle jdbc test");try{Class.forName(driver);System.out.println("driver is ok");conn = DriverManager.getConnection(url,user,pwd);System.out.println("conection is ok");statement = conn.createStatement();// conn.setAutoCommit(false);//输入参数in_price="3.0";//调用函数stmt = conn.prepareCall( "call P_GET_PRICE(?,?,?,?)");stmt.registerOutParameter(1, java.sql.Types.FLOAT);stmt.registerOutParameter(2, java.sql.Types.CHAR);stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);stmt.setString(4, in_price);stmt.executeUpdate();int retCode = stmt.getInt(1);String retMsg = stmt.getString(2);if (retCode == -1) { //如果出错时,返回错误信息System.out.println("报错!");} else {//取的结果集的方式一:rs = ((OracleCallableStatement)stmt).getCursor(3);//取的结果集的方式二:// rs = (ResultSet) stmt.getObject(3);String ric ;String price ;String updated ;//对结果进行输出while(rs.next()){ric = rs.getString(1);price = rs.getString(2);updated = rs.getString(3);System.out.println("ric:"+ric+";-- price:"+price+"; --"+updated+"; "); }}}catch(Exception e)e.printStackTrace();}finally{System.out.println("close ");}}public static void main(String args [])//自己替换[]{new JDBCoracle10G_INVOKEPROCEDURE();}}--================================================================== =====--源代码:--(六).开发JAVA调用函数返回结果集的例子:JDBCoracle10G_INVOKEFUNCTIONimport java.sql.*;import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;/*/* 本例是通过调用oracle的函数来返回结果集:* oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip*/public class JDBCoracle10G_INVOKEFUNCTION {Connection conn = null;Statement statement = null;ResultSet rs = null;CallableStatement stmt = null;String driver;String url;String user;String pwd;String sql;String in_price ;public JDBCoracle10G_INVOKEFUNCTION(){driver = "oracle.jdbc.driver.OracleDriver";;url = "jdbc:oracle:thin:@10.168.1.193:1521:orcl";//oracle 用户user = "ZZH_TEST";//oracle 密码pwd = "ZZH_TEST";init();//mysid:必须为要连接机器的sid名称,否则会包以下错:// java.sql.SQLException: Io 异常: Connectionrefused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK =(ERROR=(CODE=12505)(EMFI=4))))//参考连接方式:// Class.forName( "oracle.jdbc.driver.OracleDriver" );// cn =DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORC L", sUsr, sPwd );}public void init(){System.out.println("oracle jdbc test");try{Class.forName(driver);System.out.println("driver is ok");conn = DriverManager.getConnection(url,user,pwd);System.out.println("conection is ok");statement = conn.createStatement();//conn.setAutoCommit(false);//输入参数in_price="5.0";//调用函数stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");// stmt.registerOutParameter(1, java.sql.Types.FLOAT);// stmt.registerOutParameter(2, java.sql.Types.CHAR);stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);stmt.setString(2, in_price);stmt.executeUpdate();//取的结果集的方式一:rs = ((OracleCallableStatement)stmt).getCursor(1);//取的结果集的方式二:// rs = (ResultSet) stmt.getObject(1);String ric ;String price ;String updated ;while(rs.next()){ric = rs.getString(1);price = rs.getString(2);updated = rs.getString(3);System.out.println("ric:"+ric+";-- price:"+price+"; --"+updated+"; "); }}catch(Exception e){e.printStackTrace();}finally{System.out.println("close ");}}public static void main(String args [])//自己替换[] {new JDBCoracle10G_INVOKEFUNCTION();}}。