oracle查询所有序列 java+oracle function全攻略
--查看当前用户的所有序列
select sequence_owner,sequence_name from dba_sequences where sequence_owner='用户名';
注意事项:
1. 必须以管理员身份登录;
2. sequence_owner必须为大写,不管你的用户名是否大写。只有大写才能识别。
以一张book表的查询为例:
create table book
(
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;
然后创建我们的function存储过程:
create or replace function query_book(key varchar) return pkg_test.refcursor is
result pkg_test.refcursor;
begin
open result for
select * from book where key=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));
}
}
}
}
注意这里返回的数据集中内嵌了function返回的数据集,需要进行特殊处理。