Oracle 之 存储过程|程序包|触发器|视图|同义词

1.定义函数:统计部门编号为10的所有员工工资总和

set serverout on 
creaate or replace function fun_getSalSumByDeptno
(p_deptno number) return number
is
    v_salsum number;
begin 
    select sum(sal) into v_salsum from emp where deptno=p_deptno;
    return v_salsum;

exception
    when no_data_found then
        dbms_output.put_line('没有查询到你要寻找的数据!');
    when others then
        dbms_output.put_line('其他错误!');
end;
/

2.调用函数

set serverout on
declare
    v_deptno emp.deptno%type:=&p_deptno;
    v_salsum emp.sal%type;
begin
    v_salsum:=fun_getSalSumByDeptno(v_deptno);
    dbms_output.put_line(v_deptno||'部门下的员工工资总和为:'||v_salsum);
end;
/

3.存储过程实现:

统计某个部门编号下的所有员工工资总和
create or replace procedure proc_getSalSumByDeptno
(p_deptno in number,p_salsum out number)
is
begin
    select sum(sal) into p_salsum from emp where deptno=p_deptno;
end;

4.调用存储过程

set serverout on 
declare 
    v_deptno emp.deptno% type:=&p_deptno;
    v_salsum emp.sal%type;
begin
    proc_getSalSumByDeptno(v_deptno,v_salsum);
    dbms_output.put_line(v_deptno||'部门下的员工工资总和为:'||v_salsum);
end;
/

将有联系的对象打成包,方便使用

包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象

5.定义程序包的包头

create or replace package package_emp
is
    --定义变量
    minsal emp.sal%type;
    maxsal emp.sal%type;

    -- 定义存储过程,添加雇员信息
    procedure add_emp(p_empno number,p_ename varchar2,p_sal number,p_deptno number);

    -- 定义函数,根据员工编号查询员工工资
    function fun_getSalByEmpno(p_empno number) return number;
end package_emp;
/

只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.

6.定义程序包的包体

create or replace package package_emp
is
    -- (一) 定义存储过程,添加雇员信息
    procedure add_emp(p_empno number,p_ename varchar2,p_sal number,p_deptno number);
    is
        -- 定义一个字符串变量
        v_info varchar2(50);
    begin
        if p_sla between minsal and maxsal then
            insert into emp(empno,ename.sal,deptno) values
        (p_empno,p_ename,p_sal,p_deptno)
        returning empno||'-'||ename||'-'||sal||'-'||deptno 
        into v_info;
            dbms_output.put_line(v_info)
        else 
            dbms_output.put_line('工资不在最大值和最小值之间,不能实现添加操作!');
        end if;
    end;

    -- (二) 定义函数:根据员工编号查询员工工资
    function fun_getSalByEmpno(p_empno number) return number
    is
        --定义接受值的变量
        v_sal emp.sal%type;
    begin
        select sal into v_sal from emp where empno=p_empno;
        return v_sal;
    end;

    -- 初始化部分
    begin
        sekect min(sal),max(sal) into minsal,maxsal from emp;
end package_emp;
/

7.调用程序包的内容

set serverout on
begin
    package_emp.proc_addemp(100,'派出所'500040);
    dbms_output.put_line('添加成功!');
end;
/

8.调用程序包的内容:函数

set serverout on
declare
    v_empno emp.empno%type:=&p_empno;
    v_sal emp.sal%type;
begin
    v_sal:=package_emp.fun_getSalByEmpno(v_empno);
    dbms_output.put_line(v_empno||'的员工工资为:'||v_sal);
ebd;
/

9.快速复制表结构,但不复制表数据
create table del_emp as select * from emp where 1=2;

10.创建行级触发器:在删除 deptno!=10的数据的时候进行触发备份

create or replace trigger tr_del_emp
    before delete --触发的时机是删除前触发
    on emp
    for each row
    when old.deptno<>10
begin
     --删除前将数据插入到备份表
    insert into del_emp(empno,ename,sal,ddeptno) values
(:old.emp,:old.ename,:old.sal,:old.deptno);
end;
/

11.在删除数据时触发
delete from emp where empno=7369;

12.查看触发器的备份表
select empno,ename,sal,deptno from del_emp;

13.删除触发器
drop trigger tr_del_emp;


14.创建模式触发器备份表

create table event_ddl(
    event varchar2(20),
    username varchar2(10),
    owner varchar2(10),
    objname varchar2(20),
    objtype varchar2(20),
    time date
);

15.创建模式触发器: 操作表来讲

create or replace trigger tr_ddl
    after ddl on holly.schema
    -- 记录holly模式的所有ddl的操作
begin
    insert into event ddl values
    (ora_sysevent,
    ora_login_user,
    ora_dict_obj_owner,
    ora_dict_obj_name,
    ora_dict_obj_type,
    sysdate
);
end;
/

16.创建表时触发
conn holly/sys;

17.创建表删除表
create table temp113(id number);
drop table temp113;

18.查看模式备份表
conn scott/tiger;
select event,objname,objtype from event_ddl;


19.创建数据库级别的触发器备份表

create table log_table
(
    username varchar2(20),
    login_time date,
    logginoff_time date,
    address varchar2(20)    
);

20.创建数据库级别的触发器

create or replace trigger tr_login
after logon  on database
begin 
    insert into log_table(username,login_time,address) values
(ora_login_ser,sysdate,ora_client_ip_address);
end;
/

21.切换用户时触发数据库级别的触发器

conn holly/sys;
conn system/accp;
comm scott/tiger;

22.查看数据库级别触发器备份表
select username,login_time,address from log_table;


23.创建【视图】
create or replace view view_empdept
as
select d.dname,count(d.dname) count // 聚合函数给别名
from emp e,dept d
where e.deptno(+) = d.deptno
group by d.dname;

24.查看视图
select * from view_empdept;


25.创建公共同义词【同义词:跨用户访问
create table synonym myemp from scott.emp;

26.切换用户
conn holly/sys;

27.查看同义词
select empno,ename from myemp;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值