一、自定义函数

格式:

create or replace function 函数名(参数名 参数类型...)

return  返回值类型

as

xx vachar2(20)                 --申明变量

begin                                --开始

--编写逻辑位置

return xxxx

end  函数名;                                --结束

例1:将名为WARD员工的工资和所有的员工的工资进行比较。

  --自定义函数
create or replace function fn_emp_sal(asal in number,bname in varchar2)
return varchar2 --返回值
as
--申明变量
vreturn varchar2(20);
vsal emp.sal%type; --vsal的数据类型与sal的数据类型一样
begin
--写逻辑的位置
--将查询出的sal赋值给vsal
select sal into vsal from emp where ename=bname;
if asal>vsal then
vreturn:='工资比'||bname||'高'||(asal-vsal);
elsif asal<vsal then
vreturn:='工资比'||bname||'低'||(vsal-asal);
else
vreturn:='工资一样';
end if;
return vreturn;
end fn_emp_sal; --结束 函数名,注意要加;

之后编译成功则显示:

进行查询:

 select ename,sal,fn_emp_sal(sal,'WARD')from emp;

执行结果:

二、匿名语句块 

格式:

declare

--声明变量

xx varchar2(20);

begin--开始

---编写逻辑位置

end;--结束

例1:工资小于3000的员工提薪3000。

  --匿名语句块
declare
--声明变量
vsal number;
vename varchar2(20);
begin
vename:='SMITH'; --静态写入
--若想从控制台动态输入数据,则改成 vename:=&ename;
--输入:'SMITH'
select sal into vsal from emp where ename=vename;
if vsal<3000 then
update emp set sal=3000 where ename=vename;
end if;
end;

执行结果:

800->3000:

如将更新的数据添加文本中,可以再新建一个日志表和序列,增加一个触发器去记录更新的数据。

(1)增加一个日志表为t_logs:

(2)增加一个序列为log_seq:

(3)为表t_logs增加一个触发器log_xx,创建(序列中的主键):

(4)在上一段代码的第12行添加:

  insert into t_logs(txt) values(vename||'工资增加了'||(3000-vsal));

(5)执行结果:

例2:对收入低于1600 发奖金300  1600-2500发奖金200 2500-5000发奖金100。

 declare
vename varchar2(20);
vsal_comm emp.sal%type;
vcomm emp.comm%type;
vmsg varchar2(20);
vrow emp%rowtype;---行变量 相当于Java的Object
begin
vename:='SMITH';
select * into vrow from emp where ename=vename; --奖金
if vrow.comm is null then
vcomm:=0;
else
vcomm:=vrow.comm;
end if; --收入
vsal_comm:=vrow.sal+vcomm; if vsal_comm<1600 then
vmsg:='发奖金300';
elsif vsal_comm>1600 and vsal_comm<2500 then
vmsg:='发奖金200';
elsif vsal_comm>2500 and vsal_comm<5000 then
vmsg:='发奖金100';
else
vmsg:='不发';
end if;
DBMS_OUTPUT.PUT_LINE(vename||'过节费'||vmsg); --控制台输出
end;

点击查看->DBMS输出->点击+,连接该数据库,则会显示:

三、循环

1、loop 循环
例:循环输出1-10,相当于do...while

 declare
i number(2):=1;
begin
loop
exit when i>10; ---循环结束条件
DBMS_OUTPUT.PUT_LINE(i); --控制台输出
i:=i+1;
end loop;
end;

2、 while loop 循环

例:循环输出1-7,相当于while。

 declare
i number(2):=1;
begin
while i<7 loop
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
end loop;
end;

应用:例如插入1000条数据。

---恢复内容结束---

一、自定义函数

格式:

create or replace function 函数名(参数名 参数类型...)

return  返回值类型

as

xx vachar2(20)                 --申明变量

begin                                --开始

--编写逻辑位置

return xxxx

end  函数名;                                --结束

例1:将名为WARD员工的工资和所有的员工的工资进行比较。

  --自定义函数
create or replace function fn_emp_sal(asal in number,bname in varchar2)
return varchar2 --返回值
as
--申明变量
vreturn varchar2(20);
vsal emp.sal%type; --vsal的数据类型与sal的数据类型一样
begin
--写逻辑的位置
--将查询出的sal赋值给vsal
select sal into vsal from emp where ename=bname;
if asal>vsal then
vreturn:='工资比'||bname||'高'||(asal-vsal);
elsif asal<vsal then
vreturn:='工资比'||bname||'低'||(vsal-asal);
else
vreturn:='工资一样';
end if;
return vreturn;
end fn_emp_sal; --结束 函数名,注意要加;

之后编译成功则显示:

进行查询:

 select ename,sal,fn_emp_sal(sal,'WARD')from emp;

执行结果:

二、匿名语句块 

格式:

declare

--声明变量

xx varchar2(20);

begin--开始

---编写逻辑位置

end;--结束

例1:工资小于3000的员工提薪3000。

  --匿名语句块
declare
--声明变量
vsal number;
vename varchar2(20);
begin
vename:='SMITH'; --静态写入
--若想从控制台动态输入数据,则改成 vename:=&ename;
--输入:'SMITH'
select sal into vsal from emp where ename=vename;
if vsal<3000 then
update emp set sal=3000 where ename=vename;
end if;
end;

执行结果:

800->3000:

如将更新的数据添加文本中,可以再新建一个日志表和序列,增加一个触发器去记录更新的数据。

(1)增加一个日志表为t_logs:

(2)增加一个序列为log_seq:

(3)为表t_logs增加一个触发器log_xx,创建(序列中的主键):

(4)在上一段代码的第12行添加:

  insert into t_logs(txt) values(vename||'工资增加了'||(3000-vsal));

(5)执行结果:

例2:对收入低于1600 发奖金300  1600-2500发奖金200 2500-5000发奖金100。

 declare
vename varchar2(20);
vsal_comm emp.sal%type;
vcomm emp.comm%type;
vmsg varchar2(20);
vrow emp%rowtype;---行变量 相当于Java的Object
begin
vename:='SMITH';
select * into vrow from emp where ename=vename; --奖金
if vrow.comm is null then
vcomm:=0;
else
vcomm:=vrow.comm;
end if; --收入
vsal_comm:=vrow.sal+vcomm; if vsal_comm<1600 then
vmsg:='发奖金300';
elsif vsal_comm>1600 and vsal_comm<2500 then
vmsg:='发奖金200';
elsif vsal_comm>2500 and vsal_comm<5000 then
vmsg:='发奖金100';
else
vmsg:='不发';
end if;
DBMS_OUTPUT.PUT_LINE(vename||'过节费'||vmsg); --控制台输出
end;

点击查看->DBMS输出->点击+,连接该数据库,则会显示:

三、循环

1、loop 循环
例:循环输出1-10,相当于do...while

 declare
i number(2):=1;
begin
loop
exit when i>10; ---循环结束条件
DBMS_OUTPUT.PUT_LINE(i); --控制台输出
i:=i+1;
end loop;
end;

2、 while loop 循环

例:循环输出1-7,相当于while。

 declare
i number(2):=1;
begin
while i<7 loop
DBMS_OUTPUT.PUT_LINE(i);
i:=i+1;
end loop;
end;

应用:例如插入1000条数据。

 declare
i number(4):=1;
begin
while i<1000 loop
insert into emp(enmae) values('老王'||i);
i:=i+1;
end loop;
end;

3、for in 循环

已知循环次数的循环控制语句。

 declare
begin
for i in 40..50 loop
DMBS_OUTPUT.PUT_LINE(i);
--for in 语句自动给i+1,故这里是个空操作,加不加null都可。
end loop;
end;

Oracle PL/SQL语言函数、匿名语句及循环的更多相关文章

  1. Oracle PL/SQL 语言(Procedural Language/SQL)

    Oracle PL/SQL 语言(Procedural Language/SQL)是结合了结构化查询与 Oracle 自身过程控制为一体的强大语言,PL/SQL 不但支持更多的数据类型,拥有自身的变量 ...

  2. oracle pl/sql split函数

    在软件开发过程中程序员经常会遇到字符串的拼接和拆分工作. 以java开发为例: 前台传入字符串拼接形式的一个JSON数据,如:"1001,1002,1003",这可能代表了一组序号 ...

  3. oracle 学习(三)pl/sql语言函数

    系统内置函数 数学运算函数 字符串函数 统计函数 日期函数 用户定义函数:存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样 参数模式 IN模式:表示该参数时输入给函数的参数 OU ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  6. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  7. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  8. Oracle PL/SQL 游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  9. Oracle PL/SQL语句基础学习笔记(上)

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL ...

随机推荐

  1. P4008 [NOI2003]文本编辑器

    思路 FHQ Treap的板子 用FHQ Treap维护中序遍历序列即可 然后数组开够! 代码 #include <cstdio> #include <cstring> #in ...

  2. 题解——洛谷P1550 [USACO08OCT]打井Watering Hole(最小生成树,建图)

    题面 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pas ...

  3. HDU 4104 Discount(n个数不能构成的最小值)

    http://acm.hdu.edu.cn/showproblem.php?pid=4104 题意:给出n个数,每个数最多只能用一次,每次可以选任意个数相加,求不能相加得到的最小值是多少. 思路: 先 ...

  4. Win10远程桌面可能是由于CredSSP加密Oracle修正

    win10更新1083之后,远程桌面就会连接失败,显示如下: 根据微软官方的说法是更改了安全策略: https://support.microsoft.com/zh-cn/help/4093492/c ...

  5. Android CPU耗电量测试

    Android CPU耗电量测试 在测试Android app时,不仅仅要关注app的功能,也好关注app的性能指标,cpu.内存.流量.电量等.简单介绍下电量测试中的cpu耗电. 影响耗电的因素 C ...

  6. Django与缓存

    我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程: 接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> ...

  7. 使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...

  8. 虹软人脸识别Android Sample Code

    AFR_FSDKInterface engine = new AFR_FSDKEngine(); //用来存放提取到的人脸信息, face_1 是注册的人脸,face_2 是要识别的人脸 AFR_FS ...

  9. 【java】Comparator的用法

    文章转载自: http://blog.csdn.net/u012250875/article/details/55126531 1.为什么写? comparator 是javase中的接口,位于jav ...

  10. 安装Linux系统的磁盘分区

    ●CentOS磁盘分区 分区顺序: "/"分区(逻辑) -> "/boot"分区(主分区) -> "swap"分区(逻辑) -& ...