- 浏览: 754370 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (396)
- JAVA (50)
- ORACLE (22)
- HIBERNATE (1)
- SPRING (26)
- STRUTS (4)
- OTHERS (0)
- MYSQL (11)
- Struts2 (16)
- JS (33)
- Tomcat (6)
- DWR (1)
- JQuery (26)
- JBoss (0)
- SQL SERVER (0)
- XML (10)
- 生活 (3)
- JSP (11)
- CSS (5)
- word (1)
- MyEclipse (7)
- JSTL (1)
- JEECMS (2)
- Freemarker (8)
- 页面特效 (1)
- EXT (2)
- Web前端 js库 (2)
- JSON http://www.json.org (3)
- 代码收集 (1)
- 电脑常识 (6)
- MD5加密 (0)
- Axis (0)
- Grails (1)
- 浏览器 (1)
- js调试工具 (1)
- WEB前端 (5)
- JDBC (2)
- PowerDesigner (1)
- OperaMasks (1)
- CMS (1)
- Java开源大全 (2)
- 分页 (28)
- Eclipse插件 (1)
- Proxool (1)
- Jad (1)
- Java反编译 (2)
- 报表 (6)
- JSON (14)
- FCKeditor (9)
- SVN (1)
- ACCESS (1)
- 正则表达式 (3)
- 数据库 (1)
- Flex (3)
- pinyin4j (2)
- IBATIS (3)
- probe (1)
- JSP & Servlet (1)
- 飞信 (0)
- AjaxSwing (0)
- AjaxSwing (0)
- Grid相关 (1)
- HTML (5)
- Guice (4)
- Warp framework (1)
- warp-persist (1)
- 服务器推送 (3)
- eclipse (1)
- JForum (5)
- 工具 (1)
- Python (1)
- Ruby (1)
- SVG (3)
- Joda-Time日期时间工具 (1)
- JDK (3)
- Pushlet (2)
- JSP & Servlet & FTP (1)
- FTP (6)
- 时间与效率 (4)
- 二维码 (1)
- 条码/二维码 (1)
最新评论
-
ctrlc:
你这是从web服务器上传到FTP服务器上的吧,能从用户电脑上上 ...
jsp 往 FTP 上传文件问题 -
annybz:
说的好抽象 为什么代码都有两遍。这个感觉没有第一篇 和第二篇 ...
Spring源代码解析(三):Spring JDBC -
annybz:
...
Spring源代码解析(一):IOC容器 -
jie_20:
你确定你有这样配置做过测试? 请不要转载一些自己没有测试的文档 ...
Spring2.0集成iReport报表技术概述 -
asd51731:
大哥,limit传-1时出错啊,怎么修改啊?
mysql limit 使用方法
前几天项目里数据存储支持了存储过程,当时赶进度,只是简单的拿SQL Server 2000做了测试。今天同事要用Oracle9i数据库,于是研究了一下Oracle的存储过程,不看不知道啊,居然Oracle里要支持存储过程如此复杂!!上网查资料,自己做实验,终于弄了大半夜才鼓捣出来!
项目里的需求很简单:通过一个存储过程返回一个数据集(当然,我只负责简单调用存储过程,存储过程内部可能很复杂了^_^)。不同于SQL Server 2000的存储过程,Oracle里的存储过程分为procedure和function两种,如果用procedure的话,无法直接返回结果集,读取结果集的方式比较复杂;function是可以返回结果集的存储过程,调用相对简单些。
下面的介绍将以一张BOOK表的查询为例:
create table BOOK
(
BOOKNUMBER CHAR(3) not null,
BOOKNAME VARCHAR2(50),
BOOKPRICE NUMBER(18,2)
)
(
BOOKNUMBER CHAR(3) not null,
BOOKNAME VARCHAR2(50),
BOOKPRICE NUMBER(18,2)
)
要返回数据集,就需要使用Oracle里的reference cursor类型,不过Oracle里这个类型用的方式比较罗唆(搞不明白Oracle为什么要弄的这么复杂),首先要声明一个引用的cursor类型,这个通过创建一个包来实现:
CREATE OR REPLACE PACKAGE PKG_TEST
AS
TYPE REFCURSOR IS REF CURSOR;
END PKG_TEST;
AS
TYPE REFCURSOR IS REF CURSOR;
END PKG_TEST;
然后创建我们的function存储过程:
create or replace function query_book(book_no varchar) return PKG_TEST.REFCURSOR is
Result PKG_TEST.REFCURSOR;
begin
open Result for
select * from book where book_no =book.booknumber;
return(Result);
end query_book;
Result PKG_TEST.REFCURSOR;
begin
open Result for
select * from book where book_no =book.booknumber;
return(Result);
end query_book;
在这个存储过程中,我们传入了查询键值key,返回了一个数据集对象
这样我们就有了一个名为query_book的存储过程,它可以返回一个结果数据集。要调用这个存储过程,可以通过CallableStatement接口来调用,这样需要写成类似'{?=call query_book(?)}'的查询语句,并且参数和返回值都必须用代码设置;在这里,一些简单的存储过程,也可以通过查询来调用。下面就是我使用的调用方法:
public class FuncTest {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:LeeDB",
"TEST", "test");
Statement stmt = connection.createStatement();
ResultSet dataset = stmt.executeQuery("SELECT query_book('001') FROM DUAL");
if (dataset.next()) {
ResultSet ret = (ResultSet)dataset.getObject(1);
while( ret.next() ) {
System.out.print(ret.getString(1));
System.out.print("\t");
System.out.print(ret.getString(2));
System.out.print("\t");
System.out.println(ret.getDouble(3));
}
}
}
}
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:LeeDB",
"TEST", "test");
Statement stmt = connection.createStatement();
ResultSet dataset = stmt.executeQuery("SELECT query_book('001') FROM DUAL");
if (dataset.next()) {
ResultSet ret = (ResultSet)dataset.getObject(1);
while( ret.next() ) {
System.out.print(ret.getString(1));
System.out.print("\t");
System.out.print(ret.getString(2));
System.out.print("\t");
System.out.println(ret.getDouble(3));
}
}
}
}
注意这里返回的数据集中内嵌了function返回的数据集,需要进行特殊处理。
上面代码执行之后可以成功返回结果:
001 Pascal编程 20.0
发表评论
-
oracle数据表增加、修改、删除字段操作
2012-06-28 18:54 0增加字段 declare vstr_sql ... -
oracle 存储过程in out inout三种参数模式
2011-08-09 10:36 1294Oracle 过程中定义了in|out|i ... -
Win7下安装Oracle 10g常见错误解决
2011-06-18 10:21 1088首先下对版本,Oracle 10g支持Win7版: http ... -
oracle 拆分字符串函数 返回结果集
2011-03-24 10:48 2272create or replace function spli ... -
oracle中substr函数的用法
2011-03-23 15:55 861In oracle/PLSQL, the substr fun ... -
oracle行转列
2011-03-15 19:20 14561. 概述 最近论坛很多人提的问题都与行列转换有关系,所以 ... -
oracle级联删除
2010-12-31 14:22 911通过触发器删除 create or replace trig ... -
oracle 10 TNSLSNR.exe 占用8080端口修改方法
2010-12-29 16:49 1564oracle 10服务一启动 TNSLSNR.exe 会占用8 ... -
java.sql.SQLException: Io 异常: Connection refused
2010-11-03 09:00 1853具体异常是: java.sql.SQLException: ... -
转:Oracle存储过程的开发的介绍
2010-06-30 13:59 1314以下的文章主要是 ... -
oracle视图及其功能
2010-06-30 11:33 1173select * from dictionary; ... -
Windows 下常见Oracle服务介绍
2010-04-07 14:07 1306Windows ... -
Oracle时间日期函数
2010-03-24 17:26 1142TO_DATE格式(以时间:2007-11 ... -
通过JDBC操纵Oracle LOB字段
2009-09-07 15:16 990在Oracle中,LOB(Larg ... -
Oracle常用数据字典查询语句
2009-08-27 09:27 1188查看当前用户的缺省表空间SQL>select usern ... -
oracle 百分比换算问题
2009-08-26 09:41 3347最近在做投票系统,每个投票的选项要算其在所有投票中的百分比: ... -
ORACLE -- Oracle分析函数详述【二】
2009-07-23 17:39 1404一.分析函数2(rank\dense_rank\row_num ... -
ORACLE -- Oracle分析函数详述【一】
2009-07-23 17:34 1752一.分析函数1(OVER) 目录: ============ ... -
oracle top N
2009-07-03 17:58 238111.在ORACLE中实现SELECT TOP N 由于 ... -
oracle 创建序列 表空间 用户
2009-07-03 10:11 1764--创建序列 CREATE SEQUENCE increa ...
相关推荐
5. **处理结果集**:遍历`ResultSet`获取查询结果,使用`resultSet.next()`判断是否有下一行,`resultSet.getString(columnIndex)`等方法获取列值。 6. **关闭资源**:在完成操作后,记得关闭`ResultSet`、`...
本篇将详细介绍如何使用CallableStatement调用Oracle存储过程,并处理返回的结果集(ResultSet)。 一、无返回值的存储过程 在Oracle中,一个无返回值的存储过程可能只执行某些操作,例如插入数据。以下是一个简单...
**JDBC与Oracle存储过程详解** Java Database Connectivity (JDBC) 是Java编程语言中用于连接数据库的标准API,它使得Java开发者能够与各种数据库系统进行交互,包括Oracle数据库。Oracle存储过程是预编译的SQL语句...
在执行后,通过`CallableStatement.getObject()`方法获取函数返回的结果。 四、异常处理 在调用过程中,可能会遇到SQL异常或其他运行时异常,需要使用try-catch-finally结构进行异常处理。捕获`SQLException`,根据...
执行SQL后,通过`getARRAY`方法获取返回的数组对象,然后将其转换为Java中的`String`数组进行处理。 请注意,实际应用中可能需要根据数据库连接信息、驱动版本和Oracle函数的具体返回类型进行调整。此外,为了确保...
在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程提高了代码的重用性和执行效率,同时也便于实现复杂的业务逻辑。 #### 二...
在本文档中,我们将探讨如何使用Groovy脚本结合JDBC技术从Oracle存储过程中获取数据,并将其转换为多层JSON格式。该方法特别适用于需要从XML输入中提取数据并将其转化为JSON输出的应用场景。以下是详细的步骤和技术...
在实际应用中,比如JDBC查询,代码示例展示了如何连接Oracle数据库、执行查询、处理结果集并确保资源正确释放。在面试中,对这些核心概念的理解和实际操作经验都是考察的关键点。理解并熟练运用这些知识点,有助于...
这使得函数能够执行复杂的计算并返回结果,这对于应用程序来说是非常有用的特性。在本例中,我们将学习如何通过Java来调用具有不同参数类型的Oracle函数。 #### 2. 准备工作 在开始编写Java代码之前,需要确保已经...
如果你需要在像Delphi这样的应用程序中调用Oracle的函数和存储过程,可以使用Oracle的客户端库(如oci.dll)或者ODBC/JDBC驱动。例如,在Delphi中,你可以使用Oracle的DBExpress组件(如TOracleQuery、...
1. **JDBC驱动**: 要连接到Oracle数据库,首先需要一个兼容的JDBC驱动,例如Oracle JDBC驱动(ojdbc.jar)。这个驱动程序允许Java应用程序与Oracle数据库进行通信。 2. **建立连接**: 使用`java.sql.DriverManager`...
对于Oracle函数,由于它会返回一个值,所以在Java中调用时,需要使用`registerOutParameter()`方法先声明返回值的数据类型,然后通过`CallableStatement`的`getXXX()`方法获取返回值。例如,如果函数返回一个整数,...
这个类定义了连接DB2所需的各种常量,如JDBC驱动类名、URL、用户名和密码,并提供了一个静态方法`queryJyxx`,用于执行SQL查询并返回结果。 **步骤三:创建后台函数** 在Oracle中创建一个函数`My_fun_queryJyxx`,...
首先,存储过程是一组为了完成特定功能的SQL语句集,它可以接受参数、执行复杂的逻辑,并可以返回结果。存储过程的执行速度快,因为它们在第一次执行时会被编译和优化,在后续调用时可以直接使用优化后的代码。 ...
4. 子程序:可以创建过程(PROCEDURE)和函数(FUNCTION),它们可以接受参数,返回结果,并在PL/SQL代码中调用。 5. 游标:用于处理查询结果集,可以逐行读取数据。 6. 异常处理:通过BEGIN...EXCEPTION...END结构...
用 Java 调用 Oracle 存储过程可以使用 JDBC 或 Oracle 的java驱动程序。下面是用 Java 调用 Oracle 存储过程的总结: 1. 无返回值的存储过程 无返回值的存储过程可以使用 CallableStatement 来调用。 2. 有...
通过JDBC可以获取Oracle Sequence的新值,例如使用CallableStatement调用DBMS_OUTPUT.PUT_LINE或NEXTVAL过程。 7. **Oracle卸载**: 卸载Oracle涉及到停止所有Oracle服务,删除注册表项,移除文件和目录,以及清理...
6. **游标**:游标用于处理SQL查询结果集,允许逐行操作数据,常用于循环遍历查询结果。 7. **异常处理**:通过EXCEPTION关键字定义异常处理块,能够捕获并处理运行时错误,提高程序健壮性。 8. **动态SQL**:允许...
- **JDBC(Java Database Connectivity)**:Java通过JDBC API与Oracle数据库交互,包括连接、执行SQL和PL/SQL、处理结果集等。 - **CallableStatement接口**:用于执行存储过程和函数,支持IN、OUT、IN OUT参数。...
Class.forName("oracle.jdbc.driver.OracleDriver"); ``` 2. 创建数据库连接: ```java Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@//hostname:port/service_name", "username", ...