设为首页 加入收藏

TOP

玩转oracle学习第七天(二)
2015-11-21 02:02:52 来源: 作者: 【 】 浏览:1
Tags:玩转 oracle 学习
1)创建一个包,如下:
--返回结果集的过程
--创建一个包,包中定义了一个游标,类型test_cursor
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;

(2)创建存储过程
create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno = spNO;
end;


java程序调用:
//创建CallableStatement
CallableStatement cs=ct.prepareCall("{call sp_pro9(?,?)}");

//给?赋值
cs.SetInt(1,10);
cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);

//执行
cs.execute();

ResultSet rs = (ResultSet)cs.getObject(2);
while(rs.next())
{
System.out.println(rs.getInt(1)+" "+ra.getString(2));
}

编写分页过程
输入表名,每页显示记录数,当前页,返回总记录数,总页数
--oracle的分页:
select t1.*,rownum rn from(select * from emp) t1 where rownum<=10;

--在分页时,大家可以把下面的sql语句当做一个模板使用
select * from (select t1.*,rownum rn from(select * from emp order by sal) t1 where rownum<=10) where rn>=6;


--开发一个包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;

--开始编写分页的过程
create or replace procedure fenye(tableName in varchar2,
pagesize in number,--一页显示多少条记录
pageNow in number,--第几页
myrows out number, --总记录数
myPageCount out number,--总页数
p_cursor out testpackage.test_cursor) is
--定义部分
--定义sql语句 字符串
v_sql varchar2(1024);
--定义两个整数
v_begin number := (pageNow-1)*pagesize+1;
v_end number := pageNow*pagesize;
begin
--执行部分
v_sql := 'select * from (select t1.*,rownum rn from(select * from '||tbaleName ||') t1 where rownum<='||v_end ||') where rn>=' ||v_begin;
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql
v_sql := 'select count(*) from ' || tableName;
--执行sql,并把返回的值,赋给myrows
execute immediate v_sql into myrows;
--计算myPageCount
if mod(myrows,Pagesize)=0 then
myPageCount:=myrows/Pagesize;
else
myPageCount:=myrows/Pagesize+1
end if;
--关闭游标
--close p_cursor;
end;
/

java程序来验证分页过程显示的正确性
//测试分页

//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection ct=DriverManager.getConnection("...");

CallableStatement cs=ct.prepareCall("{call fenye(?,?,?,?,?,?)}");

cs.setString(1,"emp");
cs.setInt(2,5);
cs.setInt(3,1);

cs.registerOutParameter(4,orace.jdbc.OracleTypes.INTEGER);

cs.registerOutParameter(5,oracle.jdbc.OrcleTYpes.INTEGER);

cs.registerOutParameter(5,oracle.jdbc.OrcleTYpes.CURSOR);

cs.execute();

//获取总记录数/这里要注意,getInt(4),其中4,是由该参数的位置决定的

int rowNum = cs.getInt(4);
int pageCount = cs.getINt(5);
ResultSet rs = (ResultSet)cs.getObject(6);

while(rs.next())
{
...
}

--新的需求,按照薪水由低到高进行排序

PL/SQL的进阶 --例外处理
例外的分类
例外传递
--例外案例
写一个块:
declare
--定义
v_ename emp.ename%type;
begin
--
select ename into v_name from emp where empno=&gno;
dbms.output.put_line(v_ename);
exception
when no_data_found then
dbms.output.put_line('编号没有');
end;

处理预定义例外:
PL/SQL提供了20过个预定义的例外:

case_no_found

case when ... when ... end case

dup_val_on_index
在试图在不合法的游标上执行操作时,会触发该例外
例如:试图从没有打开的游标提取数据,或是关闭没有打开的游标,则会
触发该例外

invalid_number
当输入的数据有误时,会触发该例外

比如:

too_many_rows
当执行select into语句的时候,如果返回超过了一行,则会触发该异常
zero_divide
value_error
当执行赋值操作时,如果变量的长度不足以容纳实际数据
处理自定义例外
预定义例外和自定义例外都是与oracle错误相关的,并且

--自定义例外
create or replace procedure ex_test(spNo number)
is
--定义一个例外
myex exception;
begin
--更新用户sal
update emp set sal=sal+1000 where empno=spNo;
--sql%notfound这里表示没有update
--raise myex;触发myex
if sql%notfound then
raise myex;
end if;
exception
when myex then
dbms_output.put_line('没有更新任何用户');
end;
/

exec ex_test(56);
oracle视

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle索引的dumpleafblock 下一篇mysql中bigint、int、mediumint、..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: