我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Oracle学习笔记(续)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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)is
begin
 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)is
begin
 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 as
type 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 for
select * 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 as
type 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--返回的记录集
)is
v_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);//设置Pagesize
cs.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

declare
v_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

declare
cursor 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

declare
cursor 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)
is
my_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



免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Oracle学习笔记(续)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GNS3学习笔记

最近在自学CCNA,为了搭建路由模拟器先后下载了Boson Network 、DynamipsGUI用的不是很顺手,后来听朋友推荐GNS3很好用,他们报的CCNP培训班老师用的就是GNS,平时的模拟实验都是用这个完成的,由于我本机已有下好的
2023-01-31

20200616学习笔记

count(*) 的实现方式 在不同的 MySQL 引擎中,count(*) 有不同的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高 而 InnoDB 引擎就麻烦了,它执行 coun
20200616学习笔记
2018-10-19

Kafka 学习笔记

😀😀😀创作不易,各位看官点赞收藏. 文章目录 Kafka 学习笔记1、消息队列 MQ2、Kafka 下载安装2.1、Zookeeper 方式启动2.2、KRaft 协议启动2.3
2023-08-30

20200619 学习笔记

主键和唯一的区别 主键:唯一、不为空、只能有一个、可以组合但不推荐 唯一:唯一、可为空、可以多个、可以组合但不推荐 外键 要求在从表设置外键关系 从表的外键列的类型和主表的关联列的类型要求一致或兼容 主表的关联列必须时一个key 插入数据时,
20200619 学习笔记
2019-12-15

Mycat 学习笔记

概述1. Mycat 是什么?Mycat 是数据库中间件,连接 Java 应用程序和数据库,它的作用如下:读写分离数据分片:垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)多数据源整合2. Mycat 原理Mycat 拦截了用户发送过来的 SQL
Mycat 学习笔记
2019-10-05

sqlite3 学习笔记

#!/usr/bin/env python3# -*- coding: utf-8 -*-# @descrip : operate SqLite intrface# @Time : 2020/04/22 21:57# @Author : mingfei
sqlite3 学习笔记
2017-12-28

学习笔记3

一文件查找和压缩1文件查找locate 搜索依赖于数据库,非实时搜索,搜索新建文件需手动更新,适于搜索稳定不频繁修改文件 find 实时搜索,精确搜索,默认当前目录递归搜索 find用法 -maxdepth l
2023-01-31

H3CNE学习笔记

H3CNE五日“游”——之第一天废话少说 直接进入真题!!!!(哈哈 )H3CNE   H3C认证初级网络工程师第    一   节路由器、交换机及其操作系统介绍路由器1、 路由器的作用连接具有不同介质的链路连接网络或子网,隔离广播交换和维
2023-01-31

postgres学习笔记

将一个标识符变得受限同时也使它变成大小写敏感的,反之非受限名称总是被转换成小写形 式。例如,标识符FOO、foo和"foo"在PostgreSQL中被认为是相同的,而"Foo"和"FOO"则互 不相同且也不同于前面三个标识符(PostgreSQL将非受限名字转
postgres学习笔记
2018-01-09

Python学习笔记

Python介绍Python是一种解释型、面向对象的语言。官网:www.python.orgPython环境解释器:www.python.org/downloads运行方式:交互模式。在IDLE中运行。脚本模式。文件的后缀名为.py。
2023-01-30

学习笔记(3)

1.* 匹配零个或多个字符(通配符中)2.ls 的-d选项不仅仅可以显示指定目录的信息,还可以用来表示不递归子文件夹。  # ls -dl /etc 显示/etc目录的信息  # ls -d /etc/* 显示/etc下面的文件和文件夹,并
2023-01-31

20200618_MySQL学习笔记

加号 + Mysql中加号只能做运算符 select 100+90  ==> 190  select "100"+90 ==> 190  如果有一个是字符串,那么尝试转换成数值型,转换成功 select "jack" + 90 ==> 90 转换失败则
20200618_MySQL学习笔记
2014-11-26

MySQL学习笔记

作者: Grey原文地址:MySQL学习笔记说明注:本文中的SQL语句如果用到了特定方言,都是基于MySQL数据库。关于DDLDDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了数据库的结构和数据表的结构。在 D
MySQL学习笔记
2015-01-17

20200617学习笔记

基数  一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好 我们可以使用 show index 方法,看到一个索引的基数 MySQL 是怎样得到索引的基数的呢? 采样统计 : 因为把整张表取出来一行
20200617学习笔记
2022-02-22

编程热搜

目录