存储过程是一条或多条 Oracle PL/SQL 语句的集合。
PL是过程语言,提供了从if语句到循环等一切功能。
创建:使用CREATE PROCEDURE语句创建(CREATE OR REPLACE 存在则更新,不存在则创建)。
执行:EXECUTE 存储名
删除:DROP PROCEDURE 存储名
例:根据时间输出问候语
CREATE OR REPLACE PROCEDURE Greeting IS
h number;
g char(20);
BEGIN
SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP) INTO h FROM dual;
IF h>=20 OR h<=5 THEN
g := 'GOOD NIGHT'
ELSEIF h>5 AND h<=12 THEN
g := 'GOOD MORNING'
ELSEIF h>12 AND h<=17 THEN
g := 'GOOD AFTERNOON'
ELSE
g := 'GOOD EVENING'
END IF;
DBMS_OUTPUT.PUT_LINE(g);
END;
显式游标和隐式有效:
在Oracle中,每次执行SQL语句时,就会在内部创建游标,这是Oracle自身处理SQL语句的方式。这类游标称为隐式游标,与之相对的是显示游标。
使用游标:
1.在可以使用游标之前,必须先声明(定义)它。这个过程实际上不会检索任何数据,它只定义要使用的SELECT语句。
2.在声明游标之后,必须打开它以便使用。这个过程实际上将使用之前定义的SELECT语句来检索数据。
3.利用填充了数据的游标,可以根据需要获取(检索)各个行。
4.操作完成后,必须关闭游标。
创建:DECLARE CURSOR 游标名
打开:OPEN 游标名
关闭:CLOSE 游标名
例:
DECLARE
v_vend_id vendors.vend_id%TYPE;
v_vend_name vendors.vend_name%TYPE;
v_vend_address vendors.vend_address%TYPE;
v_vend_city vendors.vend_city%TYPE;
CURSOR c_vendors IS
SELECT ven_id,vend_name,vend_address,vend_city
FROM vendors;
BEGIN
OPEN c_vendors;
LOOP
FETCH c_vendors INTO v_vend_id,
v_vend_name,
v_vend_address,
v_vend_city;
EXIT WHEN c_vendors%notfound;
END LOOP;
CLOSE cursor;
END
触发器:
将由Oracle自动执行,以响应以下语句:
ALTER CREATE DROP DELETE INSERT UPDATE
创建触发器:
1.唯一的触发器名称
2.触发器将关联的表
3.触发器应该响应的动作(DELETE INSERT UPDATE)
4.何时应该执行触发器(处理前或后)
例:
//创建一个名为orders_after_insert的触发器
CREATE OR REPLACE TRIGGER orders_after_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO orders_log(changed_on,change_type,order_num) //每当orders表插入新数据,都会让日志表更新数据。
Values(SYSDATE,'A',:NEW.order_num);//:NEW.order_num 获得新的编号
END;
//AFTER INSERT ON 使得触发器将在成功地执行INSERT语句之后才执行。
//无论何时把产品添加到orders表中,都会执行BEGIN 和 END 之间的代码。
删除触发器:DROP TIGGER 触发器名
BEFORE 还是 AFTER?
通常:如果需要访问直到语句处理之后才会存在的数据,那么就要使用AFTER。对于任何数据验证和清理,可以使用BEFORE。
:NEW表/:OLD表
:NEW不是一个实际的表,但是可以在触发器内把它用作一个表,来访问新的数据。
:OLD引用一个虚拟表,只读,不能被更新。