自定义函数

函数的最大特征是必须返回值

创建自定义函数

创建函数使用create or replace function命令

create or replace function 函数名 return 返回值类型 as
begin
函数定义
end 函数名;

create or replace function getEmployeeCount return number as
begin
declare employee_count number;
begin
select count(1) into employee_count from employees;
return employee_count;
end;
end getEmployeeCount;

调用自定义函数

在pl/sql的环境中利用 函数名+括号 的形式直接调用函数

函数的参数

create or replace function 函数名 (数据类型1 参数1,数据类型2 参数2...)return 返回值类型 as
begin
函数定义
end 函数名;

create or replace function getTableCount(table_name varchar2) return number as
begin
declare record_count number;
aquery_sql varchar(200);
begin
query_sql := 'select count(1) from ' || table_name;
execute immediate_sql query_sql into record_count;
return record_count;
end;
end getTableCount;

execute immediate_sql query_sql into record_count;用于执行动态sql语句query_sql,并将结果置于变量record_count中

利用函数的确定性提高数据库效率

对于一个函数来说,其执行步骤和代码是固定不变的。有时,对于一个函数来说,只要传入的参数一定,那么返回值将不会发生任何改变,这样的函数称为具有确定性的函数。

对于函数,尤其是运算和操作步骤较为复杂的函数,每次为其传入参数,并最终返回运算结果是较为费时的。而函数的确定性,在于可以根据函数名和参数来缓存执行结果。当再次利用相同的参数调用函数时,Oracle将直接获得缓存值,而不会执行函数的实际代码,从而提高工作效率。

create or replace function getEaterAmout(ton number,unitPrice number) return number deterministic as
begin
declaer waterAmount number;
begin
if(ton<=2)then
waterAmount := unitPrice * ton;
end if;
if(ton>2 and ton<=4) then
waterAmount := unitPrice*2 +unitPrice*2*(ton-2);
end if;
if(ton>4) then
waterAmount := unitPrice*2 +unitPrice*2*2+(ton-4)*4*unitPrice;
end if;
return waterAmount;
end;
end getEaterAmout;

在return number之后添加deterministic关键字,表名所创建的函数具有确定性。

典型函数–行转列

create or replace function row2column(sqlString varchar2) return varchar2 as
begin
declare type cu_type is ref cursor;
tmp_cursor cu_type;
tmp_row varchar2(20);
v_result varchar2(500);
begin
open tmp_cursor for sqlString;
fetch tmp_cursor into tmp_row;
while tmp_cursor%found loop
v_result := v_result || tmp_row || ',';
fetch tmp_cursor into tmp_row;
end loop;
return rtrim(v_result,',');
end;
end row2column;

tmp_cursor cu_type;声明一个动态游标;open tmp_cursor for sqlString;在打开游标时,将传入的参数sqlString作为游标定义;while tmp_cursor%found loop则对游标tmp_cursor进行循环操作,将获得的值串联到变量v_result上

select row2column('select employee_name from employees where employee_age>30') result from dual;

获得表employee中,年龄大于30岁的员工姓名

存储过程

函数倾向于处理数据运算;返回值

存储过程倾向于数据库操作,并不返回值

创建存储过程

create or replace procedure 存储过程名称 as
begin
存储过程定义
end 存储过程名称

create or replace procedure updateStatus as
begin
update students set status='Act';
commit;
end updateStatus;

执行存储过程

直接利用存储过程名称调用和执行存储过程

begin
updateStatus;
end;

如果在命令行中,使用execute命令执行存储过程

execute updateStatus;

只进不出的参数–in参数

in参数可以在存储过程内部被访问,但不能被修改

create or replace procedure insertStudent(p_name in varchar2,p_age in number) as
begin
...
end insertStudent;

只出不进的参数–out参数

create or replace peocedure insertStudent(p_name in varchar2,p_age in carchar2,original_count out number,current_count out number) as
begin
declare v_max_id number;
begin
if(p_name is null or legnth(p_name)=0) then
return;
end if;
if(p_age<10 or p_age>30) then
return;
end if;
select count(1) into original_count from students;
select max(student_id) into v_max_id from students;
insert into students(student_id,student_name,student_age,status) values (v_max_id+1,p_name,p_age,'act');
select count(1) into current_count from students;
end;
end insertStudent;

调用

declare v_countk1 number;
v_count2 number;
begin
insertStudent('王云',17,v_countk1,v_count2);
dbms_output.put_line('原数量' || v_countk1);
dbms_output.put_line('现数量' || v_count2);
end;

可进可出的参数–in out 参数

程序包

程序包的规范

创建规范

CREATE OR REPLACE PACKAGE PKG_COVER_TEMPLATE_BASE AS
PROCEDURE P_UPDATE_PROJ_COVER_TEMPLATE;
function getStudentsName return varchar2;
end PKG_COVER_TEMPLATE_BASE;

程序包的主体

CREATE OR REPLACE PACKAGE BODY PKG_COVER_TEMPLATE_BASE AS
function getStudentsName return varchar2 is..(具体内容)..;
PROCEDURE P_UPDATE_PROJ_COVER_TEMPLATE() as..(具体内容)..
end PKG_COVER_TEMPLATE_BASE;

调用程序包中的函数/存储过程

select PKG_COVER_TEMPLATE_BASE.P_UPDATE_PROJ_COVER_TEMPLATE from dual;

Oracle中的函数与存储过程的更多相关文章

  1. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  2. Oracle中wm_concat()函数的使用

    Oracle中wm_concat()函数的使用 wm_concat()函数是oracle行列转换函数,该函数可以把列值以‘,’分割开来,并显示成一行. 1.原数据: 2.把结果分组以‘|’分隔,以一行 ...

  3. Oracle中trunc函数、round 函数、ceil函数和floor函数的使用

    Oracle中trunc函数.round 函数.ceil函数和floor函数的使用 1.1trunc函数处理数字 trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定 ...

  4. Oracle中REGEXP_SUBSTR函数(转)

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下:在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','2 ...

  5. Oracle中sign函数和decode函数的使用

    Oracle中sign函数和decode函数的使用 1.比较大小函数SIGN sign(x)或者Sign(x)叫做 符号函数,其功能是取某个数的符号(正或负): 当x>0,sign(x)=1; ...

  6. oracle中extract()函数----用于截取年、月、日、时、分、秒

    oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 语法如下: extract ( { year | month | day ...

  7. oracle中使用函数控制过程是否执行(结合job使用)

    oracle中使用函数控制过程是否执行(结合job使用时候,循环时间不好写的时候,可以此种方法比较方便) CREATE OR REPLACE FUNCTION wsbs_pk_date_validat ...

  8. Oracle中SYS_CONNECT_BY_PATH函数的妙用 ;

    Oracle 中SYS_CONNECT_BY_PATH函数是非常重要的函数,下面就为您介绍一个使用SYS_CONNECT_BY_PATH函数的例子,实例如下: 数据准备: ),b )); ', 'A' ...

  9. oracle中floor函数和to_number函数区别

     oracle中floor函数没有值默认是0,number函数没有值默认是空 

  10. Oracle中REGEXP_SUBSTR函数(字符串转多行)

    Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20',' ...

随机推荐

  1. dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题

    看随机的报表DEMO,主从表也好,数据分组也好.呈现的非常到位. 问题:可是自己在实现数据分组时,一旦设定分组字段就出现了混乱的数据记录. 问题的原因: 看一下一个报表页面设计时需要理清的概念. 页头 ...

  2. 【电子DIY神器】通吃各种5线步进电机!I2C接口控制28BYJ-48五线四相步进电机

    总线单极性步进电机驱动板 摘要 总线单极性步进电机扩展板采用紧凑型设计,兼容XIAO系列主控板直连或独立使用,支持级联16个模块.板载ULN2003达林顿管驱动芯片(单通道500mA/整片2.5A), ...

  3. 【跟K8S学设计】Informer全分析-Reflector(上)

    鉴于Informer架构及其处理逻辑蕴含了丰富的实战技术,本文将分为上下两章进行深入探讨. 上篇将专注于解析Informer中的Reflector组件,而下篇则会详尽分析Indexer模块.通过这种结 ...

  4. 常用的 JVM 配置参数有哪些?

    常用的 JVM 配置参数 JVM 配置参数可以用来控制 Java 程序的内存分配.垃圾回收.性能优化等.以下是一些常用的 JVM 配置参数: 1. 堆内存相关参数 -Xms:设置 JVM 初始堆内存大 ...

  5. 安装MVN出现 Error: JAVA_HOME is set to an invalid directory.的解决方法

    出现 Error: JAVA_HOME is set to an invalid directory.的解决方法 解决: 将JAVA_HOME = "D:/Java/jdk1.6.0_12/ ...

  6. Sentinel——控制台使用

    简介 官网:https://sentinelguard.io/ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 是面向分布式.多语言异构化服务架构的流量治理组件,主要以流量为 ...

  7. 【工具】Vscode插件推荐(不用谷歌api、支持短句英汉互译、支持查词、支持自动补全、不需要浏览器)

    需求: 1)偶尔需要查英文生词: 2)有时候想不起来中文对应的英文: 3)不想回到浏览器打开一堆网页: 4)谷歌翻译挂了. 偶尔需要的需求: 1)短句翻译. 因为谷歌翻译挂了,首先,排除最热门的翻译插 ...

  8. 【记录】PR使用技巧记录

    @ 目录 [PR最重要的两个操作] 一.关键帧 1. 如何设置关键帧? 2. 应用实例 1)1s内视频从明变暗 2)1s内视频画面由大到小 二.入点.出点 [其他] PR批量调整视频效果 PR剪视频片 ...

  9. 操作系统综合题之“用记录型信号量机制的wait操作和signal操作写出三个进程的同步代码(水果进箱问题-代码补充)”

    1.问题:假设一个水果赛选系统由三个进程A.B.C组成.进程A每次取一个水果,之后存放在货架F上,F的容量为每次只能存放一个水果.若货架上存放的是苹果则让进程B取出,并存放到苹果箱中:若货架上存放的是 ...

  10. TensorFlow 基础 (02)

    前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, ...