oracle 自定义函数(非常简单明了)

语法说明

复制代码
create [or replace] function functionName   (parameterName1 mode1 dataType1,  parameterName2 mode2 dataType2,  ...)  
 return returnDataType  
 is/as  
 	-- 定义使用变量、返回变量
 begin  
 	function_body  
 	return expression  
end functionName; -- 结束函数的声明,也可以直接写end不加函数名。  

-- 其中mode1、mode2表示参数类型,dataType表示参数的数据类型。returnDataType表示返回值类型。  

举例说明

1.举一个简单的例子

定义一个简单的函数,计算两数之和

复制代码
create or replace function useEasy(add1 in number, add2 in number) 
  return number 
  is
    FunctionResult number;
  begin
    FunctionResult := add1 + add2;
    return(FunctionResult);
end useEasy;

函数的使用请继续往下看

2.举一个复杂的例子(虽然复杂,但是很实用)

1⃣️、定义函数的返回类型

创建 TYPE 类型 atrr_type

复制代码
1、CREATE OR REPLACE TYPE atrr_type  AS OBJECT (
       attrId varchar2(40),
       objType varchar2(40)
);

2、将 TYPE 类型 atrr_type 定义为表, 用做接收返回值

复制代码
CREATE OR REPLACE TYPE attr_table AS TABLE of atrr_type;

2⃣️、定义函数(这里介绍三种方式)

1、以游标形式返回,有很大的局限性

复制代码
create or replace function selectAttrId(objType in VARCHAR2)
  return SYS_REFCURSOR 
  is
    attrId SYS_REFCURSOR;
  begin
    OPEN attrId FOR
      select attr_id, obj_type from CPS_OBJ_ATTR where obj_type = objType;
    return(attrId);
end selectAttrId;

2、以 Table 形式 返回结果集

复制代码
create or replace function resultFunction(objType in VARCHAR2)
  return attr_table 
  is
    attr_row 	atrr_type;        	 		  -- 定义单条数据变量
    attr     	attr_table := attr_table();   -- 定义返回结果,并初始化
  begin
    for thisrow in (select attr_id as attrId, obj_type as objType from CPS_OBJ_ATTR where obj_type = objType) 
    loop
      attr_row := atrr_type(thisrow.attrId, thisrow.objType);
      attr.extend;
      attr(attr.count) := attr_row;
    end loop;
  return(attr);
end resultFunction;

3、以管道形式返回结果集

复制代码
create or replace function returnPiperesult(objType in VARCHAR2)
  return attr_table pipelined
  is
    attr_row atrr_type;		 --定义attr_row为行对象类型
  begin
    for thisrow in (select attr_id as attrId, obj_type as objType from CPS_OBJ_ATTR where obj_type = objType)
    loop
      attr_row:= atrr_type(thisrow.attrId, thisrow.objType);
      pipe row (attr_row);
    end loop;
  return;
end returnPiperesult;

3⃣️、函数的使用

复制代码
select resultFunction('turck') from dual;			-- 直接调用函数

select * from table(resultFunction('turck'));  	-- 返回结果集table时,可以调用(自定义一个type为table 作为返回结果集)

觉得文章实用,请在右上方点个?

相关推荐
数据库砖家25 分钟前
YashanDB|虚拟内存高出实际内存十几G?原因不只是“占用大”这么简单
数据库
郭源潮11 小时前
《MySQL:MySQL表结构的基本操作》
数据库·mysql
火龙谷1 小时前
【hive】Hive对数据库,对表的操作(一)
数据库·hive·hadoop
西门吹雪@1322 小时前
redis 配置日志和数据存储位置
数据库·redis·缓存
一只栖枝2 小时前
OCP证书有效期是永久,但需要更新
数据库·开闭原则·ocp·oracle认证·ocp培训·ocp证书
王会举4 小时前
让SQL飞起来:搭建企业AI应用的SQL性能优化实战
数据库·人工智能·ai·性能优化
bing_1584 小时前
在 Spring Boot 项目中,如何进行高效的数据库 Schema 设计?
数据库·spring boot·后端·数据库schema设计
听雪楼主.4 小时前
Oracle补丁安装工具opatch更新报错处理
数据库·oracle
不吃元西4 小时前
对于客户端数据存储方案——SQLite的思考
数据库·sqlite