--1、
--利用问题1中创建的表salayr_details表,创建work_days()函数,
--接受EMPCODE雇员编号,并检查所有雇员的工作天数。
--标准工作天数22天,雇员每少工作一天从其工资中扣除50元。
--函数返回雇员最后的工资,工作天数多于标准天数不加工资,
--工资扣完为止,不可以为负值。
CREATE OR REPLACE FUNCTION work_days(ecode NUMBER)
   RETURN NUMBER
   AS
   days NUMBER;
   sal  NUMBER;
BEGIN
   SELECT workdays,salary INTO days,sal FROM salary_detail
          WHERE empcode=ecode;
   days := 22-days;       --少工作的天数
   IF days>=1 THEN
      sal := sal-50*days; --实际薪水
      IF sal<0 THEN
         sal := 0;
      END IF;
   END IF;
   RETURN sal;   
END;

SELECT * FROM salary_detail;
SELECT work_days(1004) FROM dual;

--2、
--创建包含一个过程和一个函数的toyspack包,
--将过程和函数分别命名为updateToyPrice和avgToyPrice。
--过程应当将每个玩具的单价增加10%,直到玩具的
--平均价格达到400。此外,过程还应保证任一玩具的价格
--不超过500。
1.直接使用条件
2.使用更新游标

--使用更新游标
CREATE OR REPLACE PACKAGE pkg_toys
AS
    CURSOR c_toy RETURN my_toys%ROWTYPE;
    PROCEDURE updateToyPrice;
    FUNCTION avgToyPrice RETURN NUMBER;
END pkg_toys;

CREATE OR REPLACE PACKAGE BODY pkg_toys
AS
    --更新游标
    CURSOR c_toy RETURN my_toys%ROWTYPE
           IS SELECT * FROM my_toys FOR UPDATE;
    --求平均价格函数     
    FUNCTION avgToyPrice RETURN NUMBER
      AS
      v_avg NUMBER;
    BEGIN
        SELECT AVG(price) INTO v_avg FROM my_toys;
        RETURN v_avg;
    END avgToyPrice;
    --价格增加10%过程
    PROCEDURE updateToyPrice
      AS
      v_avg NUMBER;
    BEGIN
        v_avg := avgToyPrice;
        WHILE v_avg<400 LOOP
            FOR v_toy IN c_toy LOOP
                IF v_toy.price*1.1<=500 THEN
                    UPDATE my_toys SET price=price*1.1 WHERE CURRENT OF c_toy;
                END IF;          
            END LOOP;
            v_avg := avgToyPrice;
        END LOOP;
    END updateToyPrice;
END pkg_toys;

SELECT * FROM my_toys;
select AVG(price) FROM my_toys;

CALL pkg_toys.updateToyPrice();

--直接使用条件
CREATE OR REPLACE PACKAGE pkg_toys
AS  
    PROCEDURE updateToyPrice;
    FUNCTION avgToyPrice RETURN NUMBER;
END pkg_toys;

CREATE OR REPLACE PACKAGE BODY pkg_toys
AS   
    --求平均价格函数     
    FUNCTION avgToyPrice RETURN NUMBER
      AS
      v_avg NUMBER;
    BEGIN
        SELECT AVG(price) INTO v_avg FROM my_toys;
        RETURN v_avg;
    END avgToyPrice;
    --价格增加10%过程
    PROCEDURE updateToyPrice
      AS
      v_avg NUMBER;
    BEGIN
        v_avg := avgToyPrice;
        WHILE v_avg<400 LOOP          
            UPDATE my_toys SET price=price*1.1 WHERE price*1.1<=500;                    
            v_avg := avgToyPrice;
        END LOOP;
    END updateToyPrice;
END pkg_toys;

--3、
Create table billInfo
(
    billID varchar2(14),    --账单编号,格式为‘ZD201711130002’
    billDate date            --开单时间
);
--要求编写过程实现开单功能,即生成账单编号并插入记录。
--编号格式:ZD+年月日+自增四位数
SELECT * FROM billinfo;
SELECT to_char(SYSDATE,'yyyymmdd') from dual;
INSERT INTO billinfo VALUES('ZD201711130001',SYSDATE);

CREATE OR REPLACE PROCEDURE proc_bill(bid OUT VARCHAR2)
AS
   i NUMBER;
   v_max VARCHAR2(14);
BEGIN
   bid := 'ZD'||to_char(SYSDATE,'yyyymmdd');
   SELECT COUNT(1) INTO i FROM billinfo
          WHERE billid LIKE bid||'%';
   IF i>0 THEN
       SELECT MAX(billid) INTO v_max FROM billinfo;
       bid:=bid||SUBSTR((SUBSTR(v_max,11)+10001),2);
   ELSE
       bid:=bid||'0001';
   END IF;
END;

DECLARE
   bid VARCHAR2(14);
BEGIN
   proc_bill(bid);
   dbms_output.put_line(bid);
END;

Oracle的子查询和程序包上机1相关推荐

  1. oracle标量子查询 外层,Oracle标量子查询

    Oracle标量子查询 ORACLE允许在select子句中包含单行子查询, 使用标量子查询可以有效的改善性能,当使用到外部连接,或者使用到了聚合函数,就可以考虑标量子查询的可能性. 下面来看几个例子 ...

  2. Oracle 原理: 初步认识程序包

    oracle 中的程序包和C中的类库,JAVA中的package包类似.是过程.函数.变量.游标.异常的集合.程序包由规范和主体两部分组成.规范主要用于声明.声明公有对象(类型.常量.变量.异常.游标 ...

  3. oracle单行子查询返回多个行 order by,单行子查询返回多个行

    子查询: 用子查询能解决的问题 假想你想要写一个查询来找出挣钱比陆涛的薪水还多的人.为了解决这个问题,你需要两个查询:一 个找出陆涛的收入,第二个查询找出收入高于陆涛的人. 你可以用组合两个查询的方法 ...

  4. oracle v sql不存在,程序包oracle.sql不存在

    今天项目在maven install 的时候报"程序包oracle.sql不存在,类TIMESTAMP找不到"的问题: plugins:maven-compiler-plugin: ...

  5. oracle做子查询注意事项,Oracle子查询详解

    Oracle子查询详解,根据查询的结果(内部嵌套查询的结果)把子查询的类型分为单行子查询与多行子查询, 子查询概念 :当一个查询的结果是另一个查询的条件时,,称之为子查询. 使用子查询注意事项: 子查 ...

  6. Oracle的子查询【单行子查询和多行子查询】

    1.查询部分分为主查询和子查询: 2.根据返回值的记录多少分为单行子查询和多行子查询:单行子查询用单行比较符=连接:多行子查询用多行比较符in连接: 3.子查询的内容可以放在FROM后面,也可以放在W ...

  7. Oracle:子查询——rownum

    1.rownum是oracle专用的关键字. 2.rownum与表在一起,表亡它亡,表在它在. 3.rownum默认情况下,从表中是查不出来的. 4.只有在select语句中,明确写出rownum才能 ...

  8. oracle 语句 子查询,Oracle子查询

    在本教程中,您将了解有助于构建更多可读查询的Oracle子查询,并可在不使用复杂联接或联合的情况下编写查询. Oracle子查询简介 子查询是嵌套在另一个语句(如SELECT,INSERT,UPDAT ...

  9. Oracle 7~ 子查询、同义词

    Oracle子查询就是嵌套查询,把select查询的结果作为另一个select.update或delete语句的条件 它的本质就是where条件查询中的一个表达式. 1. 单行子查询:向外部返回的结果 ...

最新文章

  1. JavaScript 之 call和apply,bind 的模拟实现
  2. 如何看待消息中间件的选型
  3. Typecho给文章设置永久链接
  4. 首发:吴恩达的 CS229的数学基础(线性代数),有人把它做成了在线翻译版本!...
  5. 用计算机弹没那种命,成熟小女人QQ个性网名 没那种命就别犯那种病
  6. respberry pi3 上手随记
  7. Ubuntu18.04更换为国内源
  8. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践
  9. P3242 [HNOI2015] 接水果(整体二分、扫描线、dfs序)
  10. C#LeetCode刷题之#830-较大分组的位置(Positions of Large Groups)
  11. MinGW 64的安装 - 官网sourceforge安装失败非翻墙解决办法
  12. 利用Linux命令行进行文本按行去重并按重复次数排序
  13. CCS实例,网页栏目
  14. hadoop jps 没有命令_hadoop:伪分布模式启动步骤分解
  15. 信号完整性之传输线理论(三)
  16. cannot re-initialize CUDA in forked subprocess.To use CUDA with multiprocessing,you must use the ‘sp
  17. 零零信安王宇:通过基于VPT的风险管理 用20%的时间去解决80%的风险
  18. 2019腾讯广告算法大赛之清洗曝光广告数据集以及构造标签
  19. 将SSH多次登录失败的IP加入黑名单
  20. Kafka入门篇学习笔记整理

热门文章

  1. 【深度学习】步态识别-论文笔记:(ICCV-2021)用于步态识别的3D局部卷积神经网络
  2. 智能交通行业中安防业务突出的上市公司
  3. Foundation Actionscript 3.0 with Flash CS3 and Flex
  4. 如何设计一个漂亮的仪表盘—Jeecg仪表盘轻松实现【数据可视化专题】
  5. 企业邮箱-oa移动办公系统,高效协同办公解决方案
  6. 钉钉机器人自动回复消息_微信pc客户端自动发消息(微信聊天机器人)
  7. 基于SSM的新闻管理系统的设计与实现 毕业论文+项目源码及数据库文件、
  8. 迭代一感想总结 - 赵雷彧
  9. 什么是兴趣点 (POI)
  10. 天购免费购物新概念 电商新宠领前行