一、自定义函数

格式:

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. Java二进制指令

    转自: http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html 指令从0x00-0xc9 没有0xba 常量入栈指令 指令码 操作码 ...

  2. 分布式爬虫scrapy-redis中settings.py中的配置信息

    SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使用scrapy-redis的调度器 ITEM_PIPELINES = { 'sc ...

  3. Vue学习五:v-for指令使用方法

    本文为博主原创,未经允许不得转载: <!DOCTYPE html> <html lang="zh"> <head> <meta http- ...

  4. hdu 3864 D_num Pollard_rho算法和Miller_Rabin算法

    D_num Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem De ...

  5. Tomat和JDK安装配置

    昨天重装了一下系统,升级成了win10,原先配置好的jdk和tomcat信息都没有了,所以重新配置一下,做一个小记录 首先去官网下载java JDK和Tomcat,这个不提了,下载之后安装,安装完毕后 ...

  6. /usr/bin/perl:bad interpreter:No such file or directory 的解决办法

    yum -y install gcc gcc-c++ perl make kernel-headers kernel-devel 可能会提示:Cannot find a valid baseurl f ...

  7. ssh连接服务器

    1.命令行操作 第一步输入  :ssh 用户名@服务器外网ip 第二步:输入密码,回车 看到welcome提示信息即为登陆成功 输入:exit 退出 2.客户端操作 windows下载ssh软件,安装 ...

  8. Python 模块(module)

    模块(module)也是为了同样的目的.在Python中,一个.py文件就构成一个模块.通过模块,你可以调用其它文件中的程序. first.py def laugh(): print "Ha ...

  9. art-template实战

    内容div <div id="sku-cont"> <div class="form-group col-lg-12"> <div ...

  10. JavaSE习题 第八章 线程

    问答题 1.线程和进程是什么关系? 进程是程序的一次动态执行,对应了从代码加载,执行至执行完毕的一个完整的过程 线程是比进程更小的执行单位,一个进程在其执行过程中可以产生多个线程,形成多条执行线索 2 ...