1应用
1.1视图:其实就是给你看数据,防止别人看的时候偷改数据不会影响到真正的数据先建表然后再建立视图这个只有查询权限的视图,目的是可以1.选择性的展示2.保证数据的及时统一(1.创建(必须要有dba权限) create 2.查询 )
1.1.1 建表
create table emp as select * from scott.emp;
1.1.2 创建只读视图
create view v_emp as select ename from with read only;
1.2索引:在表的列上构建二叉树,提高查询效率(1.单列索引,2.复合索引)
1.1.1.单列索引
create index idx_ename on emp(ename);
1.1.12复合索引
create index idx_enamejob on emp(ename,job)
select * from emp where ename=' scott' --触发单列索引
select * from emp where ename=' scott' and job ='xx'--触发复合列索引
1.3 pl/sql编程语言(编程化语言,有逻辑,有存储过程和存储函数)
1.declare
声明部分
begin
赋值
逻辑语句
end
1.3.1声明部分:
DECLARE
i number(2) := 10;
s varchar2(10) := '小明';
ena emp.ename%TYPE;---引用型变量
emprow emp%rowtype;---记录型变量(记录一行的数据封装为一个对象)
BEGIN
dbms_output.put_line(i);---输出方式
dbms_output.put_line(s);
SELECT ename INTO ena FROM emp WHERE empno = 7788;---第二种查询语句赋值加上 INTO
dbms_output.put_line(ena);
SELECT * INTO emprow FROM emp WHERE empno = 7788;
dbms_output.put_line(emprow.ename || '的工作为:' || emprow.job);
END;
1.3.2if结构
declare
声明部分
begin
赋值
逻辑语句
IF THEN
elsif THEN这里else的省略
ELSE
END IF;
end
例子:
BEGIN
IF i<18 THEN
dbms_output.put_line('未成年');
elsif i<40 THEN
dbms_output.put_line('中年人');
ELSE
dbms_output.put_line('老年人');
END IF;
IF i<18 THEN
elsif THEN
ELSE
END IF;
END;
1.4循环(三个循环while循环,exit循环(掌握),for循环)
---while循环
DECLARE
i number(2) := 1;
BEGIN
WHILE i<11 LOOP
dbms_output.put_line(i);
i := i+1;
END LOOP;
END;
---exit循环
DECLARE
i number(2) := 1;
BEGIN
LOOP
EXIT WHEN i>10;
dbms_output.put_line(i);
i := i+1;
END LOOP;
END;
---for循环
DECLARE
BEGIN
FOR i IN 1..10 LOOP
dbms_output.put_line(i);
END LOOP;
END;
1.5游标:相当于一个集合,可以存放多个对象,多行记录
1.5.1记录型变量
---输出emp表中所有员工的姓名
DECLARE
CURSOR c1 IS SELECT * FROM emp;
emprow emp%rowtype;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO emprow;
EXIT WHEN c1%notfound;
dbms_output.put_line(emprow.ename);
END LOOP;
CLOSE c1;
END;
1.5.2引用型变量
-----给指定部门员工涨工资
DECLARE
CURSOR c2(eno emp.deptno%TYPE)
IS SELECT empno FROM emp WHERE deptno = eno;
en emp.empno%TYPE;
BEGIN
OPEN c2(10);
LOOP
FETCH c2 INTO en;
EXIT WHEN c2%notfound;
UPDATE emp SET sal=sal+100 WHERE empno=en;
COMMIT;
END LOOP;
CLOSE c2;
END;
1.6存储过程:在数据库中直接编好的逻辑语句,可以直接调用
create or replace procedure 存储名(变量名 变量类型)
is
begin
plsql语句
end
例子:给指定的员工涨100
create or replace procedure p1(eno emp.empno%type)
is
begin
update emp set sal = sal+100 where empno = eno
commit;
end
---测试p1
select * from emp where empno=7788;
declare
begin
p1(7788)
end;
1.7存储函数
create or replace function 函数名(变量名 变量类型) return 返回类型(不能设置长度)
is
设置接受变量名 设置接受变量名类型
begin
pl/sql 语句
return 接受返回变量名
end
例子:年薪
create or replace function f_yearsal(eno emp.empno%type) return number
is
s number(10);
begin
select sal*12+nvl(comm,0) into s from emp where empno = eno;
return s;
end
declare
s number(10);
begin
s:= f_yearsal(7788);
dbms_output.put_line(s);
end
---存储过程和存储函数的区别
---语法区别:关键字不一样,
------------存储函数比存储过程多了两个return。
---本质区别:存储函数有返回值,而存储过程没有返回值。
1.8 out类型参数使用
----in和out类型参数的区别是什么?
---凡是涉及到into查询语句赋值或者:=赋值操作的参数,都必须使用out来修饰。
意思是有输入然后输出的变量用out,只输入没输出in,默认不用写