标签: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;
标签:cursor sum 输出参数 to_date 参数 return pre 付出 部分
原文地址:https://www.cnblogs.com/shici/p/14407872.html