oracle总结4

1.视图(view)


通过创建表的视图来表现数据的逻辑子集或数据的组合,视图是基于表或者另一个视图的逻辑表,一个视图并不包含它自己的数据,它像一个窗口,通过该窗口查看数据或改变表中的数据。
视图基于其上的表称为基表,视图是数据字典中作为一个select语句存储。


view syntax:
create or replace view view_name as
subquery;


视图有什么优势:
(1)视图能选择型显示表中的列
(2)视图可以用来构成简单的查询取回复杂的结构,用户不必知道复杂语句怎么编写

//创建视图查询雇员,薪水,电话号码
create or replace view v_emp as
select last_name || ' ' || first_name emp_name,salary+nvl(commission_pct,0)*salary salary,
phone_number from employees order by salary desc;


---查询视图v_emp
select emp_name,salary,phone_number from v_emp;


//创建视图查询部门名称,部门最低薪水,部门最高薪水,部门平均薪水


create or replace view v_salary as
select b.department_name,min(a.salary) min_salary
,max(salary) max_salary,round(avg(a.salary),2) avg_salary
from employees a
join departments b on a.department_id = b.department_id
group by b.department_name;


select * from v_salary;




2.存储过程



---tbl_name:t_errors
procedure_name:varchar2(200),主键
error_code number
error_message varchar2(200)
create_date date 默认为sysdate

syntax:
create or replace PROCEDURE procedure_name
[(parameter[,parameter,......])]
AS|IS
[local declations]

BEGIN
executable statements

[EXCEPTION

exception handlers]

END;

//输出当前系统时间

create or replace procedure  pro_output_time
is
begin
dbms_output.put_line(systimestamp);

end;

---调试存储过程

SQL> BEGIN
SQL> PRO_OUTPUT_TIME();
SQL> END;
SQL> /



SQL> set serveroutput on;
SQL> call pro_output_time();
29-AUG-14 01.11.09.428895000 AM +08:00

//根据雇员编号,输出雇员姓名,薪水

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

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

dbms_output.put_line('employee name:'||v_ename);
dbms_output.put_line('employee salary:'||v_sal);
exception
when no_data_found then
dbms_output.put_line('the employess is not exists');

end;


//通过雇员编号获取员工姓名(hr用户)


---错误表
create table t_errors(error_id number not null
,procedure_name varchar2(200)
,error_code number
,error_message varchar2(200)
,create_date date default sysdate,
constraint pk_errors_id primary key(error_id)
);


create or replace procedure pro_get_empname(v_employee_id number)

is

v_ename varchar2(50);
v_salary employees.salary%type;
v_code number;
v_errorm varchar2(200);
begin

select last_name || ' ' || first_name,salary  into v_ename,v_salary
from employees where employee_id=v_employee_id;

dbms_output.put_line('employee name is:' || v_ename || '\n');
dbms_output.put_line('employee salary is:' || v_salary || '\n');

exception when others then

v_code := sqlcode;
v_errorm := substr(sqlerrm,1,200);
insert into t_errors(error_id,procedure_name,error_code,error_message)
values(seq_errors.nextval,'pro_get_empname',v_code,v_errorm);
end;


//输入雇员编号,雇员名,薪水,部门编号,工作,向emp表中插入一条数据,存储过程名为pro_add_employee,并且要处理异常


3.函数
函数用于返回特定值,函数可以接受一个或者多个参数(in /out/in out),但是函数可执行部分必须有一个返回子句,必须在函数头部申明返回值的数据类型


create or replace function function_name(parameter list)
return datatype
is
begin
<body>
return (return_value)
 
end;


//通过雇员编号获取雇员名
create or replace function fun_get_empname(v_employee_id number)
return varchar2 is
v_empname  varchar2(50);
begin
select last_name || ' ' || first_name into v_empname
from employees where employee_id=v_employee_id;
return (v_empname);
end;

//调试

select fun_get_empname(198) from dual;


//获取当前数据库用户名那个
select user from user_users;


//根据雇员编号获取雇员工资

create or replace function  fun_get_user
return varchar2 is

v_user varchar2(50);
begin

select user into v_user from user_users;
return v_user;

end;







4.触发器(trigger)

触发器:被隐含执行的存储过程
触发器由触发事件,触发条件和触发操作三部分组成

触发事件:指引起触发器被触发的SQL语句,数据库事件或者用户事件

具体触发事件:
启动和关闭过程
oracle错误信息
用户登陆和会话断开
指定表或视图的DML操作
在任何方案上的DDL语句

触发条件:使用when字句指定一个boolean表达式

触发操作:指包含的SQL操作或者其他执行代码的PL/SQL块,不仅使用Pl/sql开发,也可以使用java和c语言开发。

触发器限制:
(1)触发器代码的大小不能超过32,大量触发器应该先建立存储过程,然后再触发器中使用。
(2)不能使用long,long raw定义变量类型


语句触发器
行触发器

触发时机(before|after)
触发事件(insert,update,delete)
触发类型(执行几次触发操作)




语句触发器:
create or replace trigger trigger_name
timing event1[or event2 or event3]
on table_name

pl/sql block;

timing触发时机(before|after)
event1[or event2 or event3]:DML语句(insert,update,delete)


if then
end if;

before触发器
//禁止工作人员周一改变雇员信息

create or replace trigger tri_change_emp
before insert or update or delete
on emp
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN') IN ('FRI') then
raise_application_error(-20001,'you can not change employee info');
end if;
end;


after触发器
//审计表上的insert,update,delete操作次数

create table t_audit(names varchar2(50)
,insert_count number
,update_count number
,delete_count number
,start_date date
,end_date date
);

create or replace trigger tri_audit_emp
after insert or update or delete
on emp
declare v_tmp number;
begin
select count(*) INTO v_tmp from t_audit where names='EMP';
if v_tmp =0 then
insert into t_audit values('EMP',0,0,0,sysdate,null);

case when inserting then
update t_audit set insert_count=insert_count + 1 where names='EMP';

when updating then
update t_audit set update_count=update_count + 1 where names='EMP';

when deleting then
update t_audit set delete_count=delete_count + 1 where names='EMP';
end case;
end if;

end;


5.package(包)
简化应用程序设计,提高应用性能,而且可以实现信息隐藏等功能


包由包头和包体组成,首先要建立包头,再建立包体。
包头用来定义公共组件。

---包头语法
create or replace package package_name
is|as

public type item declaraions
subprogram specification
end package_name;


---包体语法

create or replace package body package_name
is|as
private and item declaraions
subprogram bodies
end package_name;



//
(1)根据雇员编号,雇员名,薪水,部门编号向emp表中插入一条数据
(2)根据雇员编号获取员工薪水


##包头

create or replace package pkg_emp
is
g_deptno number := 30;
procedure pro_add_emp(v_eno number,v_ename varchar2,v_sal number,v_dno number default g_deptno);
function fun_get_sal(v_eno number) return number;

end pkg_emp;


#包体

create or replace package body pkg_emp
is

function fun_validate_deptno(v_deptno number) return boolean
is
v_temp number;


begin

select  1 into v_temp from dept where deptno=v_deptno;
return true;
exception when no_data_found then

return false;
end;


procedure pro_add_emp(v_eno number,v_ename varchar2,v_sal number,v_dno number default g_deptno)

is
begin
if fun_validate_deptno(v_dno) then
insert into emp(empno,ename,sal,deptno)
values (v_eno,v_ename,v_sal,v_dno);
else
raise_application_error(-20000, 'it is not exist deptno');

end if;
end;

function fun_get_sal(v_eno number) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=v_eno;
return v_sal;
exception when no_data_found then
raise_application_error(-20001,'empno is not exist.');


end;

end pkg_emp;
==================================

---命令行调试

SQL> variable sal1 number;
SQL> var sal1 number;
SQL>
SQL> exec :sal1 := pkg_emp.fun_get_sal(7839);

PL/SQL procedure successfully completed.

SQL> print sal1;

      SAL1
----------
      5000


=================mysql ========================================

tianxiaoyan@tianxy:~$ sudo apt-get  install mysql-server-5.5
tianxiaoyan@tianxiaoyan-HP-Pro-3380-MT:~$ sudo service mysql /?
Usage: /etc/init.d/mysql start|stop|restart|reload|force-reload|status

---mysql -uroot -pmysql -h10.10.54.58


$ mysql -uroot -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql> use mysql;----切换数据库
mysql> show tables;  ---查看当前数据库下有那些表
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.01 sec)



mysql> show create table user\G;   ---查看表结构





---下载mysql地址
dev.mysql.com






























































 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值