zoukankan      html  css  js  c++  java
  • pl/sql

    pl/sql是什么sql是结构化查询语言。sql是不是一个编程语言?
    编程语言一般都能够声明变量,写条件判断,循环。sql不具备这些特征,所有sql不是一门编程语言。我们在实际的开发中,有这种需要,把sql语句和编程语言的特性结合起来。
    oracle 就提供了pl/sql这种语言来解决这种问题。
    使用pl/sql有什么优点:
    可以提高程序的运行效率,因为能够减少数据库的访问次数可以对复杂的业务逻辑进行封装pl/sql具有编程语言的特性,
    可以写if else 实现复杂的业务
    pl/sql块
    pl/sql是用块来管理内部程序的。pl/sql块分匿名块和命名块。
    匿名块 没有名字块就是匿名块 匿名块不会保存到数据库中,执行完就没有了。类似于java的main方法。
    命名块 有名字的块就是命名块。命名块 过程 函数 游标 触发器 都是命名块。
    本次课程我们讲匿名块。
    需求:根据员工编号,打印员工的姓名
    pl
    /sql匿名块的结构: declare --变量声明部分 begin -- 业务逻辑处理部分 exception -- 异常处理部分 end;

    注意:
    1,pl/sql块 变量名,关键字不区分大小写。 2,变量声明部分是可选的。业务逻辑处理部分是必须的。异常处理部分是可选的。 3,end后面必须加; declare begin exception 后面都不要加; 一般写匿名块都是先写结构,再往结构里面填代码。 变量和常量 声明变量 : 变量名 变量类型; 变量名一般建议以v_开头. 声明常量要加上constant关键字: 常量名 constant 常量类型;
    declare
    -- 变量声明部分 v_ename varchar2(100); begin -- 业务逻辑执行部分 select ename into v_ename from emp where empno=&请输入员工编号; -- 把员工姓名打印到控制台 dbms_output.put_line('员工姓名:'||v_ename); exception -- 异常处理部分 when no_data_found then dbms_output.put_line('您输入的员工编号不存在'); end;
    变量和常量声明变量 :变量名 变量类型;变量名一般建议以v_开头.
    声明常量要加上constant关键字:常量名 constant 常量类型;
    类型名 说明varchar 定长字符串
    varchar2 变长字符串
    number(m,n) 数字类型
    date 日期类型
    timestamp 时间戳类型
    举例:用户输入圆的半径,计算圆的面
    给变量赋值可以使用into关键字变量类型基本类型


    declare
    -- 声明PI常量
    V_PI constant number(8,2):=3.14;
    --声明圆的面积的变量
    v_area number(8,2);
    --声明半径变量
    v_r number(8,2):=&no;begin
    -- 计算圆的面积
    v_area:=V_PI*v_r*v_r;
    -- 打印结果
    dbms_output.put_line('圆的面积是:'||v_area)en
    %type类型(列类型)
    %type类型指的是声明变量的时候,该变量参考某个表的某个列的类型。
    declare
    -- 变量声明部分 v_ename 类型参考emp表的ename的类型
    v_ename emp.ename%type;
    v_sal emp.sal%type;
    begin
    -- 业务逻辑执行部分
    select ename,sal into v_ename,v_sal from emp where empno=&请输入员工编号;
    -- 把员工姓名打印到控制台
    dbms_output.put_line('员工姓名:'||v_ename||',基本工资:'||v_sal);
    exception
    -- 异常处理部分
    when no_data_found thendbms_output.put_line('您输入的员工编号不存在');
    end;
    %rowtype(行类型)%rowtype参数某个表的类型。%rowtype中可以存储多个数据,具体可存多少个和表的字段数一样。
    举例:输入员工编号,打印员工的姓名,薪水,奖金,雇佣日期。
    declare
    -- 声明行类型变量
    v_emp emp%rowtype;
    begin
    -- 业务逻辑执行部分
    select * into v_emp from emp where empno=&请输入员工编号;
    -- 把员工姓名打印到控制台
    dbms_output.put_line('员工姓名:'||v_emp.ename||',基本工资:'||v_emp.sal||',奖金:'||v_emp.comm||'雇佣日期:'||v_emp.hiredate);
    exception
    -- 异常处理部分when no_data_found thendbms_output.put_line('您输入的员工编号不存在');
    end;
     record类型(记录类型)
    record可以理解为可以自定义的行类型。record类型在使用之前必须声明该类型。 举例:输入员工编号,打印员工的姓名,基本工资,总工资。 declare
    -- 声明record类型 type emp_record_type is record(ename emp.ename%type,sal emp.sal%type,total emp.sal%type); -- 声明record类型的变量 v_emp emp_record_type;begin -- 查询数据,给变量赋值 select ename,sal,sal+nvl(comm,0) into v_emp from emp where empno=&no; -- 输入record类型变量中的数据 dbms_output.put_line('员工姓名:'||v_emp.ename||',基本工资:'||v_emp.sal||',总工资:'||v_emp.total);en
    table类型 (表类型)
    无论是行类型还是记录类型只能存储一行数据,如果要存储多行数据,需要用到table明类型,再声明该类型的变量。 举例:根据员工编号查询员工的信息,存储到table类型的变量中,再输出出来。declare
    -- 声明table类型 is table of 后可以跟行类型,也可以是记录类型 type emp_table_type is table of emp%rowtype -- 指定下标的增长方式为整数,每次增长 index by binary_integer; -- 声明table类型的变量 v_emp emp_table_type; begin -- 把编号为7369的员工的信息存储到table类型变量中 select * into v_emp(1) from emp where empno=7369; -- 把编号为7499的员工的信息存储到table类型变量中 select * into v_emp(2) from emp where empno=7499; --数据table类型变量中的数据 dbms_output.put_line('员工姓名:'||v_emp(1).ename||',基本工资:'||v_emp(1).sal);dbms_output.put_line('员工姓名:'||v_emp(2).ename||',基本工资:'||v_emp(2).sal);en
    条件判断if /else语法:
    if 条件表达式 then语句块;
    if 条件表达式 then语句块end if;
    elsif 条件表达式 then语句块;
    ...else语句块;
    end if;
    举例:输入一个员工编号,给该员工涨奖金。策略是这样的:如果原来员工没有奖金,则把基本工资的百分之10作为奖金,如果原来员工的奖金低于1000,把奖金提升到1000,其他情况奖金提升百分之10.
    declare
    -- 声明奖金的变量
    v_comm emp.comm%type;begin
    -- 查询出员工的奖金
    select comm into v_comm from emp where empno=&no;
    -- 判断如果员工没有奖金,把基本工资的百分之10作为奖金
    if v_comm is null thenupdate emp set comm=sal*0.1 where empno=&no;
    --如果原先奖金低于1000,提升到1000
    elsif v_comm<1000 thenupdate emp set comm=1000 where empno=&no;
    -- 其他情况把奖金提升百分之10
    elseupdate emp set comm=comm*1.1 where empno=&no;end i
    case when
    case when 和java中switch语句比较像。
    java中switch:
    switch(变量名){case 变量值1 :语句块; break;case 变量值2 :语句块; break;
    .....default:语句块;}
    
    case when 语法:case 变量名when 变量值1 then语句块;
    when 变量值2 then语句块;
    ........else:语句块;
    end case;
    
    
    举例:根据用户输入的部门编号,输出不同的部门名称,要求使用case when实现,不查询dept表
    declare
    -- 声明部门编号的变量
    v_deptno emp.deptno%type:=&no;
    begincase v_deptnowhen 10 thendbms_output.put_line('技术部');
    when 20 thendbms_output.put_line('销售部');
    when 30 thendbms_output.put_line('公关部');
    when 40 thendbms_output.put_line('开发部');
    -- 其他情况if else 都能把case when 替代。
    case when 也可以替代if else.
    语法:casewhen 条件表达式1 then语句块;
    when 条件表达式2 then语句块;
    ....else语句块;
    end case;
    
    举例:
    elsedbms_output.put_line('您要查找的部门不存在');
     end case;
    end;declare
    -- 声明奖金的变量
    v_comm emp.comm%type;
    begin
    -- 查询出员工的奖金
    select comm into v_comm from emp where empno=&no;
    -- 判断如果员工没有奖金,把基本工资的百分之10作为奖金
    casewhen v_comm is null thenupdate emp set comm=sal*0.1 where empno=&no;
    --如果原先奖金低于1000,提升到1000
    when v_comm<1000 thenupdate emp set comm=1000 where empno=&no;
    -- 其他情况把奖金提升百分之10
    elseupdate emp set comm=comm*1.1 where empno=&no;end case;
    end;
  • 相关阅读:
    Html5 Input 类型
    Html5 部分特性
    Asp.net Mvc4 基于Authorize实现的模块访问权限
    第11天知识点总结
    C# string类型和byte[]类型相互转换
    C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法
    Socket 学习
    C#中的Dictionary字典类介绍
    js判断客户端是pc还是手机
    input type="file" accept="image/*"上传文件慢的问题解决办法
  • 原文地址:https://www.cnblogs.com/qurui1998/p/10828401.html
Copyright © 2011-2022 走看看