• oracle语法练习


    -----------------------------------oracle语法练习 begin-----------------------------------------


    0. 准备工作:

    set serveroutput on
    
    
    hellowrold 程序
    
    
    begin
    dbms_output.put_line('hello world');
    end;
    /

    1. 使用一个变量

    declare
      --声明一个变量
      v_name varchar2(25);
    begin
      --通过 select ... into ... 语句为变量赋值
     select last_name into v_name
     from employees
     where employee_id = 186;
     
     -- 打印变量的值
     dbms_output.put_line(v_name);
    end;


    2. 使用多个变量

    declare
      --声明变量
      v_name varchar2(25);
      v_email varchar2(25);
      v_salary number(8, 2);
      v_job_id varchar2(10);
    begin
      --通过 select ... into ... 语句为变量赋值
     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. 自定义记录类型

    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;

    4. 使用 %type 定义变量

    declare
      --定义一个记录类型
      type emp_record is record(
        v_name employees.last_name%type,
        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;
    

    5. 使用 %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;

    6. 赋值符号

    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;

    7. 使用 IF ... THEN ... ELSIF ... THEN ... END IF;
    要求: 查询出 150 员工的工资, 若其工资大于 10000 则打印 'salary > 10000'; 若在 5000 到 10000 之间, 则打印 '5000< salary <= 10000'; 否则打印 'salary <= 5000'

    declare
      v_salary employees.salary%type;
    begin
      --通过 select ... into ... 语句为变量赋值
     select salary into v_salary
     from employees
     where employee_id = 139;
     
     dbms_output.put_line('salary: ' || v_salary);
     
     -- 打印变量的值
     if v_salary > 10000 then
        dbms_output.put_line('salary > 10000');
     elsif v_salary > 5000 then
        dbms_output.put_line('5000 < salary <= 10000');
     else
        dbms_output.put_line('salary <= 5000');
     end if;
    end;

    7+ 使用 case ... when 完成上面的任务

    declare
           v_sal employees.salary%type;
           v_msg varchar2(50);
    begin
           
           select salary into v_sal
           from employees
           where employee_id = 100;
           
           --case 不能向下面这样用
           /*
           case v_sal when salary > 10000 then v_msg := '>10000' 
                      when salary > 5000 then v_msg := '5000< salary <= 10000'
                      else v_msg := 'salary <= 5000'
           end;
           */
           
           v_msg := 
                 case trunc(v_sal / 5000)
                      when 0 then 'salary <= 5000'
                      when 1 then '5000< salary <= 10000'
                      else 'salary > 10000'
                 end;
           
           dbms_output.put_line(v_msg);
    end;

    8. 使用 CASE ... WHEN ... THEN ... ELSE 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 = 103;
           
           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; 


    9. 使用循环语句打印 1 - 100.


    1).

    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;

    2).

    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; 

    3).

    begin
           for i in 1 .. 100 loop
                 dbms_output.put_line(i);
           end loop;
    end;

    10. 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数(素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).

    declare
      --标记值, 若为 1 则是素数, 否则不是
      v_flag number(1) := 0;
    begin
       for i in 2 .. 100 loop
           v_flag := 1;     
             
           for j in 2 .. i - 1 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;

    11. 使用 goto

    declare
      --标记值, 若为 1 则是素数, 否则不是
      v_flag number(1) := 0;
    begin
       for i in 2 .. 100 loop
           v_flag := 1;     
             
           for j in 2 .. i - 1 loop
               if i mod j = 0 then
                  v_flag := 0;
                  goto label; --Oracle中没有continue关键字,在loop中可以用goto语句实现同样的效果。
               end if;        
           end loop;
           
           <<label>>
           if v_flag = 1 then
               dbms_output.put_line(i);
           end if;
           
       end loop;
    end; 

    -----------------------------------oracle语法练习 end-----------------------------------------

  • 相关阅读:
    HTTP 错误 404.13
    C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名
    设计模式---装饰模式(Decorator)
    设计模式---订阅发布模式(Subscribe/Publish)
    Merge into 详细介绍
    优化案例--多语句表值函数的影响
    常用脚本--Kill所有连接到指定数据库上的回话
    常用脚本--查看当前锁信息
    常用脚本--查看死锁和阻塞usp_who_lock
    常用脚本--在线重建或重整实例下所有索引
  • 原文地址:https://www.cnblogs.com/nbkyzms/p/5031431.html
Copyright © 2020-2023  润新知