码迷,mamicode.com
首页 > 其他好文 > 详细

05-存储函数与存储过程

时间:2021-02-18 13:54:06      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cursor   sum   输出参数   to_date   参数   return   pre   付出   部分   


  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;

05-存储函数与存储过程

标签:cursor   sum   输出参数   to_date   参数   return   pre   付出   部分   

原文地址:https://www.cnblogs.com/shici/p/14407872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!