一、自定义函数

格式:

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. (转) Let’s make an A3C: Theory

    本文转自:https://jaromiru.com/2017/02/16/lets-make-an-a3c-theory/ Let’s make an A3C: Theory February 16, ...

  2. Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'zoneId' in 'class java.lang.String'

    本文为博主原创,未经允许不得而转载: 异常展示: dao层定义的接口为: public int getClientTotal(); 在mybatis中的sql为: <select id=&quo ...

  3. HDU 3400 Line belt (三分套三分)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3400 题意: 有两条带子ab和cd,在ab上的速度为p,在cd上的速度为q,在其它地方的速度为r.现 ...

  4. vue中click阻止事件冒泡,防止触发另一个事件

    在使用el-upload组件时,在其中放置了一个删除按钮的图片. 当点击图片,本想只删除上传的视频,但是意外触发了el-upload中的事件 解决办法:用stop,结果只删除当前预览,不触发上传事件. ...

  5. C++类模板和模板类

    C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...

  6. Intellij idea 2017 图标含义

    File Type Icon Recognized in ActionScript files ActionScript files Ultimate Edition Active Server Pa ...

  7. Spring中JdbcTemplate使用RowMapper

    package com.cxl.demo.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util. ...

  8. Could not find com.android.tools.build:aapt2:3.2.1-4818971.

    Could not find com.android.tools.build:aapt2:-. Searched in the following locations: file:/H:/Androi ...

  9. UnicodeEncodeError: 'gbk' codec can't encode character '\u25aa' in position 15: illegal multibyte sequence

    UnicodeEncodeError: 'gbk' codec can't encode character '\u25aa' in position 15: illegal multibyte se ...

  10. Redis 图形化监控方案 RedisLive

    一款开源的 Redis 图形化监控工具,界面如图所示 安装 首先安装python2 一般情况下系统自带 然后安装pip2 https://www.cnblogs.com/sea-stream/p/10 ...