程序包,引用游标,隐式游标,触发器

//程序包
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;

posted @ 2017-08-17 21:33  *眉间缘*  阅读(234)  评论(0编辑  收藏  举报