//程序包 CREATE OR REPLACE PACKAGE cal AS PROCEDURE addtest(a IN NUMBER, b IN NUMBER); END cal; //程序体 CREATE OR REPLACE PACKAGE BODY cal AS PROCEDURE addtest(a IN NUMBER, b IN NUMBER) AS BEGIN dbms_output.put_line(a + b); END; END cal;
利用引用游标构建的程序包 和程序体
--构建程序包 CREATE OR REPLACE PACKAGE stuinfo AS TYPE stucur IS REF CURSOR; PROCEDURE showname(scla IN NUMBER, stus OUT stucur); END stuinfo; --构建程序包体 CREATE OR REPLACE PACKAGE BODY stuinfo AS PROCEDURE showname(scla IN NUMBER, stus OUT stucur) AS BEGIN OPEN stus FOR SELECT * FROM student s WHERE s.class=scla; END; END stuinfo;
隐式游标
DECLARE BEGIN UPDATE STUDENT S SET S.SBIRTHDAY = S.SBIRTHDAY + 3650 WHERE s.class=95031; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('数据更新成功 !'); DBMS_OUTPUT.PUT_LINE(sql%ROWCOUNT); COMMIT; ELSE DBMS_OUTPUT.PUT_LINE('更新失败 !'); END IF; END;
触发器
语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次
create or replace trigger employees_trigger
after
update on employees
begin
dbms_output.put_line('修改了一条记录!');
end;
30. 使用 :new, :old 修饰符
create or replace trigger employees_trigger
after
update on employees
for each row
begin
dbms_output.put_line('old salary: ' || :old.salary || ', new salary: ' || :new.salary);
end;
31. 编写一个触发器, 在对 my_emp 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录
1). 准备工作:
create table my_emp as select employee_id id, last_name name, salary sal from employees
create table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2
2).
create or replace trigger bak_emp_trigger
before delete on my_emp
for each row
begin
insert into my_emp_bak values(:old.id, :old.name, :old.sal);
end;