千家信息网

Oracle学习笔记(续)

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,接上文 Oracle学习笔记PL/SQL 数据分页Java调用无返回值的存储过程create table book( bookId number, bookName varchar
千家信息网最后更新 2024年11月26日Oracle学习笔记(续)

接上文 Oracle学习笔记


PL/SQL 数据分页

Java调用无返回值的存储过程

create table book(      bookId number,      bookName varchar2(50),      publishHouse varchar2(50));
create or replace procedure pro_page(BookId in number,BookName in varchar2,PublishHouse in varchar2)isbegin insert into book values(BookId,BookName,PublishHouse);end;

Java中调用存储过程(无返回值)

CallabelStatement cs = connection.prepareCall("{call pro(?,?,?)}");cs.setInt(1,10);cs.setString(2,"笑傲江湖");cs.setString(3,"人民出版社");cs.execute();

/******************************************************************************/

Java调用有返回值的存储过程

create or replace procedure pro1(no in number,name out varchar2)isbegin select ename into name from SCOTT.Emp where empno =no;end;

Java中调用存储过程(有返回值)

CallabelStatement cs = connection.prepareCall("{call pro1(?,?)}");cs.setInt(1,7788);cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);cs.execute();String name = cs.getString(2);//取出返回值

/******************************************************************************/

返回结果集的存储过程

Step1.创建一个包,在包中定义类型test_cursor

create or replace package testpackage astype test_cursor is refcursor;end testpackage;

Step2.创建过程

create or replace procedure pro(no in number,v_cursor out testpackage.test_cursor)begin open v_cursor forselect * from SCOTT.emp where deptno =no;end;

Step3.在Java中调用

CallabelStatement cs = connection.prepareCall("{call pro(?,?)}");cs.setInt(1,10);cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);cs.execute();ResultSetrs = (ResultSet)cs.getObject(2);while(rs.next()){ }

分页过程

select t1.*,rownum rn from(select*fromSCOTT.Student) t1;--按照编号排序select t1.*,rownum rn from(select*fromSCOTT.Student) t1 where rownum<10;select * from(select t1.*,rownum rn from(select*fromSCOTT.Student) t1 where rownum<=20)where rn >=11;--查询第11-20条数据~~~~模板select * from(select t1.*,rownum rn from(select*fromSCOTT.EMP orderby sal) t1 where rownum<=9)where rn >=5;--按照sal排序
create or replace package testpackage astype test_cursor is refcursor; --创建包,声明游标end testpackage;
create or replace procedure fenye(tablename invarchar2,Pagesize in number,Pagenow in number,myrows out number,--总记录数myPageCount out number,--总页数my_cursor out testpackage.test_cursor--返回的记录集)isv_sql varchar2(1000);v_begin number:=(Pagenow-1)*Pagesize+1;v_end number:=Pagenow*Pagesize;begin  v_sql :='select* from (select t1.*,rownum rn from (select * from '||tablename||'order by sal) t1 where rownum <= '||v_end||')where rn >= '||v_begin;  open my_cursor for v_sql;  v_sql :='selectcount(*) from '|| tablename;  execute immediate v_sql into myrows;  if mod(myrows,Pagesize)=0 then          myPageCount =myrows/Pagesize;  else          myPageCount =myrows/Pagesize+1;  endif;end;

Java调用

CallabelStatement cs = connection.prepareCall("{call fenye(?,?,?,?,?,?)}");//调用存储过程cs.setString(1,"SCOTT.EMP");//设置表名cs.setInt(2,5);//设置Pagesizecs.setInt(3,1);//设置Pagenow cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);//注册总记录数cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);// 注册总页数cs.registerOutParameter(6,oracle.jdbc.OracleTypes.INTEGER);// 注册返回结果集 cs.execute(); introwNum = cs.getInt(4);//intpageCount = cs.getInt(5);ResultSetrs = (ResultSet)cs.getObject(6);//结果集

异常处理

预定义异常no_data_found

declarev_name SCOTT.EMP.ENAME%type;begin select ename intov_name from SCOTT.EMP where empno = &no; dbms_output.put_line('名字:'||v_name); exception   when no_data_found then     dbms_output.put_line('编号没有');end;

预定义异常case_not_found

create or replace procedure pro(no number)is      v_sal SCOTT.EMP.SAL%type;begin select sal intov_sal from SCOTT.EMP where empno =no; case   when v_sal <1000then     update SCOTT.EMP set sal = sal +100 where empno =no;   when v_sal <2000then     update SCOTT.EMP set sal = sal +200 where empno =no;     endcase;   exception     when case_not_found then        dbms_output.put_line('case语句没有与'||v_sal||'相匹配的条件');end;

预定义异常cursor_already_open

declarecursor emp_cursor is select ename,sal from SCOTT.EMP;begin open emp_cursor; for emp_record in emp_cursor   loop   dbms_output.put_line(emp_record.ename);   end loop;   exception     when cursor_already_open then        dbms_output.put_line('游标已经被打开');end;

预定义异常dup_val_on_index

begin insert into SCOTT.DEPT values(10,'公安部','北京'); exception   when dup_val_on_index then     dbms_output.put_line('在deptno列上不能出现重复值');end;

预定义异常invalid_cursor

declarecursor emp_cursor is select ename,sal from SCOTT.EMP;emp_record emp_cursor%rowtype;begin --open emp_cursor;--打开游标 fetch emp_cursor into emp_record; dbms_output.put_line(emp_record.ename); close emp_cursor; exception   when invalid_cursor then     dbms_output.put_line('请检查游标是否已经打开');end;

预定义异常invalid_number

begin update SCOTT.EMP set sal = sal +'lll'; exception   when invalid_number then     dbms_output.put_line('无效数字');end;

预定义异常too_many_rows

declare      v_name SCOTT.EMP.ENAME%type;begin  select ename into v_name from SCOTT.EMP;  exception    when too_many_rows then      dbms_output.put_line('返回了多行');end;

预定义异常zero_divide

被除数为0时触发。

预定义异常value_error

declare     v_name varchar2(2);begin     select ename intov_name from SCOTT.EMP where empno = &no;     dbms_output.put_line(v_name);exception     when value_error then           dbms_output.put_line('变量尺寸不足');end;

预定义异常login_denied

用户非法登录时触发。

预定义异常not_logged_on

如果用户没有登录就执行dml就会触发。

预定义异常storage_error

如果超出了内存空间或是内存被破坏就触发。

预定义异常timeout_on_resorce

如果Oracle在等待资源时,出现了超时就触发。

自定义异常

create or replace procedure pro_exception_test(no number)ismy_exception exception;--自定义异常begin update SCOTT.EMP set sal = sal +100 where empno =no; if sql%not found then   raise my_exception; endif; exception when my_exception then   dbms_output.put_line('没有做任何更新'); end;

视图与表的区别

表需要占用磁盘空间,视图不需要

视图不能添加索引

使用视图可以简化复杂查询

视图有利于提高安全性

创建视图

create view my_view as select * fromSCOTT.EMP where sal <1000;


可以在最后带上 with read only

删除视图

drop view my_view



过程 视图 存储 游标 结果 内存 数据 用户 空间 页数 排序 查询 登录 笔记 学习 复杂 安全 上文 人民 公安 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 学习ios软件开发作用 php数据库身份证号码加密 网络安全中入侵者分类及特点 此服务器暂未开服怎么办 什么是收费服务器 服务器管理新建用户文件夹 腐蚀手机版怎么创建服务器 北京停车系统软件开发 上海长城服务器有限公司地址 一个数据库给多个系统用 私人诊所用什么软件开发票 网络安全与道德的距离 五中网络安全 属于网络技术的是 家用服务器配多显示器鼠标键盘 河南现代软件开发制造价格 网络服务器配置与安全维护 网络安全法关键信息第三方 管理云服务器通过什么端口 品牌取名软件开发 临夏小程序软件开发公司 广州大数据库安全 越南软件开发招聘靠谱吗 君临天下全球大战服务器版 供电公司网络安全要求 怎么看求生之路服务器 取数据库每条记录计算再汇总 ppt怎样找回未保存数据库 360校园网络安全攻防大赛 网络安全主题简笔画a3纸
0