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;