• oracle学习笔记(十五) PL/SQL语法结构以及使用


    PL/SQL

    简介

    • PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。
    • PL/SQL 是对 SQL 的扩展。
    • 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
    • 可用于创建存储过程、函数、触发器和程序包,给SQL语句的执行添加程序逻辑。

    作用:
    如果出现需要插入1000条数据,这些数据带有某种规律性,就可以通过PL/SQL进行增加数据的操作
    优点:

    1. 支持 SQL,在 PL/SQL 中可以使用:
      • 数据操纵命令:DML,DDL(需要动态执行)
      • 事务控制命令:TCL
      • 游标控制, 下一章学习
      • SQL函数和SQL运算符
    2. 与 SQL 紧密集成,简化数据处理。
      • 支持所有 SQL 数据类型
      • 支持 NULL 值
      • 支持 %TYPE 和 %ROWTYPE
        • %TYPE: 引用字段类型,如:employee.ename%TYPE
        • %ROWTYPE:引用表的行类型, 如: employee%ROWTYPE
    3. 支持面向对象编程 (OOP)
    4. 可移植性,可运行在任何操作系统和平台上的Oralce 数据库
    5. 更佳的性能,PL/SQL 经过编译执行

    常用数据类型

    • 数值
      number, numeric, decimal, float, int, integer, real
    • 字符串
      varchar,varchar2,string(PLSQL特有的)
    • 布尔类型boolean
    • 日期常用类型
      date, timestamp
    • 属性类型
      %type:引用某一个变量的类型或都是某个列名(字段)的类型。employee.ename%type;
      %rowtype:表示可存储某表行的记录类型。Employee%rowtype;

    变量声明以及赋值

    --赋值号为 :=
    $变量名$ [CONSTANT] $datatype$ [NOT NULL] [:= value];--赋值
    $变量名$ [CONSTANT] $datatype$ [NOT NULL] [DEFAULT expr];--默认值
    
    age int;--声明一个整型变量age,
    age int := 18;--声明age并赋值
    age int default 18;--默认age为18
    age constant int :=18;--声明整型常量age并赋值为18
    
    --声明一个与employee.ename相同类型的变量myname
    myname employee.ename%type;
    
    --声明一个变量,类型为表的行类型(相当于表中每条数据对应的实体类)
    rec_emp employee%rowtype;--employee表中的数据有多少列,rec_emp也有多少列
    
    --例子,输入员工编号,输出该员工信息
    declare
      v_empno employee.empno%type;
      rec_emp employee%rowtype;
    begin
      v_empno := &请输入员工编号;
      select * into rec_emp from employee where empno=v_empno;
      --使用 .列名 得到列的值
      dbms_output.put_line(rec_emp.empno||','
                           ||rec_emp.ename||','
                           ||rec_emp.sal||','
                           ||rec_emp.job);
    end;
    /
    
    --自定义一个新的数据类型,然后再用这个去声明变量,使用的话也是 .列名
      type TYPE_EMP_REC is record(
          empno employee.empno%type,
          ename employee.ename%type,
          sal employee.sal%type,
          job employee.job%type
      );
    
    --赋值还可以通过select into语句
    select ename into myname from employee where empno=7879;
    --多个变量,注意要两边要对应
    select ename,sal into myname,mysal from employee where empno =7879;

    基本单元框架

    [DECLARE
       --声明变量、常量、游标、自定义记录类型等。
    ]
    BEGIN
        --执行部分。
       [EXCEPTION 
           --异常处理部分。
       ]
    END;
    / --立即执行

    输出输入语句

    输出

    oracle内置有一个dbms_output对象,负责输出
    dbms_output对象有两个输出方法,一个为put,另外一个外put_line
    参数可以接收数值型

    --此方法不能立即输出,需要等待数据缓冲区满了之后或者是刷新数据缓冲区之后才会输出
    dbms_output.put('hello world');
    --下面两个任选一个即可让上面的hello world立即输出
    dbms_output.put_line('');
    dbms_output.new_line;
    
    dbms_output.put_line('hello world');--立即输出

    如果是在命令行窗口的话,没有见到输出语句,需要设置开启输出

    set serveroutput on;

    输入

    --&号在PL/SQL中作为一个替代变量,用于在运行中输入值。如果输入的是字符类型那把&号放在两个单引号中,
    --若是数字则不用单引号括起来
    v_ename := '&请输入姓名:';
    v_sal := &请输入工资;

    输入输出例子

    declare
        v_name varchar2(10) := '&输入名字';
        v_age int := &输入年龄;
    begin
        dbms_out.put_line('我是'||v_name||'年龄为'||v_age);
        --使用||连接字符串
    end;
    /

    判断与分支语句

    if判断

    --if判断
    if 表达式 then
    end if

    if-else判断

    --if-else判断
    if 表达式 then 
    --代码
    else
    --代码
    end if

    if-else if判断

    --if-else if判断
    if 表达式 then
        else if 表达式 then
        --代码
        else
        --代码
        end if
    end if  

    例子:

    --出现几个if就得出现几个end if
    declare
        v_sal employee.sal%type := &请输入工资;
    begin
        if v_sal >=5000 then
            dbms_output.put('经理');
        else if v_sal<5000 and v_sal >=3000 then
              dbms_output.put('员工');
        else if v_sal<3000 and v_sal>1000 then
            dbms_output.put('other');
        else 
          dbms_output.put('others');
        end if;
        end if;
    end if;
    dbms_output.new_line;
    end;
    /
    
    --少了elsle
    declare
        v_sal employee.sal%type := &请输入工资;
    begin
        if v_sal >=5000 then
            dbms_output.put('经理');
        else if v_sal<5000 and v_sal >=3000 then
                  dbms_output.put('员工');
        else if v_sal<3000 and v_sal>1000 then
                dbms_output.put('other');
        end if;
        end if;
        end if;
        dbms_output.new_line;
    end;
    /

    case分支语句

    --1.判断是否满足表达式
    case 
        when 表达式 then
        --代码
        when 表达式 then
        --代码
        else
        --代码
    end case;   
    
    --2.判断是否等于某个数值
    case 
        when 数值 then
        --代码
        when 数值 then
        --代码
        else
        --代码
    end case;

    数值不能能为字符串类型

    循环语句for while loop

    loop循环

    --无条件循环
    loop
        --代码以及初始化相关
        --满足条件退出当前循环
        IF 条件 THEN 
           EXIT;
        END IF;
        --或者使用 EXIT WHEN 条件
    end loop;

    while循环

    --有条件循环
    --满足条件进入循环
    while 条件 LOOP
        --初始化数值;
        --代码
        EXIT WHEN 条件; --满足条件退出循环
        --代码
    end loop;

    for循环

    --oracle会自动创建计数器变量,也就是我们的i
    --除了i,也可以起其他的名字
    
    --相当于for(i=1;i<=10;i++)
    for i in 1..10 loop
        --statement;
    end loop;
    
    --相当于for(i=10;i>=1;i--)     
    for i in reverse 1..10 loop
        --statement;
    end loop;
    
    -使用变量作为for循环的范围
    declare
      v_min integer default 1;
      v_max integer default 20;
    begin
      for i in reverse v_min..v_max loop
        dbms_output.put(i||',');
      end loop;
      dbms_output.new_line;
    end;
    /

    循环结构练习

    --遍历输出某个部门的全部员工信息
    declare
      v_deptno integer := &请输入部门号;
    begin
      for emp in (select e.* from employee e where deptno=v_deptno) loop
        dbms_output.put_line(||emp.empno||','||emp.ename||','||emp.job||','||emp.sal);
      end loop;
    end;
    /
    
    --for打印99乘法表
    begin
      --如果不在rownum,可以吗?
      for num1 in 1..9 loop
        for num2 in 1..num1 loop
          dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
          end loop;
          dbms_output.new_line;
      end loop;
    end;
    /
    
    --loop打印99乘法表
    declare
      num1 int := 1;
      num2 int;
    begin
      loop
        num2 := 1;
        loop 
          dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
          exit when num1=num2;
          num2 := num2+1;
        end loop; 
        dbms_output.new_line;
        exit when num1=9; 
        num1 := num1+1;
      end loop;
    end;
    /
    
    --while打印99乘法表
    declare
      num1 int := 1;
      num2 int;
    begin
      while num1 <= 9 loop
        num2 := 1;
        while num2 <= num1 loop
          dbms_output.put(num2||'*'||num1||'='||num1*num2||' ');
          exit when num2=num1;
          num2 :=num2+1;
          end loop;
          dbms_output.new_line;
          exit when num1=9;
          num1 := num1+1;
      end loop;
    end;
    /
  • 相关阅读:
    hadoop中常见的问题
    RedHat中敲sh-copy-id命令报错:-bash: ssh-copy-id: command not found
    【POJ2411】Mondriaan's Dream(轮廓线DP)
    【CF248E】Piglet's Birthday(动态规划)
    【BZOJ2655】Calc(拉格朗日插值,动态规划)
    【Luogu4781】【模板】拉格朗日插值
    【CF995F】Cowmpany Cowmpensation(动态规划,拉格朗日插值)
    拉格朗日插值公式
    求集合中选一个数与当前值进行位运算的max
    【HDU4471】Homework(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/chaoyang123/p/11549427.html
Copyright © 2020-2023  润新知