「笔记」Oracle Database 期末考笔记

异常

1
2
3
4
5
6
7
8
9
BEGIN
...
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('DIvision by zero');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An exception occurred');
END;
/

OTHERS 异常可处理所有异常,但必须在 EXCEPTION 块中所有特定异常之后。
遇到异常后执行完异常处理代码后,程序会退出此代码块。

过程

1
2
3
4
5
6
create or replace procedure hello
as
begin
dbms_output.put_line('Hello World!');
end;
/
1
2
3
4
5
6
7
8
9
10
create or replace procedure hello(v_employee_id in employees.employee_id%type)
as
v_salary employees.salary%type;
begin
select salary into v_salary
from employees
where employee_id=v_employee_id;
dbms_output.put_line(v_salary);
end;
/

参数模式

  • IN: 参数默认模式,过程体中不能改变 IN 参数的值
  • OUT: 只在过程体内部赋值,忽略传入值,必须为变量
  • IN OUT: 在过程体内部赋值,保留传入值,可以修改,必须为变量

执行过程

1
2
3
4
5
6
7
8
9
10
11
SQL> exec procedure_name
SQL> exec procedure_name(v_name)
SQL> exec procedure_name(:v_name) --外部变量

begin
...
procedure_name;
procedure_name(v_name);
...
end;
/

定义外部变量

1
2
SQL> variable v_name v_type
SQL> print v_name

删除过程

1
DROP PROCEDURE procedure_name;

函数

1
2
3
4
5
6
7
8
9
10
create or replace function circle_area(p_radius number)
return number
as
v_pi number := 3.1416;
v_area number;
begin
v_area := v_pi * power(p_radius,2);
return v_area;
end circle_area;
/

删除函数

1
DROP FUNCTION function_name;

触发器

DML 语句之前或之后被激活。

语句级触发器:对于整条语句只执行一次触发器过程。

行级触发器:对于每行的操作各执行一次触发器过程。

1
2
3
4
5
6
7
8
9
10
11
12
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF | FOR} trigger_even
-- 之前、之后、代替、11g复合触发器
ON table_name
[FOR EACH ROW] -- 行级触发器
[{FORWARD | REVERSE} CROSSEDITION] -- 11g
[{FORWARD | REVERSE} schema.other_trigger] -- 11g
[{ENABLE | DISABLE}] -- 11g
[WHEN tigger_condition]
BEGIN
trigger_body
END tigger_name;

trigger_even

  • UPDATE
  • INSERT
  • DELETE
  • UPDATE OF col_name
  • DELETE OR INSERT OR UPDATE OF col_name

old & new

DML OLD NEW
INSRET NULL insert value
UPDATE value before update value after update
DELETE value before delete NULL

trigger_body 内使用 oldnew 时,需加 : 使用外部变量,:old:new

禁用和启用触发器

1
2
ALTER TRIGGER trigger_name DISABLE;
ALTER TRIGGER trigger_name ENABLE;

删除触发器

1
DROP TRIGGER trigger_name;
Donate comment here