oracle之函数:

  • 1、函数与过程的区别
  • 2、函数的创建
  • 3、函数的调用
    • a、在SQL语句中直接调用
    • b、使用输出语句调用函数
    • c、sqlplus:绑定函数来做
  • 4、修改和删除函数
  • 5、查看函数
  • 6、练习:
    • a、1. 定义一个函数,用于计算emp表中某个部门的平均工资。
    • b、写一个函数,传入员工编号,返回所在部门名称
    • c、写一个函数,可以查询某个员工的年收入,包括奖金
    • d:定义函数,输入部门编号,查询出该部门的员工总数。
    • e、定义函数,使用记录类型作为返回类型,根据指定的部门号返回其对应的部门信息

1、函数与过程的区别

过程 可以接收传递的值 可以没有返回值
函数 可以接收传递的值 必须有返回值

函数必须有return子句
函数中不能包含对数据库执行操作的语句,如DML语句(增删改查)

2、函数的创建

格式:

创建
Create or replace function function_name[(argment in|out|in out type)]
Return return_type      -- return语句必须有,后面跟一个return值的类型(varchar2(10)、number(10)都可以)
Is|as
[declare_section]      --声明部分,用来声明变量
BeginFunction_body   --也必须要有return语句
Exception
…
End;

注意:begin语句体中也必须要写return语句,return的是一个值。

函数来讲一般都是用有in参数的,out参数的和in out参数的都不经常使用

创建一个简单的函数:(输出一句话)

方案1:

create or replace function sayhello return varcahr2 --varcahr2不能有长度
is
say varchar2(20); --这个地方是可以定义长度的。
beginsay := 'hello world';return say;
end;

方案2:

create or replace function sayhello2 return varcahr2 --varcahr2不能有长度
is
beginreturn 'hello world';
end;

下面是函数的调用:(函数相当于表达式或者说是相当于一个变量),通过函数的调用可以使返回的值输出。

select sayhello2 from dual;

例:定义一个函数,用于计算emp表中某个部门的平均工资。

create or replace FUNCTION get_avgsal(dno in emp.deptno% TYPE)
RETURN NUMBER
isf_avgsal emp.sal% TYPE;
BEGINSELECT avg(sal) into f_avgsal from emp where deptno=dno;return f_avgsal;
END;

3、函数的调用

a、在SQL语句中直接调用

select distinct deptno,get_avgsal(10) from emp where deptno=10;
select get_avgsal(10) 平均值 from dual;

b、使用输出语句调用函数

set serveroutput on
BEGINdbms_output.put_line(avgsal(10));
END ;

c、sqlplus:绑定函数来做

var say varchar2(20);
exec :say:=sayhello2();
print say;
select :say from dual;

4、修改和删除函数

修改:or replace
删除:drop function 函数名
注意:删除时不要加括号和参数

5、查看函数

select object_name from user_objects where object_type='FUNCTION';COL TEXT FORMAT A60
select line,text from user_source where name='GET_ENAME';

6、练习:

a、1. 定义一个函数,用于计算emp表中某个部门的平均工资。

create or replace function get_avgsal(dno emp.deptno%type)
return number
isf_avgsal emp.sal%type;
beginselect avg(sal) into f_avgsal from emp where deptno=dno;return f_avgsal;
end;begindbms_output.put_line(get_avgsal(10));
end;select get_avgsal(10) from dual;

b、写一个函数,传入员工编号,返回所在部门名称

create or replace function d_name(eno emp.empno%type)
return varchar2
isf_name dept.dname%type;
beginselect dname into f_name from dept where deptno = (select deptno from emp where empno=eno);return f_name;
end;select d_name(7369) from dual;

c、写一个函数,可以查询某个员工的年收入,包括奖金

create or replace function sumsal(eno emp.empno%type)
return emp.sal%type
issum_num number;
beginselect nvl(sal+comm,sal)*12 into sum_num from emp where empno=eno;return sum_num;
end;declarev_no emp.empno%type := &a;
begindbms_output.put_line(sumsal(v_no));
end;

d:定义函数,输入部门编号,查询出该部门的员工总数。

create or replace function emp_sum(dno emp.deptno%type)
return number
istotal number;
beginselect count(*) into total from emp group by deptno having deptno=dno;return total;
end;begindbms_output.put_line('该部门总人数为:' || emp_sum(&a));
end;

e、定义函数,使用记录类型作为返回类型,根据指定的部门号返回其对应的部门信息

方案一:

create or replace function s_dept(dno dept.deptno%type)
return dept%rowtype
is
d_message dept%rowtype;
begin
select * into d_message from dept where deptno=dno;
return d_message;
end;declarev_no dept.deptno%type := &a;
begin
dbms_output.put_line(s_dept(v_no).deptno || '     ' || s_dept(v_no).dname || '     ' || s_dept(v_no).loc);
end;

方案二:

create or replace function s_dept(dno in dept.deptno%type) return dept%rowtype
isd_message dept%rowtype;
beginselect * into d_message from dept where deptno=dno; return d_message;
end;
declared_no dept.deptno%type:=&a;d_mess dept%rowtype:=s_dept(d_no);
begindbms_output.put_line(d_mess.deptno||'   '||d_mess.dname||'    '||d_mess.loc);
end;

oracle 函数的使用相关推荐

  1. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)

    我需要使用注解在MyBatis中调用Oracle函数.使用MyBatis调用oracle函数(基于注释) 我的映射: @Select("{ CALL #{outParam, jdbcType ...

  2. oracle增量 mysql_是否有任何mysql / Oracle函数给予增量号。基于另一列相似值的一列?...

    我有兴趣知道是否有任何MySQL / Oracle函数给增量号.在另一列相似的值的基础上的一列? 就像在我的下面的代码中,我有order_primary列,其中包含订单号.所以基于此我们可以确定有多少 ...

  3. 使用oracle 游标修改数据,Oracle 函数施行修改和游标传递

    Oracle 函数执行修改和游标传递 ORA-14551:不能在查询语句中执行dml语句,开始误以为函数里不能执行DML或DDL语句,后查到前辈通过采用自治事务解决,在此基础上演例 传递SQL语句对数 ...

  4. oracle 函数索引

    http://bbs.51cto.com/thread-26271-1.html 如何创建oracle函数索引 Oracle8i的很重要的一个新特性就是增加了function-based index这 ...

  5. oracle+查询主机地址,oracle函数:获取Internet主机名和ip地址

    您可能感兴趣的话题: Oracle 核心提示:oracle函数获取Internet主机名和ip地址 Oracle包utl_inaddr 作用:用于取得局域网或Internet环境中的主机名和IP地址. ...

  6. row number函数 oracle,oracle函数 ROW_NUMBER()

    [语法]ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) [功能]表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后 ...

  7. [转载]oracle函数listagg的使用说明

    工作中经常遇到很多需求是这样的,根据条件汇总某些字段,比如我遇到的是,我们公司有三个投资平台,同一个客户拿手机号在三个平台都注册了,但注册过的用户名不一样,显示的时候需要根据手机号显示所有注册过的名称 ...

  8. jdbc oracle 函数,Oracle系列:(33)JDBC访问Oracle的存储过程和存储函数

    1.存储过程 1.1.准备SQL-- 定义存储过程 create or replace procedure get_rax(salary in number,rax out number) as -- ...

  9. oracle函数建立码值,Oracle函数与存储过程

    1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 D ...

  10. oracle强大函数,oracle 函数排行

    oracle 函数排名 SQL> SELECT empno,ename,sal,rank() over(ORDER BY nvl(sal,0) DESC) 排序 from emp; EMPNO ...

最新文章

  1. 想学单片机怎么入手?学单片机前先学什么?
  2. python最简单的架构_Python实现简单状态框架的方法
  3. 技术分享:如何避免ajax重复请求?
  4. bootstrap 栅栏剧中_Bootstrap 栅栏布局中 col-xs-*、col-sm-*、col-md-*、col-lg-* 区别及使用方法...
  5. nodejs 框架 中文express 4.xxx中文API手册
  6. Java线程:新特征-有返回值的线程(转)
  7. 《DSP using MATLAB》Problem 7.4
  8. linux执行class文件_深入理解linux内核——可执行文件执行过程(2)
  9. [转载]我的PMP复习备考经验谈(下篇)——一本关于PMP备考的小指南
  10. angular 字符串转换成数字_Python基础语法大全:字符串的处理与使用
  11. es6 Generator函数的应用
  12. 检查虚拟机是否使用virtio
  13. html select ajax,AJAX 动态加载后台数据 绑定select的方法
  14. 注册Google账号
  15. J2EE进阶之JSP和EL表达式 十二
  16. Xiuno BBS 4.0 修改时间显示
  17. 通过电阻色环识别(固定)电阻阻值的方法
  18. 关于gradle项目中使用queryDsl生成Q类的问题的解决方式
  19. 思考之——java为什么不能多继承
  20. 知识星球爬虫2023-2-9

热门文章

  1. 社交电商源码-带直播电商功能-可DIY前端
  2. VBA函数 find
  3. Redis 实战案例总结
  4. lammps教程:EAM势函数设置详解
  5. 需求分析报告和需求规格说明书有什么区别?
  6. 计算机基础access2010实训,大学计算机基础access实验.doc
  7. MLDN Java学习笔记(4)
  8. matlab中怎么找晶闸管,matlab中晶闸管如何连接
  9. PADS2007教程(一)——原理图封装
  10. 深入浅出MFC第一章笔记