Oracle今日复习,业务练习

-- todo 1 存储函数


-- 创建存储函数 fn_getAddressByID,根据 地址ID 查询 地址名称
-- fn_getAddressByID(12) ==> 顺义
-- todo 1.1 获取地址名称的sql
select name from T_ADDRESS where ID=1;
-- todo 1.2 创建具有参数的存储函数 并且返回值类型为字符串类型(注意!!这里只写类型不写大小)
--  fn_getAddressByID(addr_id number) return varchar2
create or replace function fn_getAddressByID(addr_id number)
return varchar2
is
    v_name varchar2(100);
begin
    -- 根据参数 获取名字
    select name into v_name from T_ADDRESS where ID=addr_id;
    -- 必须有返回值
    return v_name;
end;


-- todo 1.3 获取业主id 业主姓名 业主地址名称
-- 使用存储函数
select fn_getAddressByID( 12) from dual;

-- todo 1.4 练习
-- todo 要求:
-- 创建函数 fn_num_ou()
-- 具有参数 num ==> 整数类型
-- 返回值 ret ==> 字符串类型
-- 功能: 如果参数num为偶数 返回值ret结果为 是
--      如果参数num为偶数 返回值ret结果为 不是


create or replace function fn_num_ou(num number)
return varchar2
is
    ret varchar2(30);
begin
    if mod(num,2) = 0 then
        ret := '是';
        return ret;
    else
        ret := '不是';
        return ret;
    end if;
end;

select fn_num_ou(11) from dual;

-- todo 2 存储过程(传入参数)
-- todo 需求: 使用存储过程 完成 对t_owners表的数据插入


-- todo 2.1 准备工作(t_owners有主键)  创建序列 seq_owners 起始值100 生成主键值
create sequence seq_owners start with 100;
-- todo 2.2 创建传入参数的存储过程 pro_owners_add 添加业主信息 create procedure
--  注意!!!:参数只能写类型不能写大小
create or replace procedure pro_owners_add(
    v_NAME varchar2,
    v_ADDRESSID number,
    v_HOUSENUMBER varchar2,
    v_WATERMETER varchar2,
    v_OWNERTYPEID number
)
is
begin
-- todo 2.3 向t_owners插入数据
    insert into C##WATERUSER.T_OWNERS
    values (seq_owners.nextval, v_NAME, v_ADDRESSID, v_HOUSENUMBER, v_WATERMETER, sysdate, v_OWNERTYPEID);
-- todo 2.4 提交数据
    commit;
end;
-- todo 2.5 调用存储过程 添加业主信息 call 存储过程(... ...);
call pro_owners_add('蜘蛛精',1,'66','66',1);

-- todo 2.6 练习
-- 创建删除指定id的pro_owners_del存储过程
-- 要求 t_owners表 传入参数
create or replace procedure pro_owners_del(v_id in number)
is
begin
    delete from T_OWNERS where ID=v_id;
    commit;
end;

call pro_owners_del(100);

-- todo 3 存储过程(传出参数)
-- todo 需求:创建带传出参数pro_owners_add_2存储过程:添加业主信息
--  要求: 传出参数 v_id number类型 out 传出参数, 当添加完一条数据后


--  注意!!!: 参数只写类型不写大小
create or replace procedure pro_owners_add_2(
    v_NAME varchar2,
    v_ADDRESSID number,
    v_HOUSENUMBER varchar2,
    v_WATERMETER varchar2,
    v_OWNERTYPEID number,
    v_id out number
)
is
    -- 声明变量
begin
-- todo 3.1 调用序列下一个值 赋值给 v_id
    select seq_owners.nextval into v_id from dual;
-- todo 3.2 插入 insert into
    insert into C##WATERUSER.T_OWNERS
    values (v_id, v_NAME, v_ADDRESSID, v_HOUSENUMBER, v_WATERMETER, sysdate, v_OWNERTYPEID);
-- todo 3.3 提交
    commit;
end;
-- todo 3.4 使用
-- 注意: 这里通过plsql使用 begin end的形式
declare
    v_my_id number;
begin
    pro_owners_add_2('盘丝洞',1,'77','77',1,v_my_id);
    DBMS_OUTPUT.PUT_LINE('插入数据的id为:'||v_my_id);
end;

-- todo 3.5 练习
-- 创建删除指定id的pro_owners_del_2存储过程
-- 要求
-- 1. t_owners表 传入参数v_id in, 传出参数v_name out 字符窜类型
-- 2. 调用pro_owners_del_2时 获取 删除的数据名称name 并显示出来
create or replace procedure pro_owners_del_2(v_id in number,v_name out varchar2)
is
begin
    -- 获取v_name 删除的人的名字
    select name into v_name from T_OWNERS where id=v_id;
    -- 删除数据
    delete from T_OWNERS where ID=v_id;
    commit ;
end;

-- 调用
declare
    v_my_name varchar2(30);
begin
    pro_owners_del_2(101,v_my_name);
    DBMS_OUTPUT.PUT_LINE('删除的人的名字为:'||v_my_name);
end;

-- todo 案例练习
-- todo 需求1: 通过plsql完成阶梯计费
-- 要求: 计算业主类型为1 用水量为12吨 的用户需要付多少水费(T_PRICETABLE)
declare
-- 1. 声明变量 v_owner_type 并赋值为 1
--            v_usernum2 并赋值为 12
--            v_money 并赋值为0
    v_owner_type number := 1;
    v_usernum2 number := 12;
    v_money number(5,2) := 0;
-- 2. 创建具有参数v_type的游标 cur_pricetable 用来获取t_pricetable中所有数据
    cursor cur_pricetable(v_type number) is
    select * from T_PRICETABLE where OWNERTYPEID=v_type
    order by MINNUM;
begin
-- 3. <for loop end loop>方式 使用游标 cur_pricetable
    for i in cur_pricetable(v_owner_type)
    loop
           if v_usernum2 <= i.MAXNUM or i.MAXNUM is null then
               -- 证明就可以退出循环了
                v_money := v_money + (v_usernum2-i.MINNUM) * i.PRICE;
                exit;
           else
               -- 不满足条件
                v_money := v_money + (i.MAXNUM-i.MINNUM) * i.PRICE;
           end if;
    end loop;
-- 4. 输出金额
    DBMS_OUTPUT.PUT_LINE('金额:'||v_money);
end;

-- todo 需求2: 根据需求1创建存储函数 fn_calmoney(v_owner_type业主类型,v_usernum2用水量)
-- todo 注意: !!!返回值,参数只有类型<没有大小>!!!
create or replace function fn_calmoney(v_owner_type number,v_usernum2 number)
return number
is
-- 1. 声明变量 v_money 并赋值为0
    v_money number(5,2) := 0;
-- 2. 创建具有参数v_type的游标 cur_pricetable 用来获取t_pricetable中所有数据
    cursor cur_pricetable(v_type number) is
    select * from T_PRICETABLE where OWNERTYPEID=v_type
    order by MINNUM;
begin
-- 3. <for loop end loop>方式 使用游标 cur_pricetable
    for i in cur_pricetable(v_owner_type)
    loop
           if v_usernum2 <= i.MAXNUM or i.MAXNUM is null then
               -- 证明就可以退出循环了
                v_money := v_money + (v_usernum2-i.MINNUM) * i.PRICE;
                exit;
           else
               -- 不满足条件
                v_money := v_money + (i.MAXNUM-i.MINNUM) * i.PRICE;
           end if;
    end loop;
-- 4. 返回值
    return v_money;
end;

select fn_calmoney(1,20) from dual;

-- todo 需求3: 用存储过程pro_owner_account完成需求 ==> 在新增用户的同时新增账目记录
-- 问题:
-- 1. 两个表的id需要序列
drop sequence seq_owners;
drop sequence seq_account;
create sequence seq_owners start with 1000;
create sequence seq_account start with 1000;
-- 2. 向t_owners表插入数据的时候 插入的时间为 时间类型 ==> t_account需要year month
select to_char(sysdate,'yyyy') from dual;
select to_char(sysdate,'mm') from dual;
-- 3. 向t_owners表插入数据的时候 插入的是addressid(地址id) ==> t_account需要areaid(地区id)
select distinct AREAID from T_ADDRESS inner join T_OWNERS
on T_OWNERS.ADDRESSID = T_ADDRESS.ID where ADDRESSID=3;

-- todo 1 创建序列
-- todo 2 创建存储过程pro_owner_account
create or replace procedure pro_owner_account(
    -- 用来给t_owners表添加数据的
    v_NAME varchar2,
    v_ADDRESSID number,
    v_HOUSENUMBER varchar2,
    v_WATERMETER varchar2,
    v_OWNERTYPEID number
)
is
-- todo 3 声明变量 v_year v_month v_area_id v_owner_id
    -- 这些声明的变量用来给 t_acconut表插入数据
    v_year char(4);
    v_month char(2);
    v_area_id number;
    v_owner_id number;
begin
-- todo 4 给变量v_year v_month赋值
    select to_char(sysdate,'yyyy') into v_year from dual;
    select to_char(sysdate,'mm') into v_month from dual;
-- todo 5 给变量v_area_id赋值
    select distinct AREAID into v_area_id from T_ADDRESS inner join T_OWNERS
    on T_OWNERS.ADDRESSID = T_ADDRESS.ID where ADDRESSID=v_ADDRESSID;
-- todo 6 通过序列保存t_owners的id值
    select seq_owners.nextval into v_owner_id from dual;
-- todo 7 向t_owners表中插入数据
    insert into T_OWNERS
    values(
        v_owner_id,
           v_NAME,
           v_ADDRESSID,
           v_HOUSENUMBER,
           v_WATERMETER,
           sysdate,
           v_OWNERTYPEID
    );
-- todo 8 向t_account表中插入数据
    insert into C##WATERUSER.T_ACCOUNT(ID, OWNERUUID, OWNERTYPE, AREAID, YEAR, MONTH, NUM0, NUM1, USENUM)
    values (seq_account.nextval,v_owner_id,v_OWNERTYPEID,v_area_id,v_year,v_month,0,0,0);
-- todo 9 提交
    commit ;
end;
-- todo 10 调用
call pro_owner_account('火焰山',1,'666','666',2);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/571321.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H264编码标准中游程编码应用介绍

H264编码标准 H.264编码标准&#xff0c;也被称作MPEG-4 AVC&#xff08;Advanced Video Coding&#xff09;&#xff0c;是一种被广泛使用的数字视频压缩标准。它由国际电信联盟&#xff08;ITU-T&#xff09;和国际标准化组织&#xff08;ISO&#xff09;共同开发&#xff0…

C++核心编程——4.5 运算符重载

4.5.0 运算符重载概念 对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 4.5.1 加号运算符重载 作用&#xff1a;实现两个自定义数据类型相加的运算 class Person { public:Person() {};Person(int a, int b){this->m_A a;this…

Bayes判别:统计学中的经典分类方法

在统计和机器学习领域&#xff0c;Bayes判别是一个基于概率理论的强大工具&#xff0c;用于解决分类问题。它基于Bayes定理&#xff0c;通过计算和比较后验概率来进行决策。这种方法在处理不确定性和不完整数据时表现尤为出色&#xff0c;因此在医学诊断、邮件过滤、语音识别等…

《十》Qt各种对话框之QFontDialog

QFontDialog 在介绍 QFontDialog 对话框之前&#xff0c;我们先简单介绍一下 QFont 字体类。QFont 主要用于控制文本显示的字体&#xff0c;字体主要有四大属性&#xff1a;①字体家族 family 决定字体外观家族&#xff0c;比如宋体、楷体等&#xff1b; ②字号 pointSize &am…

css文字和span在一行对不齐

1.需求背景 父盒子中有两个span&#xff0c;但是span中的文字对不齐。如下图&#xff0c;明显右边的文字偏高 处理后的效果&#xff08;已经对齐&#xff0c;图中标记的是基本的div结构&#xff09;&#xff1a; 2.该问题出现的原因&#xff1a; span1设置的高度比span2内…

thsi指针用法总结

1 c类对象中的变量和函数是分开存储的 2 所以对象共用一份成员函数&#xff0c;类的大小是指非静态的成员变量&#xff1b; this 完成链式操作 const 修饰成员函数

【Java 解析全国详细地址】Java 利用正则表达式完美解析全国省市区地址

这里写自定义目录标题 Java使用正则解析省市区/县 具体地址问题场景上demo运行结果 Java使用正则解析省市区/县 具体地址 问题场景 OCR识别营业执照 获取详细地址并拆分 上demo import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import j…

使用API有效率地管理Dynadot域名,自查账户信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明

日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明

2024春季春日主题活动策划方案

2024解冻派对“春日浪漫”主题活动策划方案-32P 方案页码&#xff1a;32页 文件格式&#xff1a;pptx 方案简介&#xff1a; 春来一季&#xff0c;新生欢喜 花香丨微风丨阳光 活动唤起【春日浪漫记忆】&#xff01; 年轻人不一样的派对活动 可以与朋友/小朋友/家人互动…

MT3030 天梯赛

跟MT3029战神小码哥类似&#xff0c;都是贪心堆。注意开long long 这里的堆顶为战斗力最小的&#xff0c;便于贪心的反悔操作。先按容忍度从大到小排序&#xff08;q中总容忍度取决于最小的容忍度&#xff09;&#xff0c;再向q中存数&#xff0c;存到不能容忍之后再把堆顶踢出…

最简单也最复杂的德语动词,柯桥德语培训

德语人一定遇到过这个难题&#xff1a;ie组合到底发什么音&#xff1f; 说起haben&#xff0c;大家可能第一感觉是“这么简单的动词也要讲&#xff1f;不就是‘拥有’的意思吗&#xff1f;” 没错&#xff0c;haben的基本含义是“拥有&#xff0c;包含”&#xff0c;但是在某些…

Vue3后台管理系统推荐

目录 项目概述 &#x1f35f; 项目展示 功能特点 &#x1f957; 结语 &#x1f4a8; 项目概述 &#x1f35f; 基于Vue 3框架与Element-Plus UI组件库技术精心构建的后端管理模板。该模板系统已成功实现一个基础的权限管理模块&#xff0c;宗旨在于为追求高效二次开发的开发…

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

【Linux网络】DHCP原理与配置

目录 一、DHCP工作原理 1.了解DHCP服务 2.使用DHCP的好处 3.DHCP的分配方式 二、DHCP的租约过程 三、DHCP场景应用实验 一、DHCP工作原理 1.了解DHCP服务 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 由Internet工作…

<计算机网络自顶向下> 无连接传输UDP

UDP&#xff1a;User Datagram Protocol “尽力而为”的服务 报文可能丢掉或者乱序好处&#xff1a; 效率高&#xff08;不建立连接无拥塞控制和流量控制【应用->传输的速率主机->网络的速率】&#xff09;报文段的头部很小&#xff08;开销小&#xff09;UDP被用于 流媒…

数据结构系列-堆排序当中的T-TOK问题

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 之前我们讲到了堆排序的实现逻辑&#xff0c;那么接下来我们重点关注的就是其中的T-TOK问题 T-TOK说简单点&#xff0c;就是说&#xff0c;假如有10000个数据&#xff08;随机的…

bottle,Python轻量级的Web框架!

目录 前言 安装 特性 基本功能 1. 路由功能 2. 请求参数获取 3. 静态文件服务 4. 模板渲染 高级功能 1. 中间件 2. 插件 3. 异步处理 实际应用场景 1. 小型Web应用 2. RESTful API服务 3. Web界面与后端逻辑分离 4. Web服务的快速原型开发 总结 前言 大家好&#xff0c…

YOLOv9改进策略 | 添加注意力篇 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)

一、本文介绍 本文给大家带来的改进是Triplet Attention三重注意力机制。这个机制&#xff0c;它通过三个不同的视角来分析输入的数据&#xff0c;就好比三个人从不同的角度来观察同一幅画&#xff0c;然后共同决定哪些部分最值得注意。三重注意力机制的主要思想是在网络中引入…

解密数字经济时代,元宇宙企业如何重塑商业价值?

从复盘中感知自我&#xff0c;坚持和过去对话&#xff0c;并引入未来的思考&#xff0c;飞天云动是一个典型的案例。 在科技的飞速发展和数字化浪潮的推动下&#xff0c;元宇宙这一概念如同一颗冉冉升起的新星&#xff0c;吸引了全球的目光。就目前而言&#xff0c;围绕元宇宙…