zoukankan      html  css  js  c++  java
  • 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;
    /
  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/chaoyang123/p/11549427.html
Copyright © 2011-2022 走看看