java调用oracle中定义的包内的存储过程如何取到包内记录类型的值
在oracle中定义一个包。包内定义了存储过程和记录存储过程实现的是一个查询并把结果赋给包内的记录类型变量在java代码中调用包内的存储过程时如果得到包内的记录变量包定义...
在oracle中定义一个包。包内定义了存储过程和记录 存储过程实现的是一个查询并把结果赋给包内的记录类型变量 在java代码中调用
包内的存储过程时 如果得到包内的记录变量
包定义及包结构定义如下:
---包中定义记录型变量 两个函数 一个过程
create or replace package demo_pack
is
deptrec dept%rowtype; ---声明一个记录类型变量
function add_dept(dept_no number,dept_name varchar2,location varchar2) return number; --声明函数
function remove_dept(dept_no number) return number;
procedure query_dept(dept_no number);--声明过程
end demo_pack;
---包的主体部分
create or replace package body demo_pack
is
flag number;---声明一个私有的变量
function check_dept(dept_no number) return number; ---声明一个私有的函数
---私有函数的实现
function check_dept(dept_no number) return number
is
begin
select count(*) into flag from dept where deptno=dept_no;
if flag>0 then
flag:=1;
end if;
return flag;
end check_dept; ---公有函数的实现
function add_dept(dept_no number,dept_name varchar2,location varchar2) return number
is
begin
if check_dept(dept_no)=0 then
insert into dept(deptno,dname,loc) values(dept_no,dept_name,location);
return 1;--成功
end if;
return 0;--失败
end add_dept;
function remove_dept(dept_no number) return number
is
begin
if check_dept(dept_no)=1 then
delete from dept where deptno=dept_no;
return 1;
end if;
return 0;
end remove_dept;
procedure query_dept(dept_no number)
is
begin
if check_dept(dept_no)=1 then
select * into deptrec from dept where deptno=dept_no;
end if;
end query_dept;
end demo_pack;
当在java代码中调用 demo_pack.query_dept(?) 时,如何得到deptrec的值 除了在定义存储过程时给定一个输出参数 展开
包内的存储过程时 如果得到包内的记录变量
包定义及包结构定义如下:
---包中定义记录型变量 两个函数 一个过程
create or replace package demo_pack
is
deptrec dept%rowtype; ---声明一个记录类型变量
function add_dept(dept_no number,dept_name varchar2,location varchar2) return number; --声明函数
function remove_dept(dept_no number) return number;
procedure query_dept(dept_no number);--声明过程
end demo_pack;
---包的主体部分
create or replace package body demo_pack
is
flag number;---声明一个私有的变量
function check_dept(dept_no number) return number; ---声明一个私有的函数
---私有函数的实现
function check_dept(dept_no number) return number
is
begin
select count(*) into flag from dept where deptno=dept_no;
if flag>0 then
flag:=1;
end if;
return flag;
end check_dept; ---公有函数的实现
function add_dept(dept_no number,dept_name varchar2,location varchar2) return number
is
begin
if check_dept(dept_no)=0 then
insert into dept(deptno,dname,loc) values(dept_no,dept_name,location);
return 1;--成功
end if;
return 0;--失败
end add_dept;
function remove_dept(dept_no number) return number
is
begin
if check_dept(dept_no)=1 then
delete from dept where deptno=dept_no;
return 1;
end if;
return 0;
end remove_dept;
procedure query_dept(dept_no number)
is
begin
if check_dept(dept_no)=1 then
select * into deptrec from dept where deptno=dept_no;
end if;
end query_dept;
end demo_pack;
当在java代码中调用 demo_pack.query_dept(?) 时,如何得到deptrec的值 除了在定义存储过程时给定一个输出参数 展开
展开全部
oracle的存储过程要获取结果集的话,建议你用游标;
如下:
包和存储过程的修改
1、包内定义的变量deptrec类型更改为:
TYPE deptrec IS REF CURSOR;
2、存储过程 procedure query_dept(dept_no number)
增加输出参数:
procedure query_dept(dept_no number,p_res OUT deptrec);
3、存储过程内容更改为:
procedure query_dept(dept_no number,p_res OUT deptrec)
is
sqlstr VARCHAR2(512);
begin
if check_dept(dept_no)=1 then
sqlstr := 'select * from dept where deptno=:d_no';
OPEN p_res FOR sqlstr USING dept_no;
end if;
end query_dept;
java代码的调用如下:
CallableStatement st = conn.prepareCall("{call query_dept(?,?)}");
st.setLong(1,deptno);
st.registerOutParameter(2,OracleTypes.CURSOR);
st.execute();
ResultSet r = (ResultSet)st.getObject(1);
while(r.next()){
// r.getLong(dept_no);之类的了
}
如不想定义deptrec,可以直接把过程的输出参数更改为p_res OUT sys_refcursor,其它过程内部及java获取同上
如下:
包和存储过程的修改
1、包内定义的变量deptrec类型更改为:
TYPE deptrec IS REF CURSOR;
2、存储过程 procedure query_dept(dept_no number)
增加输出参数:
procedure query_dept(dept_no number,p_res OUT deptrec);
3、存储过程内容更改为:
procedure query_dept(dept_no number,p_res OUT deptrec)
is
sqlstr VARCHAR2(512);
begin
if check_dept(dept_no)=1 then
sqlstr := 'select * from dept where deptno=:d_no';
OPEN p_res FOR sqlstr USING dept_no;
end if;
end query_dept;
java代码的调用如下:
CallableStatement st = conn.prepareCall("{call query_dept(?,?)}");
st.setLong(1,deptno);
st.registerOutParameter(2,OracleTypes.CURSOR);
st.execute();
ResultSet r = (ResultSet)st.getObject(1);
while(r.next()){
// r.getLong(dept_no);之类的了
}
如不想定义deptrec,可以直接把过程的输出参数更改为p_res OUT sys_refcursor,其它过程内部及java获取同上
展开全部
过程如果没有返回结果的话 那JAVA 肯定收不到啊。。或者你写到数据的某个表中 然后你在去取这个数据。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想问的是怎样得到刚开始声明的变量(deptrec)的值是吧?
按照我的想法,你最后一个存储过程肯定把得到的值传递给了deptrec,肯定有一个返回值,直接在java中获得不行吗?
以上东西都是自己想象中的结果~刚开始学,错误的话别见怪~如果有结果情告诉我,谢谢~~关注中……
按照我的想法,你最后一个存储过程肯定把得到的值传递给了deptrec,肯定有一个返回值,直接在java中获得不行吗?
以上东西都是自己想象中的结果~刚开始学,错误的话别见怪~如果有结果情告诉我,谢谢~~关注中……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询