Oracle编程

Oracle编程

​ 任意语言的三个基本结构:顺序结构、分支结构、循环结构。任意语言都拥有变量和常量。

PL/SQL

PL/SQL的基本概念

​ PL/SQL(Procedure Language/SQL),是Oracle对Sql语言的过程化拓展,是一门语言,可以让SQL具备逻辑,具有过程处理能力。

基本语法结构
[declare --声明变量]
begin
[plsql代码]
[exception --异常处理]
end;
--常见的简单模式
begin
    plsql
end
基本元素

变量

注意事项:

  • 变量名 变量类型
  • 赋值符号 :=
  • declare后边声明变量,而变量的赋值在begin和end之间
  • 内置存储函数(过程):DBMS_OUTPUT.PUTLINE()

案例

--变量声明与赋值
declare --声明
    v_price number(10,2);
    v_usenum number;
    v_usenum2 number(10,2);
    v_money(10,2);
begin
    v_price:=2.45;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
    
    DBMS_OUTPUT.put_line('金额:'||v_money);--内置存储函数,可以输出
end;
--第二种赋值方法

declare --声明
    v_price number(10,2);
    v_usenum number;
    v_usenum2 number(10,2);
    v_money(10,2);
    v_num0 number;
    v_num1 number;
begin
    v_price:=2.45;
    --语句:select 【数据库中的列名】 into 变量名称 
    select usenum into v_usenum from t_account where year='2012' and monyh='01' and owneruuid=1;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
end
    

引用类型

语法格式:表名.列名%type

declare --声明
    v_price number(10,2);
    --可以直接查找到表中的值的类型
    v_usenum t_account.usenum%type;
    v_usenum2 number(10,2);
    v_money(10,2);
    v_num0 number;
    v_num1 number;
begin
    v_price:=2.45;
    select usenum into v_usenum from t_account where year='2012' and monyh='01' and owneruuid=1;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
end

记录类型

语法格式:变量名称 表名%rowtype

使用时语句:变量名称 . 列名

declare --声明
    v_price number(10,2);
    --可以直接查找到表中的值的类型
    v_usenum t_account.usenum%type;
    v_usenum2 number(10,2);
    v_money(10,2);
    v_num0 number;
    v_num1 number;
begin
    v_price:=2.45;
    select usenum into v_usenum from t_account where year='2012' and monyh='01' and owneruuid=1;
    v_usenum:=9213;
    v_usenum2:=round(v_usenum/1000,2);
    v_money:=v_price*v_usenum2;
end

异常

在运行程序时出现的错误叫做异常(也叫例外)

  • 预定义异常
  • 自定义异常

预定义异常共有21个

--语法格式
exception
    when 异常类型 then
    异常处理逻辑

案例

declare
    v_price number(10,2);-- 水费单价
    v_usenum T_ACCOUNT.USENUM%type; -- 水费字数
    v_usenum2 number(10,3);-- 吨数
    v_money number(10,2);-- 金额
begin
    v_price:=2.45;-- 水费单价
    select usenum into v_usenum from T_ACCOUNT where
    owneruuid=1 and year='2012' and month='01';
    -- 字数换算为吨数
    v_usenum2:= round( v_usenum/1000,3);
    -- 计算金额
    v_money:=round(v_price*v_usenum2,2);
    dbms_output.put_line('单价:'||v_price||'吨
    数:'||v_usenum2||'金额:'||v_money);
exception
    --只要查到这个异常就会处理
    when NO_DATA_FOUND then
    dbms_output.put_line('未找到数据,请核实');
    when TOO_MANY_ROWS then
    dbms_output.put_line('查询条件有误,返回多条信息,请核实');
end;

记忆两个

NO_DATA_FOUND:没有找到数据

TOO_MANY_ROWS:结果集超过一行

分支结构

条件判断

--sql中的条件判断语句
if 条件 then
end if;

if 条件 then
else
end if;

if 条件 then
elsif 条件 then
。。。
else
end if;

案例:

declare
    v_price1 number();
    v_price2 number();
    v_price3 number();
    v_usenum2 number();
    v_money number();
    v_account t_account%rowtype;
--阶梯水费计算
begin
    if v_usenum2<=5 then
        v_money:=v_price1*v_usenum2;
    elsif v_usenum2>5 and v_usenum2<=10 then
        v_money:=v_price1*5+ v_price2*(v_usenum2-5)
    else
        v_money:=v_price1*5+ v_price2*(v_usenum2-5)+v_price3*(v_usenum2-10)

循环

循环关键字:loop 循环语句 end loop;

--loop无条件循环
loop
    循环语句
end loop;

--案例
declare
    v_num number;
begin
    v_num:=1;
    loop
        dbms_output.put_line(v_num);
        v_num:=v_num+1;
        --这是一个死循环,加条件推出
        if v_num>100 then
            exit;
        (或者:exit when v_num>100;)
    end loop;
end;
--loop有条件循环
while 满足循环的条件
loop
    循环语句
end loop;

--案例
declare
    v_num number;
begin
    v_num:=1;
    while v_num<=100
    loop
        dbms_output.put_line(v_num);
        v_num:=v_num+1;
    end loop;
end;
--for循环
for 局部变量 in 条件
loop
    循环语句
end loop;

--案例
declare
    v_num number;
begin
    for v_num in 1..100
    loop
        dbms_output.put_line(v_num);
    end loop;
end;

游标

​ 游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。

游标的作用

​ 速度快!2017年开发人员基本不用游标了,但是在今后的学习中还要涉及到。

申明游标语法

cursor 游标名称 is SQL语句

使用游标语法

open 游标名称
loop
    fetch 游标名称 into 变量
    --返回一个布尔值
    exit when 游标名称%notfound
end loop;
close 游标名称

案例

--打印业主类型为1的价格表
--查表语句
select * from t_pricetable where ownertypeid=1

--游标
declare
    cursor cur_pricetable is select * from t_pricetable where ownertypeid=1;--声明游标
    v_pricetable t_pricetable%rowtype;
begin
    open cur_pricetable;
        loop 
            fetch cur_pricetable into v_pricetable;
            exit when cur_pricetable%notfound;
            dbms_output.put_line('价格:'||v_pricetable.price||'吨位:'||v_pricetable.minnum||'到'||v_pricetable.maxnum);
        end loop;
    close cur_pricetable;

附:步骤

  1. PLSQL结构
  2. 声明游标
  3. 打开--关闭游标
  4. 循环取记录

带参数的游标

​ 声明的时候指定参数的类型和名称,打开游标的时候需要传入指定类型的参数即可。

案例:

declare
    v_pricetable T_PRICETABLE%rowtype;-- 价格行对象
    cursor cur_pricetable(v_ownertypeid number) is select *from T_PRICETABLE where ownertypeid=v_ownertypeid;-- 定义游
标
begin
    open cur_pricetable(2);-- 打开游标
    loop
        fetch cur_pricetable into v_pricetable;-- 提取游标到变量
        exit when cur_pricetable%notfound;-- 当游标到最后一行下面退出循环
        dbms_output.put_line('价格:'||v_pricetable.price ||'吨位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
    end loop;
    close cur_pricetable;-- 关闭游标
end ;

For循环游标[掌握使用]

declare

begin
    for v_pricetable in cur_pricetable(3)
end

存储函数/存储过程

存储函数

​ Oracle中提供的使用PLSQL语言自定义的一些函数称之为存储函数

语法格式

CREATE [or replace] function 函数名称
(参数名称 参数类型,参数名称 参数类型,...)
    return 结果变量数据类型
is
    变量声明部分
begin
    逻辑部分
    return 结果变量
[Exception]
end;

案例

--通过ID查找小区
create or replace function fn_getaddress
(v_id number)
return varchar2;
is
    v_name varchar2(30);
begin
    --查询地址表
    select name into v_name from t_address where id=v_id;
    return v_name;
end;

实际使用语句

select id,name,fn_getaddress(addressid) from t_owners

存储过程

概念

​ 存储过程和存储函数差不多,和存储函数相比,它没有返回值,可以通过传出参数返回多个值;存储过程不能在select语句中直接使用,它多数是被应用程序调用。

存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:

  1. 存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
  2. 存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
  3. 存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。

语法格式

create [or replace] procedure procedure名称 (参数名 参数类型,...)
is[as]--都可以用
    变量声明
begin
    具体逻辑
[Exception]
end;

参数只指定类型,不指定长度
过程参数的三种模式:
​ IN 传入参数(默认)
​ OUT 传出参数 ,主要用于返回程序运行结果
​ IN OUT 传入传出参数

案例

--创建不带传出参数的存储过程:添加业主信息
--增加业主信息
create or replace procedure pro_owners_add()

使用

--调用不带参数的存储过程
--一
call 存储过程名(实际参数。。。);
--二
begin
    存储过程的名称(实参)
end;

用JDBC调用


--带传出参数的存储过程
create or replace procedure pro_owners_add()

触发器

已经淘汰,现在都用消息队列

​ 对特定表(增删改---生产者消费者思想---中介思想)

概念: 数据库触发器就是一段sql程序

触发器可用于

  • 数据确认
  • 实施复杂的安全性检查
  • 做审计,跟踪表上所做的数据操作等
  • 数据的备份和同步

触发器的分类

  • 前置触发器(BEFORE)
  • 后置触发器(AFTER)

面向切面的AOP思想

创建触发器的语法

create [or replace] trigger 触发器名
    before|after
    [delete][[or] insert][[or]update[of 列名,...]]
    on 表名
    [for each row][when(条件)]
declare
    ...
begin
    PLSQL 块
end;
--for each row的作用是标准此触发器是行级触发器,不写的话是语句级触发器
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 1.1 基本结构 PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。 1.2 命名规则 1.3 记...
    慢清尘阅读 3,733评论 3 14
  • 第八章 数据查询和选择 ||| 第十章 获取GIS数据列表和描述信息 我们将在本章中介绍以下几个案例: 游标对象(...
    muyan阅读 20,521评论 5 21
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • 数据库编程 嵌入式 SQL 嵌入式 SQL 的处理过程将 SQL 语句嵌入到程序设计语言中 , 如 C,C++,J...
    iOS_愛OS阅读 940评论 0 0
  • 跟同事去吃晚餐的路上,一路聊着,她说最近想搬家,原本三个人住的,现在她跟另外一个想搬出来,第三个又不想搬,如此一番...
    海水微凉浅喜深爱阅读 302评论 0 0