设为首页 收藏本站
查看: 853|回复: 0

[经验分享] Oracle的自定义函数浅析

[复制链接]

尚未签到

发表于 2018-9-5 11:36:53 | 显示全部楼层 |阅读模式
  用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序。调用时如同系统函数一样,如max(value)函数,其中,value被称为参数。函数参数有3种类型。
  IN 参数类型:表示输入给函数的参数。
  OUT 参数类型:表示参数在函数中被赋值,可以传给函数调用程序。
  IN OUT参数类型:表示参数既可以传值也可以被赋值。
  1、语法格式:
  SQL语法方式创建的语法格式为:
DSC0000.gif CREATE OR REPLACE FUNCTION function_name         /*函数名称*/

DSC0001.gif (

Parameter_name1,mode1 datatype1,            /*参数定义部分*/

Parameter_name2,mode2 datatype2,

Parameter_name3,mode3 datatype3


)

RETURN return_datatype                /*定义返回值类型*/

IS/AS

BEGIN

       Function_body                  /*函数体部分*/

      RETURN scalar_expression                        /*返回语句*/

END function_name;


  说明:
  function_name::用户定义的函数名。函数名必须符合标示符的定义规则,对其所有者来说,该名在数据库中是唯一的。
  parameter:用户定义的参数。用户可以定义一个或多个参数。
  mode:参数类型。
  datatype:用户定义参数的数据类型。
  return_type::用户返回值的数据类型。
  函数返回scalar_expression表达式的值,function_body函数体由pl/sql语句构成。
  2、示例
  函数代码:
create or replace function T01001_count

return number

is

count_T01001 number;

begin

select count(*) into count_T01001 from T01001;

return(count_T01001);

end T01001_count;                  --记得一定要打分号


调用:

declare

i number;

begin

i:=T01001_count();

dbms_output.put_line(to_char(i));

end;                 --记得一定要打分号

  注意:
  (1)    如果函数没有参数,那么函数名后不应该要括号;
  (2)    创建函数的时候end后面一定要记得写函数名
  --没有参数的函数
  create or replace function get_user return varchar2 is
  v_user varchar2(50);
  begin
  select username into v_user from user_users;
  return v_user;
  end get_user;
  --测试
  方法一
  select get_user from dual;   
  方法二
  SQL> var v_name varchar2(50)
  SQL> exec :v_name:=get_user;
  PL/SQL 过程已成功完成。
  SQL> print v_name
  V_NAME
  ------------------------------
  TEST
  方法三
  SQL> exec dbms_output.put_line('当前数据库用户是:'||get_user);
  当前数据库用户是:TEST
  PL/SQL 过程已成功完成。
  --没有参数的函数
  create or replace function get_user return varchar2 is
  v_user varchar2(50);
  begin
  select username into v_user from user_users;
  return v_user;
  end get_user;
  --测试
  方法一
  select get_user from dual;
  方法二
  SQL> var v_name varchar2(50)
  SQL> exec :v_name:=get_user;
  PL/SQL 过程已成功完成。
  SQL> print v_name
  V_NAME
  ------------------------------
  TEST
  方法三
  SQL> exec dbms_output.put_line('当前数据库用户是:'||get_user);
  当前数据库用户是:TEST
  PL/SQL 过程已成功完成。
  Sql代码
  --带有IN参数的函数
  create or replace function get_empname(v_id in number) return varchar2 as
  v_name varchar2(50);
  begin

  select name into v_name from employee where>  return v_name;
  exception
  when no_data_found then
  raise_application_error(-20001, '你输入的ID无效!');
  end get_empname;
  --带有IN参数的函数
  create or replace function get_empname(v_id in number) return varchar2 as
  v_name varchar2(50);
  begin

  select name into v_name from employee where>  return v_name;
  exception
  when no_data_found then
  raise_application_error(-20001, '你输入的ID无效!');
  end get_empname;
  附:
  函数调用限制
  1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数
  2、SQL只能调用带有输入参数,不能带有输出,输入输出函数
  3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)
  4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句
  5.项目实际例子(获得用户姓名的函数):
FUNCTION f_hfsc_get_user_name  (
  V_USERID INTEGER
  )
  RETURN VARCHAR
  AS
  V_USERNAME VARCHAR(100);
  V_CNTSMALLINT;
  BEGIN

  SELECT NVL(SUM(1),0) INTO V_CNT FROM DUAL WHERE EXISTS(SELECT * FROM T_MK_SYS_USER WHERE>  IF V_CNT0 THEN

  SELECT F_CAPTION INTO V_USERNAME FROM T_MK_SYS_USER WHERE>  ELSE

  SELECT PERSONAL_CAPTION INTO V_USERNAME FROM T_SY_WT_PERSONAL_USER WHERE>  END IF;
  RETURN V_USERNAME ;
  END;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-563541-1-1.html 上篇帖子: Oracle查询用户信息相关指令 下篇帖子: 免oracle客户端的PLSQLDeveloper的配置指南
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表