zoukankan      html  css  js  c++  java
  • 基于oracle 的PL/SQL编程 -变量使用

    1. 需要开启的服务:  本机安装的oracle ,默认是开机启动服务的,开机时间太慢,关闭了,需要手动打开:

    OracleDBConsoleorcl

    OracleOraDb10g_home1iSQL*Plus

    OracleOraDb10g_home1TNSListener

    OracleServiceORCL   这个后面的ORCL就是数据库名字,官方术语叫做数据库sid

    2.打开PL/SQL工具,用户名scott 登陆sid为ORCL的数据库, 密码 tiger

     3.打开一个测试窗口,如下

    -- Created on 2018/6/3 by ADMINISTRATOR
    declare
      -- 声明本地变量的地方,包括游标(结果集类型变量),如果没有,declare可以去掉
      --相当于java的 public class A{}
      i integer;
    begin
      -- 执行部分
      --相当于Java的public static void main(String[] args)
      --异常处理
    end;

    4.打印helloworld

     结果如下:

    dbms_output是oracle的程序包,put_line()是调用的方法

    在命令行中打印:需要先设置 set serveroutput on ,才会将打印语句打印出来,否则只执行不打印。

     

    5. PLSQL变量的使用:

    PLSQL中的变量分两种:

    (1)普通数据类型:char varchar2 date number(整数和小数) boolean long

    (2)特殊变量类型(引用变量、记录型变量)

    变量的声明方式为:变量名 变量类型(变量长度) ,例如:v_name varchar2(20)

    变量赋值:

      (1)声明时使用 := 直接赋值:v_name varchar2(20) := ‘zhangsan’        只写=,则是进行比较

      (2)语句赋值: select  值  into 变量名 

     5.1 普通变量的使用

    -- 声明一个人的信息 姓名 薪水 地址
    declare
      -- 姓名 不能使用name,这是保留字
      v_name varchar2(50) := '张三';
      -- 薪水   小数:number(总长度(小数加整数的位数),小数位数) v_sal number(6,2) --1000.00
      v_sal number;
      --地址
      v_addr varchar2(200);
    begin
      --直接赋值
      v_sal := 15000;
      --语句赋值
      select '上海市南京路' into v_addr from dual; --实际工作中应该是from 某个表
      -- 打印变量  || 是拼接符,相当于java 的+
      dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal || ',地址:' || v_addr);
    end;

    执行结果:

    5.2 引用变量的使用

    引用变量:变量的类型和长度取决于表中字段的类型和长度(变量的类型和长度引用表中字段的类型和长度),通过  表名.列名%TYPE 指定变量的类型和长度,例如 v_name emp.ename%TYPE

    引用型变量的好处:使用普通变量定义方式,需要知道表中列的类型,而使用引用类型不需要考虑列的类型,使用%TYPE是非常号的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。

    -- 查询emp表中7839号员工的个人信息,打印姓名和薪水
    declare
      -- 姓名 定义的是引用变量
      v_ename emp.ename%TYPE;
      -- 薪水
      v_sal emp.sal%TYPE;
    
    begin
      --查询姓名和薪水并赋值给变量,。使用select into 语句赋值
      select ename, sal into v_ename, v_sal from emp where empno = 7839;
      dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
    
    end;

    结果:

    5.3 记录型变量

    记录型变量 默认接接收 表中的一行数据,不能指定字段,相当于java中的一个对象。

    语法: 变量名称 表名%ROWTYPE 例如 v_emp emp%rowtype;   通过 变量名.字段名 的方式获取变量中的值

    --记录型变量示例:用该变量接收表中一行sql的信息
    declare
      -- 记录型变量
      v_emp emp%ROWTYPE;
    
    begin
      --查询所有字段并赋值给变量,字段名用v_emp.字段名 表示
      select * into v_emp from emp where empno = 7839;
      dbms_output.put_line('姓名:' || v_emp.ename || ',薪水:' || v_emp.sal);
    
    end;

    结果:

    6.流程控制:

    6.1  条件分支,语法:

    BEGIN

       IF 条件1 then  执行1;

         Elsif 条件2 then 执行2 ;   --注意不是 elseif  ,是elsif

         Else  执行3

             End if;

    END

    -- 判断emp表中记录是否超过20条,10-20 之间,或者10条以下
    declare
      --声明变量接收emp表中记录数
      v_count number;
    begin
      -- 查询并赋值给变量
      select count(1)  into v_count from emp;
      --判断打印
      if v_count > 20 then
        dbms_output.put_line('emp表中的记录数在20条以上为' || v_count);
      elsif v_count >= 10 then
        dbms_output.put_line('emp表中的记录数在10-20条之间为' || v_count);
      else
        dbms_output.put_line('emp表中的记录数在10条以下为' || v_count);
      end if;
    
    end;

    执行结果:

       select * 结果如下:

     6.2  loop循环.此处只记录loop循环的使用。 循环两个要点:1.循环变量初值,循环体中循环变量值要发生变化

    -- 循环打印1-10
    declare
      -- 声明一个循环变量并赋初值
      v_num number := 1;
    begin
      loop
        exit when v_num > 10;
        dbms_output.put_line(v_num);
        --循环变量的自增长
        v_num := v_num + 1;
      end loop;
    end;

    7.特殊的变量—— 游标,本质上是一条查询语句的结果的封装,只能往前,不能往后

    用于临时存储一个查询返回的多行数据(结果集,类似于Java的jdbc连接返回的resultset集合),通过遍历游标,可以逐行访问处理该结果集的数据

    游标使用方法:声明 打开 读取 关闭

    语法:

    游标声明:    CURSOR  游标名[(参数列表)] IS 查询语句

    游标打开:    Open 游标名;

    游标的取值: FETCH 游标名 into  变量列表;

    游标关闭:    CLOSE 游标名

    游标属性:

    %NOTFOUND 是在游标中找不到元素时返回TRUE,通常用于判断,退出循环

    7.1 不带参数的游标 示例:

    -- 使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来
    declare
      -- 声明游标
      cursor c_emp is
        select ename, sal from emp;
      --声明变量接收游标中的数据
      v_ename emp.ename%TYPE;
      v_sal   emp.sal%TYPE;
    begin
      -- 打开游标
      open c_emp;
      -- 遍历游标
      loop
        --获取游标中的数据,如果有的话就赋值给变量
        fetch c_emp
          into v_ename, v_sal;
        exit when c_emp%notfound; --c_emp%notfound 没有数据时返回true
        dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
      end loop;
    
      --关闭游标
      close c_emp;
    
    end;

    结果如下:

     7.2 带输入参数的游标:

    -- 使用游标查询emp表中某个部门员工的姓名和工资,并将其依次打印出来
    declare
      -- 声明带参数的游标,在声明时加上形参,select语句里面加上查询条件
      cursor c_emp(v_deptno emp.deptno%TYPE) is
        select ename, sal from emp where deptno = v_deptno;
      --声明变量接收游标中的数据
      v_ename emp.ename%TYPE;
      v_sal   emp.sal%TYPE;
    begin
      open c_emp(10); -- 打开游标时加上实参
      loop  -- 遍历游标
        fetch c_emp into v_ename, v_sal;  --获取游标中的数据,如果有的话就赋值给变量
        --在判断之前先获取一下数据,看有还是没有
        exit when c_emp%notfound; --c_emp%notfound 没有数据时返回true
        dbms_output.put_line('姓名:' || v_ename || ',薪水:' || v_sal);
      end loop;
      close c_emp;  --关闭游标
    
    end;

    上述游标使用语句,相当于一个匿名的函数,当测试窗口关闭,语句也就没有了,无法实现复用。如果想要在窗口关闭了之后还能使用上面那段语句,就需要存储过程了。参见下文存储过程学习记录。 

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/jijm123/p/14070279.html
Copyright © 2011-2022 走看看