1.系统预定义函数
- ---聚合函数 sum max min count avg median wm_concat
- ---常用函数:数学函数 字符串函数 时间 trunc (date,'q')
- ---分析函数: over()
ratio_to_report() ntile()over() lead() lag() wm_concat() first_value() row_number() rank() dense_rank()
2.oracle自定义函数语法
create or replace function 函数名(参数1 数据类型,参数2 [in | out] 数据类型……) return 返回的数据类型 ---返回的如果是 varchar2 类型,也不能给长度 is ---is 或者 as 随便写一个都可以 声明变量 ---声明变量的时候记得给长度 begin 函数的具体逻辑; return 声明变量; --里面必须要有一个return子句 ---异常处理 end;
3.什么是编译
编译,就是把函数在数据库里创建。
编译就是将写好的代码放在数据库里某个文件里存着,调用函数的时候,就会到数据库里执行存放的函数逻辑。
检查函数编译(创建)的时候有没有报错 选中函数的名称 > 鼠标右键 > view/edit
4.自定义函数练习题
示例:创建计算 1到 n 的和的函数
create or replace function fun_n(n number) return number as f_sum number := 0; -- 存放临时累加的和 begin for i in 1..n loop f_sum := f_sum + i; end loop; return f_sum; -- 定义异常 exception when others then dbms_output.put_line(sqlerrm); -- 使用 dbms_output.put_line 过程输出异常的错误消息。 -- sqlerrm 是一个oracle预定义的异常变量,它包含了最近一次数据库运行时错误的描述。 end; select fun_n(10) from dual;
示例:假如 oracle没有 power 这个函数,需要人工自己开发函数power_a
create or replace function power_a(n1 number, n2 number) return number as f_power number := 1; -- 存放临时累加的和 begin for i in 1..n2 loop f_power := f_power * n1; end loop; return f_power; -- 定义异常 exception when others then dbms_output.put_line(sqlerrm); end; select power_a(3,3) from dual;
第1次循环:v1 = 1 * 3 = 3
第2次循环:v1 = 3 * 3 = 9
第3次循环:v1 = 9 * 3 = 27 → 最终结果
示例:创建一个函数,根据传递给函数的员工编号返回员工的姓名;
create or replace function f_ename(p_empno number) return varchar2 -- 参数不能定义长度 as v_ename varchar2(10); -- 变量要定义长度 begin select ename into v_ename from emp where empno = p_empno; return v_ename; -- 定义异常 exception when others then dbms_output.put_line(sqlerrm); end; select f_ename(7369) from dual;
开发自定义函数,返回 数字的阶乘,例如:select f_factorial(4) from dual;
create or replace function f_factorial(p_n number) return number -- 参数不能定义长度 as v1 number := 1; -- 临时存放累加值 begin for i in 1..p_n loop v1 := v1 * i; end loop; return v1; -- 定义异常 exception when others then dbms_output.put_line(sqlerrm); end; select f_factorial(4) from dual;
开发自定义函数,比较两个数字的大小 p_max_min(m number,n number)返回比较大的值;
create or replace function p_max_min(m number, n number) return number as temp number; begin if m > n then temp := m; else temp := n; end if; return temp; end; select p_max_min(12, 9) from dual;
创建一个函数,函数的功能是根据传入的一个岗位名称,将这个岗位的员工数量返回
create or replace function f_amount(p_job varchar2) return number as v_ct number; begin select count(1) into v_ct from emp where job = p_job; return v_ct; end; select f_amount('manager') from dual;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论