初识数据库(其他数据库对象)

视图 : 虚表

  --语法结构 :  create view 视图名 as 子查询

  --创建emp表的视图

    create view empname

    as

    select ename from emp

  --对视图进行操作需要赋予权限,要使用管理员用户操作

  --赋予权限,为scott用户解锁创建视图权限

    grant create view to scott

    select * from empname

  --创建一个视图,emp表中20部门的信息

    create view emp10

    as

    select * from emp where deptno = 10

    select * from emp10

    select * from emp10t

  --视图与表的区别

    --1、创建一个视图,视图修改,源表修改 ;源表修改,视图也修改 

    --2、创建的表是独立的,表修改,源表不修改;源表修改,表不修改

      create table emp10t

      as

      select * from emp where deptno = 10

      update emp set deptno = 10 where empno = 9527

      update emp10 set ename = 'heihei' where empno = 9527

      select * from emp10

  --覆盖

    create or replace view emp10

    as

    select ename from emp where deptno=10

  --字段别名

    create or replace view emp10

    as

    select sal*12 annsal from emp where deptno=10

    select * from emp10

  --不允许违反条件

    create or replace view emp10

    as

    select * from emp where deptno=10

    with check option

    update emp10 set deptno =20 --with check option where 子句违反

    where empno=9527

  --只读

    create or replace view emp10

    as

    select * from emp where deptno=10

    with read only

    select * FROM EMP10

多表关联视图

  create or replace view stu10

    as

    select s.scode,s.sname,c.cno,c.cname,t.tno,t.name1,t.name2

    from student s

    inner join calss c

    on(s.cno=c.cno)

    inner join test t

    on(c.tno=t.tno)

  --学生表、班级表、课程表关联

    create or replace view emp20

    as

   select s.scode,s.sname,s.sbirthday,s.ssex,c.cno,c.cname,t.tno,t.name1,t.name2 from student s inner join calss c

    on(s.cno = c.cno) inner join test t

    on(c.tno = t.tno)

  --删除视图

  --drop view 视图名

    drop view stu10

序列:一组有顺序的数列

  --表 有主键 利用序列生成有顺序的不重复的主键进行插入  5.6.7....

  --生成一个序列,要求从1001开始,每次增加1,没有最大值,不循环

  --每次缓存10个序列值

    create sequence seq_student

  --序列的起始数

    start with 1001

  --设置每次增加1

    increment by 1

  --没有最大值 

    nomaxvalue

  --没有最小值

    nominvalue

  --不循环

    nocycle

  --缓存10个

    cache 10

 

  --通过两个方法来使用

    --1、nextval  :下一个值   

    select seq_student.nextval

    from dual

  --2、currval :当前值

    select seq_student.currval

    from dual

  --序列在什么地方用 ?

  --向表中插入数据

    insert into student values (seq_student.nextval,'feier',sysdate,168,'女',2)

    select * from student

  --序列的应用范围 :

    --表、视图、insert values( ) 、update set

索引

    select * from emp

  --给学生表中的名字添加索引 :

    create index ind_student_sname on student(sname)

  --索引的优点:

    --提高执行查询的速度  -> 先排序,后折半查找

    --索引的缺点:数据量小的时候,应用索引会降低查询速度

过程:存储过程

    --建立和管理过程 : 语法结构 procedure:过程关键字

    --create or replace procedure 过程名(参数1,参数2|null) is|as  声明部分:变量名字 变量类型 ;begin sql语句部分; 输出部分 ;end ;

  --创建输出系统时间过程

    --不需要传入任何参数的过程 - 无参数过程

    create or replace procedure print_sysdate is var_date date;

    begin

    select sysdate into var_date from dual;

    dbms_output.put_line(to_char(var_date,'yyyy-mm-dd'));

    end print_sysdate;

  --在命令窗口中

    SQL> set serveroutput on;     --设置输出功能开启

    SQL> execute print_sysdate;   --执行过程

    2016-03-25

  PL/SQL 过程成功完成

 

  SQL> exec print_sysdate;    --执行单词简写

    2016-03-25

  PL/SQL 过程成功完成

 

  SQL> call print_sysdate;

    call print_sysdate

  ORA-06576: 不是有效的函数或过程名

  --call :是放到缓存中执行,用于JDBC调用过程

    --用于java程序中,虚拟机调用过程的关键字

  --有参数过程

    --调用过程的时候需要传入参数

    --根据员工的员工编号查询员工名字

    create or replace procedure print_ename(v_empno number) is v_ename emp.ename%type;

    begin

    select ename into v_ename from emp where empno = v_empno;

    dbms_output.put_line(v_ename);

    end;

过程与表与视图

  --输出参数 --按位置传递参数

    create or replace procedure print_ename(v_empno in number,v_ename out varchar) is

    begin

    select ename into v_ename from emp where empno = v_empno;

    dbms_output.put_line(v_ename);

    end;

  SQL> variable v_name varchar2(20); --创建临时变量 命名为v_name

  SQL> exec print_ename(9527,:v_name); --在输出参数前加上 : 冒号

    HUAAN

  PL/SQL 过程成功完成

  v_name

  ---------

  HUAAN

 

  --输入输出参数

    create or replace procedure get_job(var_param in out varchar) is

    begin

    select job into var_param from emp where ename = var_param;

    dbms_output.put_line(var_param);

    end;

  SQL> var v_var varchar2(20);

  SQL> exec :v_var := 'SCOTT';

  PL/SQL 过程成功完成

  v_var

  ---------

  SCOTT

 

  SQL> exec get_job(:v_var);

  ANALYST

 

  PL/SQL 过程成功完成

  v_var

  ---------

  ANALYST

 

  --按名称传递参数

    create or replace procedure get_sal(v_empno number,v_ename varchar2,v_sal out number) is

    begin

    select sal into v_sal from emp where empno = v_empno and ename = v_ename;

    dbms_output.put_line(v_sal);

    end;

  SQL> var v_sal number;

  SQL> exec get_sal(v_ename=>'SCOTT',v_empno=>'7788',v_sal=>:v_sal);

  3000

 

  PL/SQL 过程成功完成

  v_sal

  ---------

  3000

 

  --混合传递

  SQL> exec get_sal(7788,v_ename=>'SCOTT',v_sal=>:v_sal);

  3000

 

  PL/SQL 过程成功完成

  v_sal

  ---------

  3000

 

  --混合传递注意的地方:

  --1、必须先按位置传递,再按名称传递,如果先按名称传递,则其后不能再继续按位置传递

  SQL> exec get_sal(7788,v_ename=>'SCOTT',:v_sal);

 

  begin get_sal(7788,v_ename=>'SCOTT',:v_sal); end;

 

  ORA-06550: 第 1 行, 第 37 列:

  PLS-00312: 一个定位相关参数没有说明其相关性

  ORA-06550: 第 1 行, 第 7 列:

  PL/SQL: Statement ignored

 

  --drop procedure 过程名

    drop procedure get_sal

 

  purge recyclebin;清空回收站

posted @ 2016-08-25 11:30  奔跑的咖啡豆  阅读(338)  评论(0编辑  收藏  举报