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-----------------------------------------

原文地址:https://www.cnblogs.com/nbkyzms/p/5031431.html