• PL/SQL学习笔记_01_基础:变量、流程控制


    PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行

    在SQL窗口中运行步骤同 SQL语句

    在command  窗口中运行的步骤如下:

    1)File—new command window,出现下图

     2)输入命令:set serveroutput on    ,回车执行            

           作用:开启输出服务

    3)输入命令:ed   ,回车执行

          作用:打开PL/SQL文本编辑器,可以在此文本编辑器中写PL/SQL语句

    4)输入命令:/   ,回车执行

          作用:执行PL/SQL语句

    1.PL/SQL语法格式

    [语法格式]
    --declare
                  --声明的变量、记录类型、游标
    begin 
                  --程序的执行部分(类似于java里的main()方法)
      dbms_output.put_line('helloworld');
    --exception
                  --针对begin块中出现的异常,提供处理的机制
      --when .... then ...
      --when  .... then ...
    end;
    
                  --其中begin,end 必不可少

     

    2.变量命名规则

    3.声明变量类型

    3.1常规变量

    char,varchar2,date,number,boolean,long

    declare
      --声明变量
      v_name varchar2(25);
      v_email varchar2(25);
      v_salary number(8, 2);
      v_job_id varchar2(10);
    begin
      --通过 select ... into ... 语句为变量赋值
      --被赋值的变量与SELECT中的列名要一一对应
     select last_name, email, salary, job_id into v_name, v_email, v_salary, v_job_id
     from employees
     where employee_id = 186;
     
     -- 打印变量的值
     dbms_output.put_line(v_name || ', ' || v_email || ', ' ||  v_salary || ', ' ||  v_job_id);
    end;

    3.2记录类型

     记录类型类似于java 的类

     语法格式:

    TYPE record_type IS RECORD(
       Field1 type1 [NOT NULL] [:= exp1 ],
       Field2 type2 [NOT NULL] [:= exp2 ],
       . . . . . .
       Fieldn typen [NOT NULL] [:= expn ] 
    ) ;

    自定义记录类型示例:

    declare
      --定义一个记录类型
      type emp_record is record(
        v_name varchar2(25),
        v_email varchar2(25),
        v_salary number(8, 2),
        v_job_id varchar2(10)
    );
    --声明自定义记录类型的变量 v_emp_record emp_record; begin --通过 select ... into ... 语句为变量赋值 select last_name, email, salary, job_id into v_emp_record from employees where employee_id = 186; -- 打印变量的值 dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' || v_emp_record.v_salary || ', ' || v_emp_record.v_job_id); end;

    3.3 %type

     使用 %type 定义变量,动态的获取数据的声明类型

         定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE

    declare
      --定义一个记录类型
      type emp_record is record(
        v_name employees.last_name%type,        --使v_name的类型与employees表中last_name类型保持一致
        v_email employees.email%type,
        v_salary employees.salary%type,
        v_job_id employees.job_id%type
      );
        
      --声明自定义记录类型的变量
      v_emp_record emp_record;
    begin
      --通过 select ... into ... 语句为变量赋值
     select last_name, email, salary, job_id into v_emp_record
     from employees
     where employee_id = 186;
     
     -- 打印变量的值
     dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' ||  
                                            v_emp_record.v_salary || ', ' ||  v_emp_record.v_job_id);
    end;

    3.4 %rowtype

     PL/SQL 提供%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致

    declare
    --声明一个记录类型的变量
      v_emp_record employees%rowtype;
    begin
      --通过 select ... into ... 语句为变量赋值
     select * into v_emp_record
     from employees
     where employee_id = 186;
     
     -- 打印变量的值
     dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' ||  
                                            v_emp_record.salary || ', ' ||  v_emp_record.job_id  || ', ' ||  
                                            v_emp_record.hire_date);
    end;

    4. 变量赋值

    4.1 :=

    :=    赋值号   (赋值操作)

     =    等于       (判断操作)

    =>                 (用于参数赋值)

    语法格式:

    variable := expression ;
    --variable 是一个 PL/SQL 变量, expression 是一个 PL/SQL 表达式.

    4.2 数据库赋值

    数据库赋值是通过 SELECT语句来完成,每次执行 SELECT语句就赋值一次, 一般要求被赋值的变量与SELECT中的列名要一一对应

    如: 通过变量实现查询语句

    declare
      v_emp_record employees%rowtype;
      v_employee_id employees.employee_id%type;
    begin
      --使用赋值符号为变量进行赋值
      v_employee_id := 186;
    
      --通过 select ... into ... 语句为变量赋值
     select * into v_emp_record
     from employees
     where employee_id = v_employee_id;
     
     -- 打印变量的值
     dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' ||  
                                            v_emp_record.salary || ', ' ||  v_emp_record.job_id  || ', ' ||  
                                            v_emp_record.hire_date);
    end;

    5. 通过变量实现DELETE、INSERT、UPDATE等操作

    declare
      v_emp_id employees.employee_id%type;
    
    begin
      v_emp_id := 109;
      delete from employees
      where employee_id = v_emp_id;
      --commit;
    end; 

    6.流程控制之条件语句(2种)

    6.1  IF 语句 ;

    IF <布尔表达式>  THEN
        PL/SQL 和 SQL 语句;
    ELSIF < 其它布尔表达式> THEN
        其它语句;
    ELSIF < 其它布尔表达式> THEN
        其它语句;
    ELSE
        其它语句;
    END IF;
    
    -- ELSIF 不能写成 ELSEIF

    示例:

    /*
    要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 'salary >= 10000'; 
    若在 5000 到 10000 之间, 则打印 '5000<= salary < 10000'; 否则打印 'salary < 5000'
    
    */
    declare
         v_emp_name employees.last_name%type;
         v_emp_sal employees.salary%type;
         v_emp_sal_level varchar2(20);
    begin
         select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150;
         
         if(v_emp_sal >= 10000)   then v_emp_sal_level := 'salary >= 10000';
         elsif(v_emp_sal >= 5000) then v_emp_sal_level := '5000<= salary < 10000';
         else v_emp_sal_level := 'salary < 5000';
         end if;
         
         dbms_output.put_line(v_emp_name||','||v_emp_sal||','||v_emp_sal);
    end;

    6.2  CASE 语句

    语法格式:

    CASE selector
    WHEN expression1 THEN result1
    WHEN expression2 THEN result2
    WHEN expressionN THEN resultN
    [ ELSE resultN+1]
    END;

    示例:

    /*要求: 查询出 122 号员工的 JOB_ID, 若其值为 'IT_PROG', 则打印 'GRADE: A'; 
                            'AC_MGT', 打印 'GRADE B', 
                            'AC_ACCOUNT', 打印 'GRADE C'; 
                            否则打印 'GRADE D'
    */
    declare
           --声明变量
           v_grade char(1);
           v_job_id employees.job_id%type;
    begin
           select job_id into v_job_id
           from employees
           where employee_id = 122;
           
           dbms_output.put_line('job_id: ' || v_job_id);
           
           --根据 v_job_id 的取值, 利用 case 字句为 v_grade 赋值
           v_grade :=  
                   case v_job_id when 'IT_PROG' then 'A'
                                 when 'AC_MGT' then 'B'
                                 when 'AC_ACCOUNT' then 'C'
                                 else 'D'
                    end;
                    
           dbms_output.put_line('GRADE: ' || v_grade);
    end; 

    7.流程控制之循环语句(3种)

    7.1  LOOP 循环

    语法格式:

    declare
        --初始化条件
        v_i number(3) := 1;
    begin
        loop
             --循环体
             dbms_output.put_line(v_i);
             --循环条件
             exit when v_i = 100;
             --迭代条件
             v_i := v_i + 1;
        end loop;
    end;

    7.2 WHILE 循环

    语法格式;

    declare
           --初始化条件
           v_i number(3) := 1;
    begin
           --循环条件
           while v_i <= 100 loop
                 --循环体
                 dbms_output.put_line(v_i);
                 --迭代条件
                 v_i := v_i + 1;
           end loop;
    end; 

    示例:

    /*综合使用 if, while 语句, 打印 1 - 100 之间的所有素数
    (素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).
    */
    declare
      v_flag number(1):=1;
      v_i number(3):=2;
      v_j number(2):=2;
    begin
    
      while (v_i<=100) loop
            while v_j <= sqrt(v_i) loop
                  if (mod(v_i,v_j)=0) then v_flag:= 0;
              end if;
                 
              v_j :=v_j +1;
            end loop;
            
        if(v_flag=1) then dbms_output.put_line(v_i);
        end if;
    
            v_flag :=1;
            v_j := 2;
            v_i :=v_i +1;
       end loop;
    
    end;

    7.3  FOR 循环

    语法格式:

    FOR 循环计数器  IN  [ REVERSE ]  下限 ..  上限  LOOP
         要执行的语句;
    END  LOOP;

    示例:

    --使用for循环实现1-100之间的素数的输出
    declare
      --标记值, 若为 1 则是素数, 否则不是
      v_flag number(1) := 0;
    begin
       for i in 2 .. 100 loop
    
           v_flag := 1;     
             
           for j in 2 .. sqrt(i) loop
               if i mod j = 0 then
                  v_flag := 0;    
               end if;        
           end loop;
           
           if v_flag = 1 then
               dbms_output.put_line(i);
           end if;
           
       end loop;
    end;

    8. 标号和 GOTO

    PL/SQL GOTO 语句是无条件跳转到指定的标号去的意思。语法如下:

    GOTO label;
    . . . . . .
    <label>>       /*标号是用<< >>括起来的标识符 */

    示例:

    --打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”
    
    begin
      for i in  1..100  loop
          dbms_output.put_line(i);
          if(i = 50) then 
          goto label;
          end if;
      end loop;
          
          <<label>>
          dbms_output.put_line('打印结束');
    
    end;
  • 相关阅读:
    js函数和变量的执行顺序【易错】
    JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
    java数组与字符串相互转换、整型与字符串相互转换【详解】
    Math对象常用方法(取整细节)
    不使用临时变量互换两个变量的值
    python discover 函数介绍
    Appium+python 一个简单的登录测试实例
    IOS-优质应用推荐
    Appium+Python 自动化-appium常用元素定位方法
    Python+Selenium 自动化实现实例-单元测试报告
  • 原文地址:https://www.cnblogs.com/shirui/p/7230705.html
Copyright © 2020-2023  润新知