2019独角兽企业重金招聘Python工程师标准>>>

Oracle自定义函数

用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序。调用时如同系统函数一样,如max(value)函数,其中,value被称为参数。函数参数有3种类型。

IN 参数类型:表示输入给函数的参数。

OUT 参数类型:表示参数在函数中被赋值,可以传给函数调用程序。

IN OUT参数类型:表示参数既可以传值也可以被赋值。

1、语法格式:

SQL语法方式创建的语法格式为:

CREATE OR REPLACE FUNCTION function_name         /*函数名称*/
(
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 id = v_id;    
   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 id = v_id;
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语句

查看函数院源代码
oracle会将函数名及其源代码信息存放到数据字典中user_source 
select text from user_source where name='GET_EMPNAME';

删除函数
drop function get_empname

  不带任何参数

  create or replace function get_user return varchar2 is

  Result varchar2(50);

  begin

  select username into Result from user_users;

  return(Result);

  end get_user;

  执行:

  带in参数的

  create or replace function get_sal(empname in varchar2) return number is

  Result number;

  begin

  select sal into Result from emp where ename=empname;

  return(Result);

  end get_sal;

  执行: SQL> var sal number

  SQL> exec :sal:=get_sal('scott');

  带out参数的函数

  create or replace function get_info(e_name varchar2,job out varchar2) return number is

  Result number;

  begin

  select sal,job into Result,job from emp where ename=e_name;

  return(Result);

  end get_info;

  执行: SQL> var job varchar2(20)

  SQL> var dname varchar2(20)

  SQL> exec :dname:=get_info('SCOTT',:job)

  带in out参数的函数

  create or replace function result(num1 number,num2 in out number) return number is

  v_result number(6);

  v_remainder number;

  begin

  v_result :=num1/num2;

  v_remainder :=mod(num1,num2);

  num2 :=v_remainder;

  return(v_result);

  Exception

  when zero_divide then

  raise_application_error(-20000,'不能除0');

  end result;

  执行: var result1 number;

  var result2 number;

  exec :result2:=30

  exec :result1:=result(100,:result2)

  eg:

  1 、一个最简单的自定义函数Fun_test1的定义。

  create or replace function Fun_test1(p_1 number)--Fun_test1是函数名,有一个输入参数p_1,是number型的。返回值也是number型的

  return number

  IS

  begin

  if p_1>0 then

  return 1;

  elsif p_1=0 then

  return 0;

  else

  return -1;

  end if;

  end;

  --这个函数只是可以知道自定义函数的定义和格式。其实没什么用途。

  2、Fun_test1自定义函数的调用的存储过程Pro_Fun_test1_1示例:

  create or replace procedure Pro_Fun_test1_1(

  p1_in in number,

  p2_out out number

  )

  AS

  begin

  p2_out:=Fun_test1(p1_in);

  end Pro_Fun_test1_1;

  --一个输入参数,一个输出参数

  3、Fun_test1自定义函数的调用的存储过程Pro_Fun_test1_2示例:

  create or replace procedure Pro_Fun_test1_2(

  p1_in in number,

  p2_out out number

  )

  AS

  t_1 number;

  begin

  select Fun_test1(p1_in)+100 INTO p2_out

  from bill_org where org_ID=1;

  end Pro_Fun_test1_2;

  --自定义函数的调用方法和Oracle的其它内部函数是一样的。

  二、包的定义和使用入门

  包一般是过程和函数的集合,对过程和函数进行更好的封装,一般不针对字段。

  包的构成包括包头和包体。

  1、包头的定义:

  包头仅仅只是对包中的方法进行说明,而没有实现

  语法:

  create or replace package myPackage_1

  is

  procedure syaHello(vname varchar2);--申明了该包中的一个过程

  end;

  2、包体的定义:

  包体是对包头中定义的过程、函数的具体实现。

  create or replace package body myPackage_1

  is

  procedure syaHello(vname varchar2)--对包中定义的过程的实现

  is

  begin

  dbms_output.put_line('Hello '||vname);

  end;

  end;

  要注意的是:

  create or replace package后面的名称必须和create or replace package body后面的名称一致,

  如果将create or replace package body后面的名称改为,'MYPACKAGE'

  否则将会出现诸如下面的错误:

  必须说明标识符 'MYPACKAGE'

  3、调用包用的自定义方法:

  create or replace procedure Pro_test_package(

  p1_in string

  )

  AS

  begin

  myPackage_1.syaHello(p1_in);

  end Pro_test_package;

  eg2:

  --没有参数的函数

  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;

  return v_user;

  --测试

  方法一

  select get_user from dual;

  方法二

  SQL> var v_name varchar2(50)

  SQL> exec :v_name:=get_user;

  --带有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 id = v_id;

  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语句

  查看函数院源代码

  oracle会将函数名及其源代码信息存放到数据字典中user_source

  select text from user_source where name='GET_EMPNAME';

  删除函数

  drop function get_empname;

  判断任务过期时间:

  create or replace function GetUrgentState(m_TaskID varchar2,

  m_SendTime date,

  m_flag varchar2)

  return varchar2 IS

  myDate date;

  ExpireTime date;

  strsql varchar2(200);

  begin

  myDate := m_SendTime;

  strsql := 'select max(EXPIRETIME) from t_wf_supervise where TASKID =''' ||

  m_TaskID || '''';

  execute immediate strsql

  into ExpireTime;

  --没有到期时间 就是正常状态

  if ExpireTime is null then

  if m_flag = 'String' then

  return '正常';

  end if;

  if m_flag = 'Img' then

  return 'cb_execute.gif';

  end if;

  end if;

  --未发送任务,就是判断当前时间

  if m_SendTime is null then

  myDate := sysdate;

  end if;

  if ExpireTime < myDate then

  if m_flag = 'String' then

  return '超期';

  end if;

  if m_flag = 'Img' then

  return 'cb_limit.gif';

  end if;

  end if;

  --小于3天的任务预警

  if ExpireTime - myDate < 3 then

  if m_flag = 'String' then

  return '预警';

  end if;

  if m_flag = 'Img' then

  return 'cb_warning.gif';

  end if;

  else

  if m_flag = 'String' then

  return '正常';

  end if;

  if m_flag = 'Img' then

  return 'cb_execute.gif';

  end if;

  end if;

  end;

  查询其它表数据:

  create or replace function GetPreNode(m_PreTaskID varchar2) return varchar2 IS

  nodename varchar2(50);

  strsql varchar2(200);

  begin

  if m_PreTaskID is null then

  return '';

  end if;

  strsql := 'select max(nodename) from t_Wf_Tasklist where TaskID =''' ||

  m_PreTaskID|| '''';

  execute immediate strsql

  into nodename;

  return nodename;

  end;

  格式化标题输出:

  create or replace function FormatTitle(m_title varchar2,

  m_length number,

  m_FillChar varchar2) return varchar2 IS

  begin

  if lengthb(m_title) > m_length*2 then

  return substr(m_title, 0,m_length) || m_FillChar;

  else

  return m_title;

  end if;

  end;

转载于:https://my.oschina.net/duanyunhu/blog/130703

Oracle自定义函数相关推荐

  1. excel中DATE(year,month,day)函数——oracle自定义函数

    @oracle自定义函数写excel中DATE函数 oracle自定义函数写excel中DATE函数 EXCEL中DATE函数逻辑为DATE(year,month,day) 含义:DATE(年,月,日 ...

  2. oracle 获取汉字简拼,oracle自定义函数(全拼跟简拼)

    oracle自定义函数(全拼和简拼) 1.全拼 CREATE OR REPLACE FUNCTION TOASPELL (Name in varchar2) return Varchar2 DETER ...

  3. oracle中怎么自定义函数,Oracle自定义函数

    用户自定义函数是存储在数据库中的代码块,可以把值返回到调用程序.函数的参数有3种类型: (1)in参数类型:表示输入给函数的参数,该参数只能用于传值,不能被赋值. (2)out参数类型:表示参数在函数 ...

  4. oracle自定义函数获取省份,oracle 自定义函数 方法 基本例子

    核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...

  5. oracle 根据分隔符提取,oracle自定义函数按照某个分隔符拆分字符串

    1.首先需要定义一个集合类型,我这里定义的是变长数组类型(VARRAY) create type type_splitstr is varray(1024) of varchar2(128); --注 ...

  6. oracle中自定义函数如何使用,oracle自定义函数语法及使用

    1.自定义函数语法 create [or replace] function  函数名                         -- 定义一个名为xxx的函数 ( parameterName1 ...

  7. oracle 数据补齐月份,Oracle自定义函数--增加月份

    场景 获取输入时间的下N(N>=0)个月的日期. 场景一:输入6月30,则返回7月30,由于Oracle默认的add_months函数获取的是7月31(因为输入的6月30是6月最后一天,Orac ...

  8. oracle 自定义函数 返回一个表类型

    oracle 中的函数可以返回表类型   但,这个表类型实际上是集合类型(与数组类似)   这个类型不能直接作为 from 的宾语     从oracle 9i 开始,提供了一个叫做"管道化 ...

  9. oracle自定义函数返回一个表,oracle 自定义函数 返回一个表类型

    oracle 中的函数可以返回表类型 但,这个表类型实际上是集合类型(与数组类似) 这个类型不能直接作为 from 的宾语 从oracle 9i 开始,提供了一个叫做"管道化表函数" ...

最新文章

  1. 计算点云之间的平均距离,方差,标准差
  2. Redis 学习资料整理
  3. Windows任务计划创建计划,定时执行PowerShell命令
  4. Hdu 2522 hash
  5. local_irq_disable
  6. 13.1-13.3 设置更改root密码,连接MySQL,MySQL常用命令
  7. php 电梯程序设计,教你写出京东电梯式轮播
  8. Java EE 7中的资源和依赖注入
  9. centos6.8 安装软件
  10. sorted函数python_python中排序函数sort,sorted和operator.itemgetter的使用
  11. OJ 21658::Monthly Expense(二分搜索+最小化最大值)
  12. arcgis python 百度网盘 视频_arcgis软件零基础入门视频教程27讲百度网盘链接
  13. 尽在双11:阿里巴巴技术演进与超越
  14. 虚拟机如何安装优麒麟19.10
  15. The server time zone value ‘ й ׼ʱ ‘ is unrecognized or represents more than one time zone. You mu
  16. php图片翻转,php识别翻转iphone拍摄的颠倒图片
  17. 福建农林大学计算机科学专硕,2020年福建农林大学计算机与信息学院招收攻读硕士学位研究生第一批调剂复试名单公示...
  18. 剑指 Offer 46. 把数字翻译成字符串(javascript)
  19. TOM在线解读:《你好,李焕英》为什么火了?
  20. Logistic Regression with Python

热门文章

  1. c++ :MFC 如何遍历窗口同类型控件ID
  2. 【百家稷学】深度学习与计算机视觉核心理论与实践(中国地质大学实训)
  3. 【知识星球】猫猫狗狗与深度学习那些事儿
  4. 速卖通代运营收费标准,什么样的商家适合找代运营公司
  5. 中国电磁线行业发展前景预测与竞争态势分析报告2022-2028年版
  6. 6.6.1 CPropertySheet类
  7. java 动态编译 canino_java动态编译
  8. 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)
  9. redis的7个应用场景
  10. java performance tools / NetBeans Profiler / Sun BTrace / Eclipse MAT / IBM ISA