zoukankan      html  css  js  c++  java
  • 05-存储函数与存储过程


      1 --[存储函数:有返回值,创建完成后,通过select function() from dual;执行]
      2 --[存储过程:由于没有返回值,创建完成后,不能使用select语句,只能使用pl/sql块执行]
      3 
      4 --[格式]
      5 --函数的声明(有参数的写在小括号里)
      6 create or replace function func_name(v_param varchar2)
      7     --返回值类型
      8     return varchar2
      9 is 
     10     --PL/SQL块变量、记录类型、游标的声明(类似于前面的declare的部分)
     11 begin
     12     --函数体(可以实现增删改查等操作,返回值需要return)
     13        return 'helloworld'|| v_logo;
     14 end;
     15 
     16 --22.1 函数的 helloworld: 返回一个 "helloworld" 的字符串
     17 
     18 create or replace function hello_func
     19 return varchar2
     20 is
     21 begin
     22        return 'helloworld';
     23 end;
     24 
     25 --执行函数
     26 
     27 begin
     28     dbms_output.put_line(hello_func());
     29 end;
     30 
     31 --或者: select hello_func() from dual;
     32 
     33 --22.2 返回一个"helloworld: atguigu"的字符串,其中atguigu 由执行函数时输入。
     34 
     35 --函数的声明(有参数的写在小括号里)
     36 create or replace function hello_func(v_logo varchar2)
     37 --返回值类型
     38 return varchar2
     39 is 
     40 --PL/SQL块变量的声明
     41 begin
     42 --函数体
     43        return 'helloworld'|| v_logo;
     44 end;
     45 
     46 --22.3 创建一个存储函数,返回当前的系统时间
     47 create or replace function func1
     48 return date
     49 is
     50 --定义变量
     51 v_date date;
     52 begin
     53     --函数体
     54     --v_date := sysdate;
     55        select sysdate into v_date from dual;
     56        dbms_output.put_line('我是函数哦');
     57        
     58        return v_date;
     59 end;
     60 
     61 --执行法1:
     62 select func1 from dual;
     63 --执行法2:
     64 declare
     65   v_date date;
     66 begin
     67   v_date := func1;
     68   dbms_output.put_line(v_date);
     69 end;
     70 
     71 --23. 定义带参数的函数: 两个数相加
     72 
     73 create or replace function add_func(a number, b number)
     74 return number
     75 is
     76 begin
     77        return (a + b);
     78 end;
     79 
     80 --执行函数
     81 
     82 begin
     83     dbms_output.put_line(add_func(12, 13));
     84 end;
     85 --或者
     86     select add_func(12,13) from dual;
     87 
     88 --24. 定义一个函数: 获取给定部门的工资总和, 要求:部门号定义为参数, 工资总额定义为返回值.
     89 
     90 create or replace function sum_sal(dept_id number)
     91        return number
     92        is
     93        
     94        cursor sal_cursor is select salary from employees where department_id = dept_id;
     95        v_sum_sal number(8) := 0;   
     96 begin
     97        for c in sal_cursor loop
     98            v_sum_sal := v_sum_sal + c.salary;
     99        end loop;       
    100 
    101        --dbms_output.put_line('sum salary: ' || v_sum_sal);
    102        return v_sum_sal;
    103 end;
    104 
    105 --执行函数
    106 
    107 begin
    108     dbms_output.put_line(sum_sal(80));
    109 end;
    110 
    111 --25. 关于 OUT 型的参数: 因为函数只能有一个返回值, PL/SQL 程序可以通过 OUT 型的参数实现有多个返回值
    112 
    113 --要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的参数).
    114 --要求: 部门号定义为参数, 工资总额定义为返回值.
    115 
    116 create or replace function sum_sal(dept_id number, total_count out number)
    117        return number
    118        is
    119        
    120        cursor sal_cursor is select salary from employees where department_id = dept_id;
    121        v_sum_sal number(8) := 0;   
    122 begin
    123        total_count := 0;
    124 
    125        for c in sal_cursor loop
    126            v_sum_sal := v_sum_sal + c.salary;
    127            total_count := total_count + 1;
    128        end loop;       
    129 
    130        --dbms_output.put_line('sum salary: ' || v_sum_sal);
    131        return v_sum_sal;
    132 end;   
    133 
    134 --执行函数:
    135 
    136 declare 
    137   v_total number(3) := 0;
    138 
    139 begin
    140     dbms_output.put_line(sum_sal(80, v_total));
    141     dbms_output.put_line(v_total);
    142 end;
    143 
    144 --26*. 定义一个存储过程: 获取给定部门的工资总和(通过 out 参数), 要求:部门号和工资总额定义为参数
    145 
    146 create or replace procedure sum_sal_procedure(dept_id number, v_sum_sal out number)
    147        is
    148        
    149        cursor sal_cursor is select salary from employees where department_id = dept_id;
    150 begin
    151        v_sum_sal := 0;
    152        
    153        for c in sal_cursor loop
    154            --dbms_output.put_line(c.salary);
    155            v_sum_sal := v_sum_sal + c.salary;
    156        end loop;       
    157 
    158        dbms_output.put_line('sum salary: ' || v_sum_sal);
    159 end;
    160 [执行]
    161 declare 
    162      v_sum_sal number(10) := 0;
    163 begin
    164      sum_sal_procedure(80,v_sum_sal);
    165 end;
    166 
    167 /**27*. 自定义一个存储过程完成以下操作: 
    168 对给定部门(作为输入参数)的员工进行加薪操作, 若其到公司的时间在 (? , 95) 期间,    为其加薪 %5
    169                                                                [95 , 98)             %3       
    170                                                                [98, ?)               %1
    171 得到以下返回结果: 为此次加薪公司每月需要额外付出多少成本(定义一个 OUT 型的输出参数).
    172 
    173 */
    174 create or replace procedure add_sal_procedure(dept_id number, temp out number)
    175 
    176 is
    177 
    178        cursor sal_cursor is select employee_id id, hire_date hd, salary sal from employees where department_id = dept_id;
    179        a number(4, 2) := 0;
    180 begin
    181        temp := 0;       
    182 
    183        for c in sal_cursor loop
    184            a := 0;    
    185            if c.hd < to_date('1995-1-1', 'yyyy-mm-dd') then
    186               a := 0.05;
    187            elsif c.hd < to_date('1998-1-1', 'yyyy-mm-dd') then
    188               a := 0.03;
    189            else
    190               a := 0.01;
    191            end if;
    192            
    193            temp := temp + c.sal * a;
    194            update employees set salary = salary * (1 + a) where employee_id = c.id;
    195        end loop;       
    196 end;

  • 相关阅读:
    IntelliJ IDEA 2017版 SpringBoot的核心配置详解
    路由追踪程序traceroute/tracert分析与科普
    traceroute追踪路由命令
    ping 命令
    hostname命令,修改主机名及host文件
    net-tools工具arp命令
    ifup 和 ifdown
    net-tools工具ifconfig 命令
    iproute2 对决 net-tools
    什么是带内管理 带外管理
  • 原文地址:https://www.cnblogs.com/shici/p/14407872.html
Copyright © 2011-2022 走看看