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;
  • 相关阅读:
    poj3669 广搜
    检索所有课程都选修的的学生的学号与姓名
    UVA10160 Servicing Stations
    uva11205 The broken pedometer 子集生成
    poj1101 the game 广搜
    poj3009 Curling 2.0 深搜
    poj 1564 Sum It Up 搜索
    HDU 2268 How To Use The Car (数学题)
    codeforces 467C George and Job(简单dp,看了题解抄一遍)
    HDU 2267 How Many People Can Survive(广搜,简单)
  • 原文地址:https://www.cnblogs.com/qurui1998/p/10828401.html
Copyright © 2011-2022 走看看