zoukankan      html  css  js  c++  java
  • Oracle PL/SQL语言函数、匿名语句及循环

    一、自定义函数

    格式:

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

        return  返回值类型

        as 

                      xx vachar2(20)                 --申明变量

                      begin                                --开始

                      --编写逻辑位置

        return xxxx

        end  函数名;                                --结束

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

     1  --自定义函数
     2  create or replace function fn_emp_sal(asal in number,bname in varchar2)
     3  return varchar2 --返回值
     4  as                
     5           --申明变量
     6           vreturn varchar2(20);
     7           vsal emp.sal%type;    --vsal的数据类型与sal的数据类型一样
     8           begin
     9           --写逻辑的位置
    10           --将查询出的sal赋值给vsal
    11           select sal into vsal from emp where ename=bname;
    12           if asal>vsal then
    13              vreturn:='工资比'||bname||''||(asal-vsal);
    14           elsif asal<vsal then
    15              vreturn:='工资比'||bname||''||(vsal-asal);
    16           else
    17              vreturn:='工资一样';
    18           end if;
    19  return vreturn;
    20  end  fn_emp_sal;              --结束 函数名,注意要加;

    之后编译成功则显示:

    进行查询:

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

     执行结果:

    二、匿名语句块 

          格式:

    declare 

    --声明变量

    xx varchar2(20);

    begin--开始

    ---编写逻辑位置

    end;--结束

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

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

     执行结果:

     800->3000:

            

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

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

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

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

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

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

    (5)执行结果:

     

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

     1 declare
     2     vename varchar2(20);
     3     vsal_comm emp.sal%type;
     4     vcomm emp.comm%type;
     5     vmsg varchar2(20);
     6     vrow emp%rowtype;---行变量 相当于Java的Object
     7   begin
     8     vename:='SMITH';
     9     select * into vrow from emp where ename=vename;
    10     
    11     --奖金
    12     if vrow.comm is null then
    13     vcomm:=0;
    14     else
    15     vcomm:=vrow.comm;
    16     end if;
    17     
    18     --收入
    19     vsal_comm:=vrow.sal+vcomm;
    20     
    21     if vsal_comm<1600 then
    22       vmsg:='发奖金300';
    23     elsif vsal_comm>1600 and vsal_comm<2500 then
    24       vmsg:='发奖金200';
    25     elsif vsal_comm>2500 and vsal_comm<5000 then
    26       vmsg:='发奖金100';
    27     else
    28       vmsg:='不发';
    29     end if;
    30        DBMS_OUTPUT.PUT_LINE(vename||'过节费'||vmsg); --控制台输出
    31 end;

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

     

    三、循环

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

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

    2、 while loop 循环

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

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

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

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

    一、自定义函数

    格式:

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

        return  返回值类型

        as 

                      xx vachar2(20)                 --申明变量

                      begin                                --开始

                      --编写逻辑位置

        return xxxx

        end  函数名;                                --结束

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

     1  --自定义函数
     2  create or replace function fn_emp_sal(asal in number,bname in varchar2)
     3  return varchar2 --返回值
     4  as                
     5           --申明变量
     6           vreturn varchar2(20);
     7           vsal emp.sal%type;    --vsal的数据类型与sal的数据类型一样
     8           begin
     9           --写逻辑的位置
    10           --将查询出的sal赋值给vsal
    11           select sal into vsal from emp where ename=bname;
    12           if asal>vsal then
    13              vreturn:='工资比'||bname||''||(asal-vsal);
    14           elsif asal<vsal then
    15              vreturn:='工资比'||bname||''||(vsal-asal);
    16           else
    17              vreturn:='工资一样';
    18           end if;
    19  return vreturn;
    20  end  fn_emp_sal;              --结束 函数名,注意要加;

    之后编译成功则显示:

    进行查询:

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

     执行结果:

    二、匿名语句块 

          格式:

    declare 

    --声明变量

    xx varchar2(20);

    begin--开始

    ---编写逻辑位置

    end;--结束

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

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

     执行结果:

     800->3000:

            

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

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

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

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

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

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

    (5)执行结果:

     

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

     1 declare
     2     vename varchar2(20);
     3     vsal_comm emp.sal%type;
     4     vcomm emp.comm%type;
     5     vmsg varchar2(20);
     6     vrow emp%rowtype;---行变量 相当于Java的Object
     7   begin
     8     vename:='SMITH';
     9     select * into vrow from emp where ename=vename;
    10     
    11     --奖金
    12     if vrow.comm is null then
    13     vcomm:=0;
    14     else
    15     vcomm:=vrow.comm;
    16     end if;
    17     
    18     --收入
    19     vsal_comm:=vrow.sal+vcomm;
    20     
    21     if vsal_comm<1600 then
    22       vmsg:='发奖金300';
    23     elsif vsal_comm>1600 and vsal_comm<2500 then
    24       vmsg:='发奖金200';
    25     elsif vsal_comm>2500 and vsal_comm<5000 then
    26       vmsg:='发奖金100';
    27     else
    28       vmsg:='不发';
    29     end if;
    30        DBMS_OUTPUT.PUT_LINE(vename||'过节费'||vmsg); --控制台输出
    31 end;

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

     

    三、循环

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

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

    2、 while loop 循环

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

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

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

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

    3、for in 循环

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

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

      

  • 相关阅读:
    Aitit 认证体系之道 attilax著艾龙著 1. 认证体系分类 2 1.1. 按照语言来分 java net php 2 1.2. 按照平台来分 web cs 桌面 2 1.3. 综合性认证
    Atitit 数据库与存储引擎设计与实现 attilax总结 1.1. 数据库的实现有很多种, 遵循一些理论规范,如 Fix Rules、WriteAhead Log、Forcelogat
    Atitit 物联网之道 艾龙著 attilax著 1. 理论基础(控制理论 信息理论) 2 2. 1.5 物联网的关键技术12 2 2.1. 1.5.1 网络与通信技术12 1.5.2 无线传感
    Atitit 项目源码管理 attilax著 1. 源码结构sdk目录结构 1 1.1. 源码分类,配置文件,主程序文件,sql文件 1 2. 源码管理,提交,更新,与同步 1 2.1. 源码同步
    Atitit cio之道 attilax著 2. CIO是企业组织很重要的一个官员,未来就靠信息取胜了 1 3. Cio职责 2 3.1. 企业信息化 对信息技术的利用来实现组织攻略目标 2 3
    Aitit aop之道 艾龙著 需要整合zop资料包东西 第1章 AOP的产生         1.1 软件开发方法的演进         1.2 AOP产生的前奏——把系统看做一批关注点
    Atitit 运维之道 1.1.devops算是最低门槛了。什么运维平台,搞来搞去也就那些东西。无外乎cmdb、部署、监控之类的,再加点各种小平台自动化需求。 CMDB Configurati
    Atitit. Attilax软件研发and开发之道 1. 基本语言 3 2. 标准化库api 3 3. Ied与代码编写 调试 3 4. ui 3 5. 通讯 3 6. 第三方库 3 7. 数据
    Atitit sql之道 艾龙著 attilax 1. Ddl dml 3 2. Crud 3 3. 高级sql 3 3.1. Merge 3 3.2. 数据库翻页 limit offset系列
    Atitit 最近十年来until2018软件开发领域的趋势 艾龙总结 attilax大盘点总结历史与趋势 1. Keyword sec title 2 2. 语言本身: 2 2.1. 工业标准 2
  • 原文地址:https://www.cnblogs.com/echola/p/9541041.html
Copyright © 2011-2022 走看看