Oracle PL/SQL语言函数、匿名语句及循环
一、自定义函数
格式:
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语言函数、匿名语句及循环的更多相关文章
- Oracle PL/SQL 语言(Procedural Language/SQL)
Oracle PL/SQL 语言(Procedural Language/SQL)是结合了结构化查询与 Oracle 自身过程控制为一体的强大语言,PL/SQL 不但支持更多的数据类型,拥有自身的变量 ...
- oracle pl/sql split函数
在软件开发过程中程序员经常会遇到字符串的拼接和拆分工作. 以java开发为例: 前台传入字符串拼接形式的一个JSON数据,如:"1001,1002,1003",这可能代表了一组序号 ...
- oracle 学习(三)pl/sql语言函数
系统内置函数 数学运算函数 字符串函数 统计函数 日期函数 用户定义函数:存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样 参数模式 IN模式:表示该参数时输入给函数的参数 OU ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- ORACLE PL/SQL编程详解(转)
原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...
- oracle pl/sql 程序设计 历史笔记整理
20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
- Oracle PL/SQL 游标
在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...
- Oracle PL/SQL语句基础学习笔记(上)
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL ...
随机推荐
- P4008 [NOI2003]文本编辑器
思路 FHQ Treap的板子 用FHQ Treap维护中序遍历序列即可 然后数组开够! 代码 #include <cstdio> #include <cstring> #in ...
- 题解——洛谷P1550 [USACO08OCT]打井Watering Hole(最小生成树,建图)
题面 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pas ...
- HDU 4104 Discount(n个数不能构成的最小值)
http://acm.hdu.edu.cn/showproblem.php?pid=4104 题意:给出n个数,每个数最多只能用一次,每次可以选任意个数相加,求不能相加得到的最小值是多少. 思路: 先 ...
- Win10远程桌面可能是由于CredSSP加密Oracle修正
win10更新1083之后,远程桌面就会连接失败,显示如下: 根据微软官方的说法是更改了安全策略: https://support.microsoft.com/zh-cn/help/4093492/c ...
- Android CPU耗电量测试
Android CPU耗电量测试 在测试Android app时,不仅仅要关注app的功能,也好关注app的性能指标,cpu.内存.流量.电量等.简单介绍下电量测试中的cpu耗电. 影响耗电的因素 C ...
- Django与缓存
我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程: 接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> ...
- 使用JDBC从数据库中查询数据的方法
* ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回 ...
- 虹软人脸识别Android Sample Code
AFR_FSDKInterface engine = new AFR_FSDKEngine(); //用来存放提取到的人脸信息, face_1 是注册的人脸,face_2 是要识别的人脸 AFR_FS ...
- 【java】Comparator的用法
文章转载自: http://blog.csdn.net/u012250875/article/details/55126531 1.为什么写? comparator 是javase中的接口,位于jav ...
- 安装Linux系统的磁盘分区
●CentOS磁盘分区 分区顺序: "/"分区(逻辑) -> "/boot"分区(主分区) -> "swap"分区(逻辑) -& ...