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